From 51e9370dd5a2756cc4d78d0e2e92f49eddb6301f Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Tue, 4 Jan 2022 22:22:14 +0100 Subject: [PATCH] Add notification permission to PermissionsManager --- i18n/src/main/res/values-de/strings.xml | 1 - i18n/src/main/res/values/strings.xml | 1 - notifications/build.gradle.kts | 1 + .../notifications/NotificationService.kt | 7 +++++ permissions/build.gradle.kts | 1 + .../permissions/PermissionsManager.kt | 31 ++++++++++++++++++- .../ui/legacy/activity/LauncherActivity.kt | 13 -------- 7 files changed, 39 insertions(+), 16 deletions(-) diff --git a/i18n/src/main/res/values-de/strings.xml b/i18n/src/main/res/values-de/strings.xml index 3e3fa1d2..0df9825d 100644 --- a/i18n/src/main/res/values-de/strings.xml +++ b/i18n/src/main/res/values-de/strings.xml @@ -177,7 +177,6 @@ Systemleisten Dunkle Statusleisten-Symbole Dunkle Navigationsleisten-Symbole - Bitte aktivieren Sie den Benachrichtigungszugriff für diese App (wird benötigt um die Musik-Wiedergabe zu steuern) Musik In Kontakte-App anzeigen An Favoriten anheften diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index 12461065..749ef5b3 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -222,7 +222,6 @@ System bars Dark status bar icons Dark navigation bar icons - Please grant notification listener permission for this app (required to control music playback) Music Open in contacts app Pin to favorites diff --git a/notifications/build.gradle.kts b/notifications/build.gradle.kts index a0aaf9f6..6298b041 100644 --- a/notifications/build.gradle.kts +++ b/notifications/build.gradle.kts @@ -47,5 +47,6 @@ dependencies { implementation(project(":music")) implementation(project(":preferences")) implementation(project(":badges")) + implementation(project(":permissions")) } \ No newline at end of file diff --git a/notifications/src/main/java/de/mm20/launcher2/notifications/NotificationService.kt b/notifications/src/main/java/de/mm20/launcher2/notifications/NotificationService.kt index 9c7533e0..1a0073a2 100644 --- a/notifications/src/main/java/de/mm20/launcher2/notifications/NotificationService.kt +++ b/notifications/src/main/java/de/mm20/launcher2/notifications/NotificationService.kt @@ -8,10 +8,12 @@ import android.media.session.MediaSession import android.service.notification.NotificationListenerService import android.service.notification.StatusBarNotification import android.support.v4.media.session.MediaSessionCompat +import android.util.Log import androidx.core.app.NotificationCompat import de.mm20.launcher2.badges.Badge import de.mm20.launcher2.badges.BadgeProvider import de.mm20.launcher2.music.MusicRepository +import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherPreferences import org.koin.android.ext.android.inject import java.lang.ref.WeakReference @@ -21,6 +23,7 @@ class NotificationService : NotificationListenerService() { private val musicRepository: MusicRepository by inject() private val badgeProvider: BadgeProvider by inject() + private val permissionsManager: PermissionsManager by inject() override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { return Service.START_STICKY @@ -28,6 +31,8 @@ class NotificationService : NotificationListenerService() { override fun onListenerConnected() { super.onListenerConnected() + Log.d("MM20", "Notification listener connected") + permissionsManager.reportNotificationListenerState(true) instance = WeakReference(this) val notifications = getNotifications().sortedByDescending { it.postTime } for (n in notifications) { @@ -110,6 +115,8 @@ class NotificationService : NotificationListenerService() { override fun onListenerDisconnected() { super.onListenerDisconnected() badgeProvider.removeNotificationBadges() + permissionsManager.reportNotificationListenerState(false) + Log.d("MM20", "Notification listener disconnected") } companion object { diff --git a/permissions/build.gradle.kts b/permissions/build.gradle.kts index cb67f6f6..159eb8c6 100644 --- a/permissions/build.gradle.kts +++ b/permissions/build.gradle.kts @@ -45,4 +45,5 @@ dependencies { implementation(project(":base")) implementation(project(":icons")) implementation(project(":search")) + implementation(project(":crashreporter")) } \ No newline at end of file diff --git a/permissions/src/main/java/de/mm20/launcher2/permissions/PermissionsManager.kt b/permissions/src/main/java/de/mm20/launcher2/permissions/PermissionsManager.kt index 4993751f..2f8958c0 100644 --- a/permissions/src/main/java/de/mm20/launcher2/permissions/PermissionsManager.kt +++ b/permissions/src/main/java/de/mm20/launcher2/permissions/PermissionsManager.kt @@ -1,6 +1,7 @@ package de.mm20.launcher2.permissions import android.Manifest +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -8,8 +9,12 @@ import android.net.Uri import android.os.Build import android.os.Environment import android.provider.Settings +import android.util.Log +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationManagerCompat +import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.ktx.checkPermission import de.mm20.launcher2.ktx.isAtLeastApiLevel import kotlinx.coroutines.flow.Flow @@ -32,13 +37,20 @@ interface PermissionsManager { ) fun hasPermission(permissionGroup: PermissionGroup): Flow + + /** + * Special function for the Notification listener to report its status. + * May not be called by anything else. + */ + fun reportNotificationListenerState(running: Boolean) } enum class PermissionGroup { Calendar, Location, Contacts, - ExternalStorage + ExternalStorage, + Notifications, } class PermissionsManagerImpl( @@ -57,6 +69,7 @@ class PermissionsManagerImpl( private val locationPermissionState = MutableStateFlow( checkPermissionOnce(PermissionGroup.Location) ) + private val notificationsPermissionState = MutableStateFlow(false) override fun requestPermission(activity: AppCompatActivity, permissionGroup: PermissionGroup) { when (permissionGroup) { @@ -96,6 +109,13 @@ class PermissionsManagerImpl( ) } } + PermissionGroup.Notifications -> { + try { + activity.startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)) + } catch (e: ActivityNotFoundException) { + CrashReporter.logException(e) + } + } } } @@ -117,6 +137,9 @@ class PermissionsManagerImpl( externalStoragePermissions.all { context.checkPermission(it) } } } + PermissionGroup.Notifications -> { + notificationsPermissionState.value + } } } @@ -126,6 +149,7 @@ class PermissionsManagerImpl( PermissionGroup.Location -> locationPermissionState PermissionGroup.Contacts -> contactsPermissionState PermissionGroup.ExternalStorage -> externalStoragePermissionState + PermissionGroup.Notifications -> notificationsPermissionState } } @@ -141,9 +165,14 @@ class PermissionsManagerImpl( PermissionGroup.Location -> locationPermissionState.value = granted PermissionGroup.Contacts -> contactsPermissionState.value = granted PermissionGroup.ExternalStorage -> externalStoragePermissionState.value = granted + PermissionGroup.Notifications -> notificationsPermissionState.value = granted } } + override fun reportNotificationListenerState(running: Boolean) { + notificationsPermissionState.value = running + } + companion object { private val calendarPermissions = arrayOf(Manifest.permission.READ_CALENDAR) private val locationPermissions = arrayOf( diff --git a/ui/src/main/java/de/mm20/launcher2/ui/legacy/activity/LauncherActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/legacy/activity/LauncherActivity.kt index 85989d44..6f00569a 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/legacy/activity/LauncherActivity.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/legacy/activity/LauncherActivity.kt @@ -561,19 +561,6 @@ class LauncherActivity : BaseActivity() { WallpaperManager.getInstance(this).setWallpaperOffsets(it.windowToken, 0.5f, 0.5f) } - if (!LauncherPreferences.instance.hasRequestedNotificationPermission && !hasNotificationListenerPermission()) { - try { - startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)) - } catch (e: ActivityNotFoundException) { - Toast.makeText( - this, - R.string.notification_permission_activity_not_found, - Toast.LENGTH_LONG - ).show() - } - LauncherPreferences.instance.hasRequestedNotificationPermission = true - } - //getSystemService(Context.INPUT_METHOD_SERVICE) // .castTo()