Show a banner in badge settings if notification permission is missing
This commit is contained in:
parent
e19fef9b18
commit
0e7be56c94
@ -471,6 +471,7 @@
|
||||
<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_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_edit_title">Websuche bearbeiten</string>
|
||||
|
||||
@ -437,6 +437,8 @@
|
||||
<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">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="preference_screen_debug">Debug</string>
|
||||
|
||||
@ -1,55 +1,76 @@
|
||||
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.getValue
|
||||
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.unit.dp
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
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.SwitchPreference
|
||||
|
||||
@Composable
|
||||
fun BadgeSettingsScreen() {
|
||||
val viewModel: BadgeSettingsScreenVM = viewModel()
|
||||
val context = LocalContext.current
|
||||
PreferenceScreen(title = stringResource(R.string.preference_screen_badges)) {
|
||||
item {
|
||||
val notifications by viewModel.notifications.observeAsState()
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.preference_notification_badges),
|
||||
summary = stringResource(R.string.preference_notification_badges_summary),
|
||||
value = notifications == true,
|
||||
onValueChanged = {
|
||||
viewModel.setNotifications(it)
|
||||
PreferenceCategory {
|
||||
val notifications by viewModel.notifications.observeAsState()
|
||||
val hasNotificationsPermission by viewModel.hasNotificationsPermission.observeAsState()
|
||||
AnimatedVisibility(hasNotificationsPermission == false) {
|
||||
MissingPermissionBanner(
|
||||
text = stringResource(R.string.missing_permission_notification_badges),
|
||||
onClick = {
|
||||
viewModel.requestNotificationsPermission(context as AppCompatActivity)
|
||||
},
|
||||
modifier = Modifier.padding(16.dp)
|
||||
)
|
||||
}
|
||||
)
|
||||
val cloudFiles by viewModel.cloudFiles.observeAsState()
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.preference_cloud_badges),
|
||||
summary = stringResource(R.string.preference_cloud_badges_summary),
|
||||
value = cloudFiles == true,
|
||||
onValueChanged = {
|
||||
viewModel.setCloudFiles(it)
|
||||
}
|
||||
)
|
||||
val suspendedApps by viewModel.suspendedApps.observeAsState()
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.preference_suspended_badges),
|
||||
summary = stringResource(R.string.preference_suspended_badges_summary),
|
||||
value = suspendedApps == true,
|
||||
onValueChanged = {
|
||||
viewModel.setSuspendedApps(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)
|
||||
}
|
||||
)
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.preference_notification_badges),
|
||||
summary = stringResource(R.string.preference_notification_badges_summary),
|
||||
value = notifications == true && hasNotificationsPermission == false,
|
||||
onValueChanged = {
|
||||
viewModel.setNotifications(it)
|
||||
}
|
||||
)
|
||||
val cloudFiles by viewModel.cloudFiles.observeAsState()
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.preference_cloud_badges),
|
||||
summary = stringResource(R.string.preference_cloud_badges_summary),
|
||||
value = cloudFiles == true,
|
||||
onValueChanged = {
|
||||
viewModel.setCloudFiles(it)
|
||||
}
|
||||
)
|
||||
val suspendedApps by viewModel.suspendedApps.observeAsState()
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.preference_suspended_badges),
|
||||
summary = stringResource(R.string.preference_suspended_badges_summary),
|
||||
value = suspendedApps == true,
|
||||
onValueChanged = {
|
||||
viewModel.setSuspendedApps(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)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,8 +1,11 @@
|
||||
package de.mm20.launcher2.ui.settings.badges
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.asLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import de.mm20.launcher2.permissions.PermissionGroup
|
||||
import de.mm20.launcher2.permissions.PermissionsManager
|
||||
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.launch
|
||||
@ -12,6 +15,9 @@ import org.koin.core.component.inject
|
||||
class BadgeSettingsScreenVM : ViewModel(), KoinComponent {
|
||||
|
||||
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()
|
||||
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()
|
||||
fun setCloudFiles(cloudFiles: Boolean) {
|
||||
viewModelScope.launch {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user