From 53c0afc780de7878809d4257dbd40dec000b0d1a Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Sat, 24 Aug 2024 15:10:08 +0200 Subject: [PATCH] show a one-time notice related to whitelisting apps --- .../lyricsgrabbr/MainActivity.kt | 1 + .../data/SettingsPreferencesRepository.kt | 9 +++++ .../lyricsgrabbr/ui/screens/Home.kt | 33 ++++++++++++++++++- .../viewmodels/SettingsViewModel.kt | 8 +++++ app/src/main/res/values-ar/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 54 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/illusionman1212/lyricsgrabbr/MainActivity.kt b/app/src/main/java/com/illusionman1212/lyricsgrabbr/MainActivity.kt index 9f35678..ca18f4d 100644 --- a/app/src/main/java/com/illusionman1212/lyricsgrabbr/MainActivity.kt +++ b/app/src/main/java/com/illusionman1212/lyricsgrabbr/MainActivity.kt @@ -116,6 +116,7 @@ class MainActivity : AppCompatActivity() { navController.navigate(Routes.Lyrics.route) }, lyricsViewModel = lyricsViewModel, + settingsViewModel = settingsViewModel, goBack = { finish() }, lastNotification = lastNotification, ) diff --git a/app/src/main/java/com/illusionman1212/lyricsgrabbr/data/SettingsPreferencesRepository.kt b/app/src/main/java/com/illusionman1212/lyricsgrabbr/data/SettingsPreferencesRepository.kt index 4e345c4..a49e4e1 100644 --- a/app/src/main/java/com/illusionman1212/lyricsgrabbr/data/SettingsPreferencesRepository.kt +++ b/app/src/main/java/com/illusionman1212/lyricsgrabbr/data/SettingsPreferencesRepository.kt @@ -18,6 +18,7 @@ data class SettingsPreferences( val appTheme: Int = Theme.SYSTEM.ordinal, val whitelist: Set = emptySet(), val keepScreenOn: Boolean = false, + val whitelistPromptSeen: Boolean = false, ) class SettingsPreferencesRepository( @@ -27,6 +28,7 @@ class SettingsPreferencesRepository( private val APP_THEME = intPreferencesKey("app_theme") private val WHITELIST = stringSetPreferencesKey("apps_whitelist") private val KEEP_SCREEN_ON = booleanPreferencesKey("keep_screen_on") + private val WHITELIST_PROMPT_SEEN = booleanPreferencesKey("whitelist_prompt_seen") } val preferences = dataStore.data.map { mapSettingsPreferences(it) } @@ -55,11 +57,18 @@ class SettingsPreferencesRepository( } } + suspend fun discardWhitelistPrompt() { + dataStore.edit { prefs -> + prefs[WHITELIST_PROMPT_SEEN] = true + } + } + private fun mapSettingsPreferences(prefs: Preferences): SettingsPreferences { return SettingsPreferences( prefs[APP_THEME] ?: Theme.SYSTEM.ordinal, prefs[WHITELIST] ?: emptySet(), prefs[KEEP_SCREEN_ON] ?: false, + prefs[WHITELIST_PROMPT_SEEN] ?: false, ) } } \ No newline at end of file diff --git a/app/src/main/java/com/illusionman1212/lyricsgrabbr/ui/screens/Home.kt b/app/src/main/java/com/illusionman1212/lyricsgrabbr/ui/screens/Home.kt index 9c47fb2..dfe655d 100644 --- a/app/src/main/java/com/illusionman1212/lyricsgrabbr/ui/screens/Home.kt +++ b/app/src/main/java/com/illusionman1212/lyricsgrabbr/ui/screens/Home.kt @@ -87,6 +87,7 @@ import coil.compose.AsyncImage import com.illusionman1212.lyricsgrabbr.ui.components.forwardingPainter import com.illusionman1212.lyricsgrabbr.utils.annotatedStringResource import com.illusionman1212.lyricsgrabbr.viewmodels.LyricsViewModel +import com.illusionman1212.lyricsgrabbr.viewmodels.SettingsViewModel import kotlinx.coroutines.launch @@ -100,6 +101,7 @@ fun HomePage( factory = HomeViewModel.Factory, ), lyricsViewModel: LyricsViewModel, + settingsViewModel: SettingsViewModel, lastNotification: MutableStateFlow ) { val context = LocalContext.current @@ -115,6 +117,7 @@ fun HomePage( var songUri by remember { mutableStateOf(Uri.EMPTY) } var showBottomSheet by remember { mutableStateOf(false) } var listeningPermission = homeViewModel.getListeningPermission() + val settingsState by settingsViewModel.uiState.collectAsStateWithLifecycle() var notificationPermission by remember { mutableStateOf( ActivityCompat.checkSelfPermission(context, POST_NOTIFICATIONS) == PERMISSION_GRANTED ) } @@ -237,6 +240,30 @@ fun HomePage( modifier = Modifier.padding(bottom = 16.dp) ) } + } else if (!settingsState.whitelistPromptSeen) { + LGAlertDialog( + properties = DialogProperties( + dismissOnBackPress = true, + dismissOnClickOutside = true, + ), + onDismiss = { settingsViewModel.discardWhitelistPrompt() }, + title = stringResource(id = R.string.whitelist_apps), + buttons = { + TextButton( + onClick = { + settingsViewModel.discardWhitelistPrompt() + } + ) { + Text(stringResource(id = R.string.understood)) + } + } + ) { + Text( + text = stringResource(R.string.whitelist_prompt_desc), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 16.dp) + ) + } } Column( @@ -248,7 +275,11 @@ fun HomePage( verticalArrangement = Arrangement.spacedBy(16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { - Text( text = stringResource(id = R.string.no_supported_player), style = MaterialTheme.typography.headlineSmall ) + Text( + text = stringResource(id = R.string.no_supported_player), + style = MaterialTheme.typography.headlineSmall, + textAlign = TextAlign.Center, + ) if (!notificationPermission) { Text( text = stringResource(id = R.string.notification_post_permission_not_granted).uppercase(), diff --git a/app/src/main/java/com/illusionman1212/lyricsgrabbr/viewmodels/SettingsViewModel.kt b/app/src/main/java/com/illusionman1212/lyricsgrabbr/viewmodels/SettingsViewModel.kt index 644b55c..694dcb3 100644 --- a/app/src/main/java/com/illusionman1212/lyricsgrabbr/viewmodels/SettingsViewModel.kt +++ b/app/src/main/java/com/illusionman1212/lyricsgrabbr/viewmodels/SettingsViewModel.kt @@ -31,6 +31,7 @@ data class SettingsState( val applications: Map = emptyMap(), val whitelistSearchQuery: String = "", val keepScreenOn: Boolean = false, + val whitelistPromptSeen: Boolean = true, ) class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesRepository, context: Context): ViewModel() { @@ -48,6 +49,12 @@ class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesReposi } } + fun discardWhitelistPrompt() { + viewModelScope.launch(Dispatchers.IO) { + settingsPrefsRepo.discardWhitelistPrompt() + } + } + fun toggleKeepScreenOn() { viewModelScope.launch(Dispatchers.IO) { settingsPrefsRepo.toggleKeepScreenOn() @@ -157,6 +164,7 @@ class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesReposi state.copy( appTheme = it.appTheme, keepScreenOn = it.keepScreenOn, + whitelistPromptSeen = it.whitelistPromptSeen, ) } } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 03dc0dd..013c500 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -26,6 +26,8 @@ يتطلب هذا التطبيق أذونات الإشعارات لبدء خدمة مقدمة بغرض الاستماع إلى إشعارات الموسيقى، ولا يمكن أن يعمل بدونها. لم يتم منح إذن الإشعارات، لن يعمل التطبيق بشكل صحيح منح الإذن + مفهوم + يعمل التطبيق على أساس القائمة البيضاء. وهذا يمنحك التحكم في التطبيقات التي سنستمع إليها ويقلل أيضًا من التشويش على التطبيق.\nيمكنك التحكم في القائمة البيضاء من الإعدادات الإعدادات diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f104cbf..34cf146 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -25,6 +25,8 @@ LyricsGrabbr requires notification permissions to start a foreground service for the purpose of listening to music notifications, and cannot function without it. Notification permission is not granted, the app will not function properly Grant Permission + Understood + The application operates on a whitelist basis. This gives you control over which apps we\'ll listen to and also reduces noise for the application.\nYou may control the whitelist from the settings. Settings