Show a banner in badge settings if notification permission is missing

This commit is contained in:
MM20 2022-01-30 14:21:45 +01:00
parent e19fef9b18
commit 0e7be56c94
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
4 changed files with 69 additions and 35 deletions

View File

@ -471,6 +471,7 @@
<string name="missing_permission_calendar_widget_settings">Kalenderzugriff wird benötigt um Termine abzurufen</string> <string name="missing_permission_calendar_widget_settings">Kalenderzugriff wird benötigt um Termine abzurufen</string>
<string name="missing_permission_file_search">Speicher-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string> <string name="missing_permission_file_search">Speicher-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string>
<string name="missing_permission_file_search_android10">Alle Dateien verwalten-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string> <string name="missing_permission_file_search_android10">Alle Dateien verwalten-Berechtigung wird benötigt um lokale Dateien zu durchsuchen</string>
<string name="missing_permission_notification_badges">Benachrichtigungszugriff wird benötigt um Benachrichtigungsplaketten anzuzeigen</string>
<string name="websearch_dialog_create_title">Websuche hinzufügen</string> <string name="websearch_dialog_create_title">Websuche hinzufügen</string>
<string name="websearch_dialog_edit_title">Websuche bearbeiten</string> <string name="websearch_dialog_edit_title">Websuche bearbeiten</string>

View File

@ -437,6 +437,8 @@
<string name="missing_permission_calendar_widget_settings">This widget requires calendar permission</string> <string name="missing_permission_calendar_widget_settings">This widget requires calendar permission</string>
<string name="missing_permission_file_search_android10">Manage all files permission is required to search local files</string> <string name="missing_permission_file_search_android10">Manage all files permission is required to search local files</string>
<string name="missing_permission_file_search">External storage permission is required to search local files</string> <string name="missing_permission_file_search">External storage permission is required to search local files</string>
<string name="missing_permission_notification_badges">Notification access is requried to display notification badges</string>
<string name="weather_widget_set_location">Set location</string> <string name="weather_widget_set_location">Set location</string>
<string name="preference_screen_debug">Debug</string> <string name="preference_screen_debug">Debug</string>

View File

@ -1,55 +1,76 @@
package de.mm20.launcher2.ui.settings.badges package de.mm20.launcher2.ui.settings.badges
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.MissingPermissionBanner
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference
@Composable @Composable
fun BadgeSettingsScreen() { fun BadgeSettingsScreen() {
val viewModel: BadgeSettingsScreenVM = viewModel() val viewModel: BadgeSettingsScreenVM = viewModel()
val context = LocalContext.current
PreferenceScreen(title = stringResource(R.string.preference_screen_badges)) { PreferenceScreen(title = stringResource(R.string.preference_screen_badges)) {
item { item {
val notifications by viewModel.notifications.observeAsState() PreferenceCategory {
SwitchPreference( val notifications by viewModel.notifications.observeAsState()
title = stringResource(R.string.preference_notification_badges), val hasNotificationsPermission by viewModel.hasNotificationsPermission.observeAsState()
summary = stringResource(R.string.preference_notification_badges_summary), AnimatedVisibility(hasNotificationsPermission == false) {
value = notifications == true, MissingPermissionBanner(
onValueChanged = { text = stringResource(R.string.missing_permission_notification_badges),
viewModel.setNotifications(it) onClick = {
viewModel.requestNotificationsPermission(context as AppCompatActivity)
},
modifier = Modifier.padding(16.dp)
)
} }
) SwitchPreference(
val cloudFiles by viewModel.cloudFiles.observeAsState() title = stringResource(R.string.preference_notification_badges),
SwitchPreference( summary = stringResource(R.string.preference_notification_badges_summary),
title = stringResource(R.string.preference_cloud_badges), value = notifications == true && hasNotificationsPermission == false,
summary = stringResource(R.string.preference_cloud_badges_summary), onValueChanged = {
value = cloudFiles == true, viewModel.setNotifications(it)
onValueChanged = { }
viewModel.setCloudFiles(it) )
} val cloudFiles by viewModel.cloudFiles.observeAsState()
) SwitchPreference(
val suspendedApps by viewModel.suspendedApps.observeAsState() title = stringResource(R.string.preference_cloud_badges),
SwitchPreference( summary = stringResource(R.string.preference_cloud_badges_summary),
title = stringResource(R.string.preference_suspended_badges), value = cloudFiles == true,
summary = stringResource(R.string.preference_suspended_badges_summary), onValueChanged = {
value = suspendedApps == true, viewModel.setCloudFiles(it)
onValueChanged = { }
viewModel.setSuspendedApps(it) )
} val suspendedApps by viewModel.suspendedApps.observeAsState()
) SwitchPreference(
val shortcuts by viewModel.shortcuts.observeAsState() title = stringResource(R.string.preference_suspended_badges),
SwitchPreference( summary = stringResource(R.string.preference_suspended_badges_summary),
title = stringResource(R.string.preference_shortcut_badges), value = suspendedApps == true,
summary = stringResource(R.string.preference_shortcut_badges_summary), onValueChanged = {
value = shortcuts == true, viewModel.setSuspendedApps(it)
onValueChanged = { }
viewModel.setShortcuts(it) )
} val shortcuts by viewModel.shortcuts.observeAsState()
) SwitchPreference(
title = stringResource(R.string.preference_shortcut_badges),
summary = stringResource(R.string.preference_shortcut_badges_summary),
value = shortcuts == true,
onValueChanged = {
viewModel.setShortcuts(it)
}
)
}
} }
} }
} }

View File

@ -1,8 +1,11 @@
package de.mm20.launcher2.ui.settings.badges package de.mm20.launcher2.ui.settings.badges
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.LauncherDataStore
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -12,6 +15,9 @@ import org.koin.core.component.inject
class BadgeSettingsScreenVM : ViewModel(), KoinComponent { class BadgeSettingsScreenVM : ViewModel(), KoinComponent {
private val dataStore: LauncherDataStore by inject() private val dataStore: LauncherDataStore by inject()
private val permissionsManager: PermissionsManager by inject()
val hasNotificationsPermission = permissionsManager.hasPermission(PermissionGroup.Notifications).asLiveData()
val notifications = dataStore.data.map { it.badges.notifications }.asLiveData() val notifications = dataStore.data.map { it.badges.notifications }.asLiveData()
fun setNotifications(notifications: Boolean) { fun setNotifications(notifications: Boolean) {
@ -27,6 +33,10 @@ class BadgeSettingsScreenVM : ViewModel(), KoinComponent {
} }
} }
fun requestNotificationsPermission(context: AppCompatActivity) {
permissionsManager.requestPermission(context, PermissionGroup.Notifications)
}
val cloudFiles = dataStore.data.map { it.badges.cloudFiles }.asLiveData() val cloudFiles = dataStore.data.map { it.badges.cloudFiles }.asLiveData()
fun setCloudFiles(cloudFiles: Boolean) { fun setCloudFiles(cloudFiles: Boolean) {
viewModelScope.launch { viewModelScope.launch {