From 60183626564121efab57bd3f592a7e2daa347290 Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Mon, 29 Dec 2025 16:56:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=80=9A=E7=9F=A5=E6=A1=86?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../newUtil/NotificationConfig.kt | 14 +++ .../notification/newUtil/NotificationDatas.kt | 59 ++++++++++++ .../notification/newUtil/NotificationUtil.kt | 68 +++++++------ .../timing/NotificationTimingController.kt | 91 +++++++++++++----- .../res/mipmap-xxhdpi/icon_bg_withdraw.webp | Bin 0 -> 6956 bytes .../src/main/res/values-pt/strings.xml | 10 ++ notification/src/main/res/values/strings.xml | 8 ++ 7 files changed, 198 insertions(+), 52 deletions(-) create mode 100644 notification/src/main/java/com/remax/notification/newUtil/NotificationConfig.kt create mode 100644 notification/src/main/java/com/remax/notification/newUtil/NotificationDatas.kt create mode 100644 notification/src/main/res/mipmap-xxhdpi/icon_bg_withdraw.webp diff --git a/notification/src/main/java/com/remax/notification/newUtil/NotificationConfig.kt b/notification/src/main/java/com/remax/notification/newUtil/NotificationConfig.kt new file mode 100644 index 0000000..cfa8349 --- /dev/null +++ b/notification/src/main/java/com/remax/notification/newUtil/NotificationConfig.kt @@ -0,0 +1,14 @@ +package com.remax.notification.newUtil + +import android.content.Intent + +class NotificationConfig(val notificationId: Int = System.currentTimeMillis().toInt(), + val channelId: String, + val channelName: String, + val title: String, + val content: String, + val smallIcon: Int, + val intent: Intent? = null, + val useFullScreenIntent: Boolean = false, + ) { +} \ No newline at end of file diff --git a/notification/src/main/java/com/remax/notification/newUtil/NotificationDatas.kt b/notification/src/main/java/com/remax/notification/newUtil/NotificationDatas.kt new file mode 100644 index 0000000..88615bd --- /dev/null +++ b/notification/src/main/java/com/remax/notification/newUtil/NotificationDatas.kt @@ -0,0 +1,59 @@ +package com.remax.notification.newUtil + +import android.app.PendingIntent +import android.content.Intent +import com.ama.core.architecture.util.ResUtil +import com.remax.notification.R +import java.util.concurrent.ConcurrentHashMap + + +object NotificationDatas { + + // notifi type + const val NOTI_TYPE_BG_WITHDRAW = "NOTI_TYPE_BG_WITHDRAW" + const val NOTI_TYPE_BG_RANDOM = "NOTI_TYPE_BG_RANDOM" + const val NOTI_TYPE_RESIDENT = "NOTI_TYPE_RESIDENT" + const val NOTI_TYPE_UNLOCK = "NOTI_TYPE_UNLOCK" + + // notifi id + const val NOTI_ID_TYPE_BG_WITHDRAW = 666 + const val NOTI_ID_TYPE_BG_RANDOM = 667 + const val NOTI_ID_TYPE_RESIDENT = 668 + const val NOTI_ID_TYPE_UNLOCK = 669 + + // channelId type + const val CHANNEL_TYPE_BG_WITHDRAW = "CHANNEL_TYPE_BG_WITHDRAW" + const val CHANNEL_TYPE_BG_RANDOM = "CHANNEL_TYPE_BG_RANDOM" + const val CHANNEL_TYPE_RESIDENT = "CHANNEL_TYPE_RESIDENT" + const val CHANNEL_TYPE_UNLOCK = "CHANNEL_TYPE_UNLOCK" + + // channelId name + const val CHANNEL_TYPE_BG_WITHDRAW_NAME = "CHANNEL_TYPE_BG_WITHDRAW_NAME" + const val CHANNEL_TYPE_BG_RANDOM_NAME = "CHANNEL_TYPE_BG_RANDOM_NAME" + const val CHANNEL_TYPE_RESIDENT_NAME = "CHANNEL_TYPE_RESIDENT_NAME" + const val CHANNEL_TYPE_UNLOCK_NAME = "CHANNEL_TYPE_UNLOCK_NAME" + + + private val mConfigList: ConcurrentHashMap = ConcurrentHashMap() + + + init { + mConfigList.put(NOTI_TYPE_BG_WITHDRAW, NotificationConfig( + NOTI_ID_TYPE_BG_WITHDRAW, + CHANNEL_TYPE_BG_WITHDRAW, + CHANNEL_TYPE_BG_WITHDRAW_NAME, + ResUtil.getString(R.string.title_bg_withdraw), + String.format(ResUtil.getString(R.string.content_bg_withdraw), 50), + R.mipmap.icon_bg_withdraw, + null, + true, + )) + } + + + + fun getConfigForType(notifiType: String): NotificationConfig? { + return mConfigList[notifiType] + } + +} \ No newline at end of file diff --git a/notification/src/main/java/com/remax/notification/newUtil/NotificationUtil.kt b/notification/src/main/java/com/remax/notification/newUtil/NotificationUtil.kt index 1c17cd5..fdec4c5 100644 --- a/notification/src/main/java/com/remax/notification/newUtil/NotificationUtil.kt +++ b/notification/src/main/java/com/remax/notification/newUtil/NotificationUtil.kt @@ -9,8 +9,10 @@ import android.graphics.Color import android.os.Build import android.widget.RemoteViews import androidx.annotation.RequiresApi +import androidx.annotation.RequiresPermission import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import com.ama.core.architecture.BaseApp import com.ama.core.architecture.util.permission.PermissionUtil class NotificationUtil private constructor() { @@ -25,15 +27,14 @@ class NotificationUtil private constructor() { } } - private lateinit var context: Context - private lateinit var notificationManager: NotificationManager + private val context = BaseApp.appContext() + private var notificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager /** * 初始化工具类 */ fun init(context: Context) { - this.context = context.applicationContext - notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + } /** @@ -75,7 +76,7 @@ class NotificationUtil private constructor() { .setPriority(NotificationCompat.PRIORITY_DEFAULT) .build() - showNotification(notificationId, notification) + showNotification(notificationId, notification, "name") } /** @@ -108,7 +109,7 @@ class NotificationUtil private constructor() { .setAutoCancel(true) .build() - showNotification(notificationId, notification) + showNotification(notificationId, notification, "name") } /** @@ -142,7 +143,7 @@ class NotificationUtil private constructor() { .setAutoCancel(true) .build() - showNotification(notificationId, notification) + showNotification(notificationId, notification, "name") } /** @@ -167,7 +168,7 @@ class NotificationUtil private constructor() { .setAutoCancel(true) .build() - showNotification(notificationId, notification) + showNotification(notificationId, notification, "name") } /** @@ -204,7 +205,7 @@ class NotificationUtil private constructor() { builder.addAction(action.smallIcon, action.title, actionPendingIntent) } - showNotification(notificationId, builder.build()) + showNotification(notificationId, builder.build(), "name") } /** @@ -240,7 +241,7 @@ class NotificationUtil private constructor() { .setNumber(lines.size) // 显示消息数量 .build() - showNotification(notificationId, notification) + showNotification(notificationId, notification, "name") } /** @@ -277,7 +278,7 @@ class NotificationUtil private constructor() { .setCustomContentView(remoteViews) // 设置自定义视图 .build() - showNotification(notificationId, notification) + showNotification(notificationId, notification, "name") } @@ -295,21 +296,19 @@ class NotificationUtil private constructor() { * @param useFullScreenIntent 是否使用全屏意图(来电等高优先级场景) * @param notificationId 通知ID */ - fun showHeadsUpNotification( - channelId: String, - channelName: String, - title: String, - content: String, - smallIcon: Int, - intent: Intent? = null, - useFullScreenIntent: Boolean = false, - notificationId: Int = System.currentTimeMillis().toInt() - ) { - // 1. 确保初始化 - if (!this::context.isInitialized) { - throw IllegalStateException("NotificationUtil must be initialized first") - } + fun showHeadsUpNotification(notifiConfig: NotificationConfig) { + val notificationId = notifiConfig.notificationId + val channelId = notifiConfig.channelId + val channelName = notifiConfig.channelName + val title = notifiConfig.title + val content = notifiConfig.content + val smallIcon = notifiConfig.smallIcon + val intent = notifiConfig.intent + val useFullScreenIntent = notifiConfig.useFullScreenIntent + + + // 1. 确保初始化 val builder = NotificationCompat.Builder(context, channelId) // 2. 设置通知基本内容 @@ -348,7 +347,7 @@ class NotificationUtil private constructor() { } // 6. 发送通知 - showNotification(notificationId, builder.build()) + showNotification(notificationId, builder.build(), "name") } /** @@ -400,12 +399,13 @@ class NotificationUtil private constructor() { - private fun showNotification(notificationId: Int = System.currentTimeMillis().toInt(), notification: Notification) { - + private fun showNotification(notificationId: Int = System.currentTimeMillis().toInt(), + notification: Notification, + channelName: String) { if (!isNotificationsEnabled()) { PermissionUtil.checkPermission(Manifest.permission.POST_NOTIFICATIONS, object : PermissionUtil.ICallback() { override fun onAllGranted() { - NotificationManagerCompat.from(context).notify(notificationId, notification) + doShowNotification(notificationId, notification, channelName) } override fun onPartialGranted() { @@ -415,10 +415,18 @@ class NotificationUtil private constructor() { } }) } else { - NotificationManagerCompat.from(context).notify(notificationId, notification) + doShowNotification(notificationId, notification, channelName) } } + @RequiresPermission(Manifest.permission.POST_NOTIFICATIONS) + private fun doShowNotification(notificationId: Int = System.currentTimeMillis().toInt(), notification: Notification, channelName: String) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createNotificationChannel(notification.channelId, channelName, NotificationCompat.PRIORITY_HIGH) + } + NotificationManagerCompat.from(context).notify(notificationId, notification) + } + /** * 检查通知权限 diff --git a/notification/src/main/java/com/remax/notification/timing/NotificationTimingController.kt b/notification/src/main/java/com/remax/notification/timing/NotificationTimingController.kt index f0d4e85..4003db7 100644 --- a/notification/src/main/java/com/remax/notification/timing/NotificationTimingController.kt +++ b/notification/src/main/java/com/remax/notification/timing/NotificationTimingController.kt @@ -21,6 +21,9 @@ import com.remax.base.report.DataReportManager import com.remax.notification.config.NotificationConfigController import com.remax.notification.controller.NotificationTriggerController import com.remax.notification.check.NotificationCheckController +import com.remax.notification.newUtil.NotificationDatas +import com.remax.notification.newUtil.NotificationDatas.NOTI_TYPE_BG_WITHDRAW +import com.remax.notification.newUtil.NotificationUtil import com.remax.notification.utils.NotiLogger import com.remax.notification.utils.FCMTopicManager import com.remax.notification.service.FCMService @@ -245,6 +248,28 @@ class NotificationTimingController private constructor() : LifecycleObserver { triggerNotificationIfAllowed(NotificationCheckController.NotificationType.UNLOCK) } + + /** + * 释放资源 + */ + fun release() { + try { + screenReceiver?.let { receiver -> + context?.unregisterReceiver(receiver) + screenReceiver = null + } + + ProcessLifecycleOwner.get().lifecycle.removeObserver(this) + + isInitialized.set(false) + context = null + + NotiLogger.d("通知时机控制器已释放") + } catch (e: Exception) { + NotiLogger.e("释放通知时机控制器失败", e) + } + } + /** * 通用通知触发方法 * @param type 通知类型 @@ -258,10 +283,12 @@ class NotificationTimingController private constructor() : LifecycleObserver { NotificationCheckController.NotificationType.RESIDENT -> "" } DataReportManager.reportData("Notific_Pull", mapOf("topic" to "localPush")) + + - // 检查是否可以触发通知,并获取具体的拦截原因 + /*// 检查是否可以触发通知,并获取具体的拦截原因 val checkResult = NotificationCheckController.getInstance().canTriggerNotificationWithReason(type) - if (/*!checkResult.first*/false) { + if (*//*!checkResult.first*//*false) { val blockReason = checkResult.second val reasonString = blockReason?.reason ?: "unknown" val reasonDescription = blockReason?.description ?: "未知原因" @@ -277,28 +304,48 @@ class NotificationTimingController private constructor() : LifecycleObserver { NotificationTriggerController.triggerGeneralNotification(type){ NotificationCheckController.getInstance().recordNotificationTrigger(type) NotificationCheckController.getInstance().incrementNotificationCount() + }*/ + + when (type) { + NotificationCheckController.NotificationType.UNLOCK -> { + //showNotifyUnlock() + } + + NotificationCheckController.NotificationType.BACKGROUND -> { + showNotifyWithdraw() + //showNotifyRandom() + //showNotifyResident() + } + + + NotificationCheckController.NotificationType.KEEPALIVE -> { + + } + + NotificationCheckController.NotificationType.FCM -> { + + } + + NotificationCheckController.NotificationType.RESIDENT -> { + + } + } + + + + + + + } + + + + + private fun showNotifyWithdraw() { + NotificationDatas.getConfigForType(NOTI_TYPE_BG_WITHDRAW)?.let { + NotificationUtil.getInstance().showHeadsUpNotification(it) } } - /** - * 释放资源 - */ - fun release() { - try { - screenReceiver?.let { receiver -> - context?.unregisterReceiver(receiver) - screenReceiver = null - } - - ProcessLifecycleOwner.get().lifecycle.removeObserver(this) - - isInitialized.set(false) - context = null - - NotiLogger.d("通知时机控制器已释放") - } catch (e: Exception) { - NotiLogger.e("释放通知时机控制器失败", e) - } - } } diff --git a/notification/src/main/res/mipmap-xxhdpi/icon_bg_withdraw.webp b/notification/src/main/res/mipmap-xxhdpi/icon_bg_withdraw.webp new file mode 100644 index 0000000000000000000000000000000000000000..1775be75f5d1a44a309a09cd79442a85e1fc374a GIT binary patch literal 6956 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 个文件 清理 恢复 + + + + + + + Hey there! + Don\'t miss your R$ %d, Tap to withdraw! + + \ No newline at end of file diff --git a/notification/src/main/res/values/strings.xml b/notification/src/main/res/values/strings.xml index 5ecb14b..f72f723 100644 --- a/notification/src/main/res/values/strings.xml +++ b/notification/src/main/res/values/strings.xml @@ -9,4 +9,12 @@ Service is running GO + + + + Olá! + Não perca seus R$ %d. Toque para sacar! + + + \ No newline at end of file