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_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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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"))
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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 {
|
||||||
|
|||||||
@ -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"))
|
||||||
}
|
}
|
||||||
@ -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(
|
||||||
|
|||||||
@ -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>()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user