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()