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_light_status_bar">Dunkle Statusleisten-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="contacts_menu_open_externally">In Kontakte-App anzeigen</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_light_status_bar">Dark status 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="contacts_menu_open_externally">Open in contacts app</string>
<string name="favorites_menu_pin">Pin to favorites</string>

View File

@ -47,5 +47,6 @@ dependencies {
implementation(project(":music"))
implementation(project(":preferences"))
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.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 {

View File

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

View File

@ -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<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 {
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(

View File

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