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
zcmbtZXIK+Yx8FeMML?>wfFRXKM|wb{iGmoVh2EqKL69a?V(z=$Xwjlc6J
zmWjzT7XWS^0stxc-*vVr08kqa0PIu$t`o=xfJI^
z)|ce~fE(Ivj0|*7`Em&$^Douh@d6pRvksm2V-}BN+^1_+dTR>(m1^8Sx=;K1DP%CF
zFuvOjnXi%xv4{7k2F};Gr`5Q-oA(yfl-b-JbeOI=nsYjun^+E}7*E-BD3>j@d5W7e
z`#8x~!{B^mQUUC2vTx)NTlM3CCkF_|do0#|CB$PN3Dw9e#Rf9*h
z>t?ngV{~oTkmS~2S#*gEjwv6GafSbQl2Zm-(-jX34KmKs`fFd;C-b4sARe*WQ&M
zyjdoA>^e7Fm^FrwYeKtBuK|lb=5+^
zj#mY8`BKmVk^6KDm+$ni`sf8h&Gvm18QBD(UxiqmeqV4F#r_OP8O9rl$3p}JNQ-&K
zm(I(f&wiH{ZnR$TIB~!HdcOP7>P9W%q`T2%KuMtR1vsDj^$}u2sU0K5_e25nBcgxD
zMkerXo&Z+
z($4d0hRyJh^R@Y{s86tt{~{&4vREQTRSHU-@f9E#u}+
zBy#&1ZoEkGSZc|>m>L#!^C6e=x6B7b3B8Zreox04T0{fX!;`sF~f^Fi9~?1xF$>|;1NBEPTy+hO<-Lf*@MJd?(nK(*DHV>|j#H2$w{
zE0q3vz^g#0tmVDH5Snpu>S+8sKRSe6fSd5zb0$7BK-G3z*D*bSn#-g0^N{3~rQMk>&t@=z*VG@svfpjHj*c9{Q0btbpJsVd(iq49h>;d0*;fSSDv}gLhE}9<{w#HOEg2I^
z$C>x~YE^v~l|&WdT5Q5$8aFf2K*I1DcKDC+1S!b-;mLGp)*L)`vk}56kPXu>m#B}Z
z2RdGbRyLCrfA^Kv&QZ)&t^2UHnyNR-9qwWbzX1aQS#lbf-?pU_Qxoo1Lx0l8Jh}8b
zIHt{$%`z}I^f6q@y-Q{s^K=j}^($u1X?em%yMbo_&b)l4b&52qvc4~i7XQtVs6ebV
zRr*{a3{dT0i7N^wFMmIfB-KfNCt>$NwXUXmx>nNriCwshNC_L}E~{DOYlF*KHHsNk
zA0CA`dv6-&>yp^`gxCZ)xZ3!VNP302C*{h40g>e+B`h>>&gERJGbYgmZ)s{{v*W(P3vFS2rCwZeuKIFo_XBd&+OPYkAhs7NXgbh
zhi86A{J4&JKd#*I3c#W^#N{vXp7)!pNgwZ|7>gsjm8*BVmH7KFMMMKsS+)TM094yS
zIckk8D@p-?iK0>*w-tRe{Il0qi_|~pCCF>Olc0deVuj%}iMtxL%^=C@DK|B>f_e>&
zl9t;Ztw%rG$Cvs1KVQpet-tL-bPHsiGq$6i%+mKQL>F18ghd>l_%G*dtC=_i&A2>@
z+mB!X_@cnfNSy*jv&a40yHr`p7A}(B41o1P8vWSWgbI(Bazi@MtH-5k$gdf$z`@2s
zQVnN$;*g>Hd}TGc#$WhnKA
zmpa_;o<_vjx6|+4d0@JpPeChl1{>bRY5)o?+OWyQ*5!a9O-c$9#iI43?mYDwNzF*>
z0nNDj7PdS|S>IB;e(#5No;=}*HMYqcp6Q@RM)W=O#Q;_?Nqa;bJS%souJcv=`l*VV
z@8E=d&?bImtM9d3d1h->0t;}NxtSHEfUu;L1Rxkp;3vrqS{1{jK7M@Y!QH7Tb!-d;LaGgo*%9bANVB6_4pAM<>!hLTC{q|2PuQl(I_zS?A9-yqW{^k%Q$|Nj8B@8`1RQ2zxm6sn-
z-Je<N*dKiQ~j$w-N5~$`yBvVPz%d*_&fh7l`3}ey2z)4R?9C$En_+M_*Xm7%X}M%?
z+iHy?UsM=Jv3Ouc=XlVSIxds}jEN=;-eKfcs|NO>S%U*)#qM+^Iba}6*b#CXbDz@4
z@_Qjkfz(`L`L2;p7lL}M4I#JTr*3a3^UeHz^U?!0+xJB^a15-oi!v&OAw~cI92i8*
zJ=LlB`z4_UuEK(0a11CJ6y%bBO>&aCby=$3fX*;eTzR8espL{@583DKPL{2vO*RPX
zhhl$5AHcvwjJR)WL1JGm4hs&OG4qvB@PUYaU#BbDAO=p{Azfvmgz-zZagj-r=2cHm
z$kzB7LD5PcgcJstX-*Y5wNJn^E-GO}g5>s>3oJmLDaMnM$B_sA(^wuZq
zI|psc0}cQTL~f|F>;ikIp5O2u{YXzEJgko~H@RcR!QI~5;VLxOFcG1lqwk*>D%CAD
zEFfo?dJmx`3iSgtNQ_4dS?wfZOhw69zf7^gtC8aZ7+q;7speB5Q2x7!FJq~b?3-mv
zx{)NEw=w;m`q#Oy{JDPn>G!r(Hc7SG;mj1>PoIP)kBYW1zq|#uQ7sz*)qYouB4H$N
z#=QNq*BHns@Bi{
zDW;T|S~8!$p-^c+jr`vGbB;7KV_hs<@xN;X=>$St6i+^2gq{pF6M-!S9c>&7rU0
z#GPB*3%Plvrh$U&I~3>@t40D@rW`8-m`SxyJEOV|%93o-b)ot23d-b}#^BM9
z(rB39$yg)LDqP7)E;SIRWzC%2u`CR~&+Xn1-PF6PzM5wOL(
zgBS9!$V=RRRV;EKhpt=HZ(Q1h2ogPC4H0J2W
zN-x`h-*2fgFGvD3>hvqqWluTzs39zr05LG9<~p5rdcG;G)>P#f!uN*Qi^AU5!%tG{
z)E46inD=b#$^P$I%y$Ns5eyf0WWzmrt9(<*iwiBa`7-yB
z=d6DRS;)oAjixo6ylhKroS6Swl5E5{E>{5^St-+%Odixh4-kb+R~f07s%Ble`HU-@R)phP1!B-
z`eUbx-L*rd%wdrvLa8jh2UzET^YSVJIyP*7c7h~Y4zow&DXXI<^`5z2KY|OPCtH3O
z(+@0LV+)&~t1ME8E&pkA*gHLqv~;Z*N|_193nr=hR8x4|biG?ofg%BsedW@&yjiZA
z4Dj(ouQ34?hT9iszg=<1P84*j7h(D=v{c^mQ)EBnpL*5?`UY&=;Kbfj=^B#8C76lJ
z3MKBwDbyh9?cF>#7l!jjJcf%o2Pjx=iwlQO3=joU9Lh@=UCvs+(rHr;C4@6AYt%y!
zkUg4uz&V_nh7spVMaGLUN9g|<{bWMl8$Wrp&xXMF
z93GhE$)qyH|7seKO^ju2D4mqWrT>!ZaxoN5(-;#-RDH@9`9NG&i8libuqPyk3o~K)
zK?y=t8BT*D28wNkx~;3s04#kyReC_}xO+c-j0^s~!sjztzxa5_?!f5a`B5Kl(8Y%?
zu`KFd1{PSYiu2KXi~}B@ojsAh%%ZR96I=B8
zp{-+>0U0>(b3RJM*)LD;+<$87q)4A*2ojHcSwDi`jU6L`*)+Je!L1%_DcU-rcOV
zJea(pj4$w;xU!xGOOE%FT=%J23l)@B8pyy^;O;g4x>%2V6K7=D#&xesi)%+lGIZg$
zGdPzro82aiYGpuE)7Tmd;gc>-&NJ-lm{)OFUw(t(OZ0I4IKK)J0Qr>6j)v@P?YEM%
zT2oCaEAY&|m7Ix*sok6n8Z>3&J>FuQ-|OBM&-V{BBpY%!nEc~5MsZbGX)qHP>36Sw
zt9^Ys9^+vZOJrNEQDf>XAM_|oO=@+Q{BD5JE
zwoRUOI(lYs>PNOOdNgQ##A5$>F$Fu3cXpYa4&&74s((*ue`vdDIg__3s3>^X7sbri
zFn<21s@9M@2DQ0zFQM292$YcbP!Yzg^NwYIqRs5OyyWFm$)hfWyAAPfZ
zb3R3M?$^l4-Ce7!(?1<8O6EM=p?K*cm@E3@Scs<6>ca|PwCaZP!tZVT_DMORr^@Qg
zT9E$jJ5dbL>s|NwJZz;|Rcr0IKNdWAy6-s~+^0LC>SK{H0NIR*Q_;6deb8tm?)27w
zF~Lq%^`p!taRpDpW5OqOi3fzaX-O-=>mfJ%_hZs(n?FTN@_)-FuMf(?+=WTMrpB}%
zM3gpK9!^~1#jP37;~PE23p=j%Yb;!qY^@kuy%fC{+x@0#ZFLP%>ix#J
z(pgJsQXL<~Dxw4|KVD|nVPR@^@&EPEcx$h0bWr)&O@d6iqK@o(k55ku*e9F(jpDTy
z1lRE&Le}Bg%G{oDck5ARR#RCjeXOJ(3La4UeQ7FZ>WNH)n&|sb+sT-1o@W@&!UMBV
zOIL~J&)y3^%SgL@`>#W*S6JVtl4i?fj8VkrY>gjpO^x>jemkO16sp>@ccd4FA$+9!
z%-={)(=r;-{5>OUSRNn?IXT`fS3HZSNMG!`Y9|4bHWXrRn!5UBP|Kg^QQMTQ{}POG
zU7Hu*y2<-&@8b>bO++2tNH^cF%bWG?TMADf7b!hHV2g6_N?ChMUb#4PTTGGYYQU;b
z_i2bb_ZWuccpxlHM@3$Bw|n~>=iu4kh4(dnL3I;wRJfKfPXRVTaj@eg>;2c|CeE?5
zg{@}}wdcQ@Yf3MU?tl2i0pfdI7x^bqHz!x|%8!V<{!+pQSETFP@=aWPGX_45{vm#R
zt&EU@CTIo5{v=3>XI^s$mygLbff+XkP>Omx7);9=T*
z&H!ubYt}PYxOqc|kH)M#16Dfb>j>}ewAP2@{Pd8fjn0RIbX3k_B%~X^fXH-O&IBRlTION93$kr_9=C&QZqcw@6^)9)LF1xs-z~eTO=yp*P
zGFRNzoDXidHSlmHGw3wSSB0>p*3g0N65ASjypeIuCYC55G+Kff^dZBFOj@)Apk1^O
z##|Eg$1Q!|3$@ACakU#Q0a;e(E6v(jG@=zn)>B=~7Y!%!<-E7}ZuPzPY*wv%a{dr-^P4oK4Rt&)JhO$z+3MO%s 个文件
清理
恢复
+
+
+
+
+
+
+ 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