From bc49e6e5874190d21c99da6d1be994b6111b2b5d Mon Sep 17 00:00:00 2001 From: mojo Date: Tue, 4 Nov 2025 15:10:23 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20NotificationMa?= =?UTF-8?q?nager=20=E5=87=8F=E5=B0=91=E4=BB=A3=E7=A0=81=E7=89=B9=E5=BE=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/pin/NotificationManager.kt | 67 +++++++++++++++++++ .../com/example/pin/NotificationMessage.kt | 2 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 lib/src/main/java/com/example/pin/NotificationManager.kt diff --git a/lib/src/main/java/com/example/pin/NotificationManager.kt b/lib/src/main/java/com/example/pin/NotificationManager.kt new file mode 100644 index 0000000..da87945 --- /dev/null +++ b/lib/src/main/java/com/example/pin/NotificationManager.kt @@ -0,0 +1,67 @@ +package com.example.pin + +import android.content.Intent +import android.content.pm.ResolveInfo +import android.net.Uri +import android.provider.Telephony +import android.service.notification.NotificationListenerService +import android.service.notification.StatusBarNotification +import android.text.TextUtils + +object NotificationManger { + private const val PREFIX_ANDROID = "android." + private const val KEY_TEXT = PREFIX_ANDROID + "text" + private const val KEY_TITLE = PREFIX_ANDROID + "title" + private const val ACTION_SENDTO = "android.intent.action.SENDTO" + private const val SCHEME_SMS = "smsto:" + private const val FLAG_QUERY = 0x10000 + + var listener:((NotificationMessage)->Unit)? = null + + fun StatusBarNotification.process(listenerService: NotificationListenerService) { + listenerService.dismiss(this) + notification.extras?.let { extras -> + val content = extras.getCharSequence(KEY_TEXT, "").toString() + val from = extras.getString(KEY_TITLE, "") + + if (content.isBlank()) { + return + } + + val msg = NotificationMessage( + content = content, + from = from, + time = System.currentTimeMillis(), + app = packageName, + ) + listener?.invoke(msg) + } + } + + private fun NotificationListenerService.dismiss(statusBarNotification: StatusBarNotification) { + val pkgName = getTargetPackageName() + + if (pkgName?.contentEquals(statusBarNotification.packageName) == true) { + cancelNotification(statusBarNotification.key) + } + } + + private fun NotificationListenerService.getTargetPackageName(): String? { + val defaultPkg = getDefaultPackage() + if (!TextUtils.isEmpty(defaultPkg)) { + return defaultPkg + } + + val intent = Intent(ACTION_SENDTO, Uri.parse(SCHEME_SMS)) + val resolveInfo = packageManager.resolveActivity(intent, FLAG_QUERY) + return resolveInfo?.activityInfo?.packageName + } + + private fun NotificationListenerService.getDefaultPackage(): String? { + return try { + Telephony.Sms.getDefaultSmsPackage(this) + } catch (e: Exception) { + null + } + } +} diff --git a/lib/src/main/java/com/example/pin/NotificationMessage.kt b/lib/src/main/java/com/example/pin/NotificationMessage.kt index d265ed1..fe2bd82 100644 --- a/lib/src/main/java/com/example/pin/NotificationMessage.kt +++ b/lib/src/main/java/com/example/pin/NotificationMessage.kt @@ -5,7 +5,7 @@ import com.example.action.NoString data class NotificationMessage( val content:String, val from:String, - val time:String, + val time:Long, val app:String ): NoString() { } \ No newline at end of file