Add notification permission to PermissionsManager
This commit is contained in:
parent
2c07b97e01
commit
51e9370dd5
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -47,5 +47,6 @@ dependencies {
|
||||
implementation(project(":music"))
|
||||
implementation(project(":preferences"))
|
||||
implementation(project(":badges"))
|
||||
implementation(project(":permissions"))
|
||||
|
||||
}
|
||||
@ -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 {
|
||||
|
||||
@ -45,4 +45,5 @@ dependencies {
|
||||
implementation(project(":base"))
|
||||
implementation(project(":icons"))
|
||||
implementation(project(":search"))
|
||||
implementation(project(":crashreporter"))
|
||||
}
|
||||
@ -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(
|
||||
|
||||
@ -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>()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user