Add notification permission to PermissionsManager

This commit is contained in:
MM20 2022-01-04 22:22:14 +01:00
parent 2c07b97e01
commit 51e9370dd5
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
7 changed files with 39 additions and 16 deletions

View File

@ -177,7 +177,6 @@
<string name="preference_category_system_bars">Systemleisten</string> <string name="preference_category_system_bars">Systemleisten</string>
<string name="preference_light_status_bar">Dunkle Statusleisten-Symbole</string> <string name="preference_light_status_bar">Dunkle Statusleisten-Symbole</string>
<string name="preference_light_nav_bar">Dunkle Navigationsleisten-Symbole</string> <string name="preference_light_nav_bar">Dunkle Navigationsleisten-Symbole</string>
<string name="notification_permission_activity_not_found">Bitte aktivieren Sie den Benachrichtigungszugriff für diese App (wird benötigt um die Musik-Wiedergabe zu steuern)</string>
<string name="widget_name_music">Musik</string> <string name="widget_name_music">Musik</string>
<string name="contacts_menu_open_externally">In Kontakte-App anzeigen</string> <string name="contacts_menu_open_externally">In Kontakte-App anzeigen</string>
<string name="favorites_menu_pin">An Favoriten anheften</string> <string name="favorites_menu_pin">An Favoriten anheften</string>

View File

@ -222,7 +222,6 @@
<string name="preference_category_system_bars">System bars</string> <string name="preference_category_system_bars">System bars</string>
<string name="preference_light_status_bar">Dark status bar icons</string> <string name="preference_light_status_bar">Dark status bar icons</string>
<string name="preference_light_nav_bar">Dark navigation bar icons</string> <string name="preference_light_nav_bar">Dark navigation bar icons</string>
<string name="notification_permission_activity_not_found">Please grant notification listener permission for this app (required to control music playback)</string>
<string name="widget_name_music">Music</string> <string name="widget_name_music">Music</string>
<string name="contacts_menu_open_externally">Open in contacts app</string> <string name="contacts_menu_open_externally">Open in contacts app</string>
<string name="favorites_menu_pin">Pin to favorites</string> <string name="favorites_menu_pin">Pin to favorites</string>

View File

@ -47,5 +47,6 @@ dependencies {
implementation(project(":music")) implementation(project(":music"))
implementation(project(":preferences")) implementation(project(":preferences"))
implementation(project(":badges")) implementation(project(":badges"))
implementation(project(":permissions"))
} }

View File

@ -8,10 +8,12 @@ import android.media.session.MediaSession
import android.service.notification.NotificationListenerService import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification import android.service.notification.StatusBarNotification
import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.MediaSessionCompat
import android.util.Log
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import de.mm20.launcher2.badges.Badge import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeProvider import de.mm20.launcher2.badges.BadgeProvider
import de.mm20.launcher2.music.MusicRepository import de.mm20.launcher2.music.MusicRepository
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.LauncherPreferences import de.mm20.launcher2.preferences.LauncherPreferences
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
@ -21,6 +23,7 @@ class NotificationService : NotificationListenerService() {
private val musicRepository: MusicRepository by inject() private val musicRepository: MusicRepository by inject()
private val badgeProvider: BadgeProvider by inject() private val badgeProvider: BadgeProvider by inject()
private val permissionsManager: PermissionsManager by inject()
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return Service.START_STICKY return Service.START_STICKY
@ -28,6 +31,8 @@ class NotificationService : NotificationListenerService() {
override fun onListenerConnected() { override fun onListenerConnected() {
super.onListenerConnected() super.onListenerConnected()
Log.d("MM20", "Notification listener connected")
permissionsManager.reportNotificationListenerState(true)
instance = WeakReference(this) instance = WeakReference(this)
val notifications = getNotifications().sortedByDescending { it.postTime } val notifications = getNotifications().sortedByDescending { it.postTime }
for (n in notifications) { for (n in notifications) {
@ -110,6 +115,8 @@ class NotificationService : NotificationListenerService() {
override fun onListenerDisconnected() { override fun onListenerDisconnected() {
super.onListenerDisconnected() super.onListenerDisconnected()
badgeProvider.removeNotificationBadges() badgeProvider.removeNotificationBadges()
permissionsManager.reportNotificationListenerState(false)
Log.d("MM20", "Notification listener disconnected")
} }
companion object { companion object {

View File

@ -45,4 +45,5 @@ dependencies {
implementation(project(":base")) implementation(project(":base"))
implementation(project(":icons")) implementation(project(":icons"))
implementation(project(":search")) implementation(project(":search"))
implementation(project(":crashreporter"))
} }

View File

@ -1,6 +1,7 @@
package de.mm20.launcher2.permissions package de.mm20.launcher2.permissions
import android.Manifest import android.Manifest
import android.content.ActivityNotFoundException
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
@ -8,8 +9,12 @@ import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
import android.provider.Settings import android.provider.Settings
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat 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.checkPermission
import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.ktx.isAtLeastApiLevel
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -32,13 +37,20 @@ interface PermissionsManager {
) )
fun hasPermission(permissionGroup: PermissionGroup): Flow<Boolean> fun hasPermission(permissionGroup: PermissionGroup): Flow<Boolean>
/**
* Special function for the Notification listener to report its status.
* May not be called by anything else.
*/
fun reportNotificationListenerState(running: Boolean)
} }
enum class PermissionGroup { enum class PermissionGroup {
Calendar, Calendar,
Location, Location,
Contacts, Contacts,
ExternalStorage ExternalStorage,
Notifications,
} }
class PermissionsManagerImpl( class PermissionsManagerImpl(
@ -57,6 +69,7 @@ class PermissionsManagerImpl(
private val locationPermissionState = MutableStateFlow( private val locationPermissionState = MutableStateFlow(
checkPermissionOnce(PermissionGroup.Location) checkPermissionOnce(PermissionGroup.Location)
) )
private val notificationsPermissionState = MutableStateFlow(false)
override fun requestPermission(activity: AppCompatActivity, permissionGroup: PermissionGroup) { override fun requestPermission(activity: AppCompatActivity, permissionGroup: PermissionGroup) {
when (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) } externalStoragePermissions.all { context.checkPermission(it) }
} }
} }
PermissionGroup.Notifications -> {
notificationsPermissionState.value
}
} }
} }
@ -126,6 +149,7 @@ class PermissionsManagerImpl(
PermissionGroup.Location -> locationPermissionState PermissionGroup.Location -> locationPermissionState
PermissionGroup.Contacts -> contactsPermissionState PermissionGroup.Contacts -> contactsPermissionState
PermissionGroup.ExternalStorage -> externalStoragePermissionState PermissionGroup.ExternalStorage -> externalStoragePermissionState
PermissionGroup.Notifications -> notificationsPermissionState
} }
} }
@ -141,9 +165,14 @@ class PermissionsManagerImpl(
PermissionGroup.Location -> locationPermissionState.value = granted PermissionGroup.Location -> locationPermissionState.value = granted
PermissionGroup.Contacts -> contactsPermissionState.value = granted PermissionGroup.Contacts -> contactsPermissionState.value = granted
PermissionGroup.ExternalStorage -> externalStoragePermissionState.value = granted PermissionGroup.ExternalStorage -> externalStoragePermissionState.value = granted
PermissionGroup.Notifications -> notificationsPermissionState.value = granted
} }
} }
override fun reportNotificationListenerState(running: Boolean) {
notificationsPermissionState.value = running
}
companion object { companion object {
private val calendarPermissions = arrayOf(Manifest.permission.READ_CALENDAR) private val calendarPermissions = arrayOf(Manifest.permission.READ_CALENDAR)
private val locationPermissions = arrayOf( private val locationPermissions = arrayOf(

View File

@ -561,19 +561,6 @@ class LauncherActivity : BaseActivity() {
WallpaperManager.getInstance(this).setWallpaperOffsets(it.windowToken, 0.5f, 0.5f) 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) //getSystemService(Context.INPUT_METHOD_SERVICE)
// .castTo<InputMethodManager>() // .castTo<InputMethodManager>()