From 04f158e4fa4f9e81a7e8f4e0d2d984a112452b31 Mon Sep 17 00:00:00 2001 From: Jonas L Date: Mon, 11 Mar 2019 00:00:00 +0000 Subject: [PATCH] Extend notification filter for music players --- .../platform/android/NotificationListener.kt | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/timelimit/android/integration/platform/android/NotificationListener.kt b/app/src/main/java/io/timelimit/android/integration/platform/android/NotificationListener.kt index 9349740..832cc7c 100644 --- a/app/src/main/java/io/timelimit/android/integration/platform/android/NotificationListener.kt +++ b/app/src/main/java/io/timelimit/android/integration/platform/android/NotificationListener.kt @@ -35,12 +35,14 @@ import io.timelimit.android.logic.* class NotificationListener: NotificationListenerService() { companion object { private const val LOG_TAG = "NotificationListenerLog" + private val SUPPORTS_HIDING_ONGOING_NOTIFICATIONS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O } private val appLogic: AppLogic by lazy { DefaultAppLogic.with(this) } private val blockingReasonUtil: BlockingReasonUtil by lazy { BlockingReasonUtil(appLogic) } private val notificationManager: NotificationManager by lazy { getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager } private val queryAppTitleCache: QueryAppTitleCache by lazy { QueryAppTitleCache(appLogic.platformIntegration) } + private val lastOngoingNotificationHidden = mutableSetOf() override fun onCreate() { super.onCreate() @@ -58,9 +60,23 @@ class NotificationListener: NotificationListenerService() { runAsync { val reason = shouldRemoveNotification(sbn) - if (reason != BlockingReason.None) { + if (reason == BlockingReason.None) { + if (sbn.isOngoing) { + lastOngoingNotificationHidden.remove(sbn.packageName) + } + } else { val success = try { - cancelNotification(sbn.key) + if (sbn.isOngoing && SUPPORTS_HIDING_ONGOING_NOTIFICATIONS) { + // only snooze for 5 seconds to show it again soon + snoozeNotification(sbn.key, 5000) + + if (!lastOngoingNotificationHidden.add(sbn.packageName)) { + // skip showing again a notification that it was blocked + return@runAsync + } + } else { + cancelNotification(sbn.key) + } true } catch (ex: SecurityException) { @@ -112,7 +128,11 @@ class NotificationListener: NotificationListenerService() { } private suspend fun shouldRemoveNotification(sbn: StatusBarNotification): BlockingReason { - if (sbn.packageName == packageName || sbn.isOngoing) { + if (sbn.packageName == packageName) { + return BlockingReason.None + } + + if (sbn.isOngoing && (!SUPPORTS_HIDING_ONGOING_NOTIFICATIONS)) { return BlockingReason.None }