From 86534943423597477cfa2c8c143454a2794683ba Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sat, 10 Oct 2026 12:37:53 -0700 Subject: [PATCH] Update ACRA Disable Dialog Layout/Limit --- .../deviceinfo/data/SettingsRepository.kt | 20 +++++++++++++++++ .../deviceinfo/ui/screens/SettingsScreen.kt | 22 +++++++++++++------ .../ui/viewmodel/SettingsViewModel.kt | 11 +++++++++- gradle/libs.versions.toml | 2 +- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/cssnr/deviceinfo/data/SettingsRepository.kt b/app/src/main/java/org/cssnr/deviceinfo/data/SettingsRepository.kt index 3574aa0..4d38f33 100644 --- a/app/src/main/java/org/cssnr/deviceinfo/data/SettingsRepository.kt +++ b/app/src/main/java/org/cssnr/deviceinfo/data/SettingsRepository.kt @@ -23,6 +23,7 @@ class SettingsRepository(private val context: Context) { val SEED_HUE = floatPreferencesKey("seed_hue") val COPY_KEY_AND_VALUE = booleanPreferencesKey("copy_key_and_value") const val CRASH_REPORTING = "acra.enable" + const val CRASH_DISABLE_COUNT = "ui_acra_disable_count" } @Suppress("DEPRECATION") @@ -56,6 +57,17 @@ class SettingsRepository(private val context: Context) { awaitClose { acraPreferences.unregisterOnSharedPreferenceChangeListener(listener) } } + val crashDisableCount: Flow = callbackFlow { + val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> + if (key == Keys.CRASH_DISABLE_COUNT) { + trySend(acraPreferences.getInt(Keys.CRASH_DISABLE_COUNT, 0)) + } + } + acraPreferences.registerOnSharedPreferenceChangeListener(listener) + trySend(acraPreferences.getInt(Keys.CRASH_DISABLE_COUNT, 0)) + awaitClose { acraPreferences.unregisterOnSharedPreferenceChangeListener(listener) } + } + suspend fun setDynamicColor(enabled: Boolean) { context.settingsDataStore.edit { preferences -> preferences[Keys.DYNAMIC_COLOR] = enabled @@ -78,8 +90,16 @@ class SettingsRepository(private val context: Context) { acraPreferences.edit().putBoolean(Keys.CRASH_REPORTING, enabled).apply() } + fun confirmCrashReportingDisable() { + acraPreferences.edit() + .putBoolean(Keys.CRASH_REPORTING, false) + .putInt(Keys.CRASH_DISABLE_COUNT, acraPreferences.getInt(Keys.CRASH_DISABLE_COUNT, 0) + 1) + .apply() + } + companion object { // Hue of the Material 3 baseline purple (#6750A4) on the vivid (S=V=1) ramp. const val DEFAULT_SEED_HUE = 256.43f + const val MAX_CRASH_DISABLE_PROMPTS = 2 } } \ No newline at end of file diff --git a/app/src/main/java/org/cssnr/deviceinfo/ui/screens/SettingsScreen.kt b/app/src/main/java/org/cssnr/deviceinfo/ui/screens/SettingsScreen.kt index 93ddf4c..4a8f368 100644 --- a/app/src/main/java/org/cssnr/deviceinfo/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/org/cssnr/deviceinfo/ui/screens/SettingsScreen.kt @@ -78,6 +78,7 @@ fun SettingsRoute( onSeedHueChange = viewModel::setSeedHue, onCopyKeyAndValueChange = viewModel::setCopyKeyAndValue, onCrashReportingChange = viewModel::setCrashReporting, + onCrashReportingDisable = viewModel::confirmCrashReportingDisable, onCrashReportingMoreInfo = { context.startActivity( Intent(Intent.ACTION_VIEW, acraInfoLink.toUri()) @@ -95,6 +96,7 @@ fun SettingsScreen( onSeedHueChange: (Float) -> Unit, onCopyKeyAndValueChange: (Boolean) -> Unit, onCrashReportingChange: (Boolean) -> Unit, + onCrashReportingDisable: () -> Unit, onCrashReportingMoreInfo: () -> Unit, onAboutClick: () -> Unit = {}, ) { @@ -174,6 +176,8 @@ fun SettingsScreen( onCheckedChange = { newValue -> if (newValue) { onCrashReportingChange(true) + } else if (settings.crashDisableCount >= SettingsRepository.MAX_CRASH_DISABLE_PROMPTS) { + onCrashReportingChange(false) } else { showCrashReportingDialog = true } @@ -206,25 +210,28 @@ fun SettingsScreen( title = { Text(stringResource(R.string.acra_disable_title)) }, text = { Text(stringResource(R.string.acra_disable_message)) }, confirmButton = { - Row { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically, + ) { TextButton(onClick = onCrashReportingMoreInfo) { Text(stringResource(R.string.acra_disable_more_info)) } + Spacer(modifier = Modifier.weight(1f)) + TextButton(onClick = { showCrashReportingDialog = false }) { + Text(stringResource(R.string.acra_disable_cancel)) + } TextButton( onClick = { showCrashReportingDialog = false - onCrashReportingChange(false) + onCrashReportingDisable() } ) { Text(stringResource(R.string.acra_disable_confirm)) } } }, - dismissButton = { - TextButton(onClick = { showCrashReportingDialog = false }) { - Text(stringResource(R.string.acra_disable_cancel)) - } - }, ) } } @@ -315,6 +322,7 @@ fun SettingsScreenPreview() { onSeedHueChange = {}, onCopyKeyAndValueChange = {}, onCrashReportingChange = {}, + onCrashReportingDisable = {}, onCrashReportingMoreInfo = {}, onAboutClick = {}, ) diff --git a/app/src/main/java/org/cssnr/deviceinfo/ui/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/cssnr/deviceinfo/ui/viewmodel/SettingsViewModel.kt index dc266b6..5a4d0c4 100644 --- a/app/src/main/java/org/cssnr/deviceinfo/ui/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/cssnr/deviceinfo/ui/viewmodel/SettingsViewModel.kt @@ -15,6 +15,7 @@ data class SettingsState( val seedHue: Float = SettingsRepository.DEFAULT_SEED_HUE, val copyKeyAndValue: Boolean = true, val crashReporting: Boolean = true, + val crashDisableCount: Int = 0, ) class SettingsViewModel(application: Application) : AndroidViewModel(application) { @@ -26,12 +27,14 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application settingsRepository.seedHue, settingsRepository.copyKeyAndValue, settingsRepository.crashReporting, - ) { dynamicColor, seedHue, copyKeyAndValue, crashReporting -> + settingsRepository.crashDisableCount, + ) { dynamicColor, seedHue, copyKeyAndValue, crashReporting, crashDisableCount -> SettingsState( dynamicColor = dynamicColor, seedHue = seedHue, copyKeyAndValue = copyKeyAndValue, crashReporting = crashReporting, + crashDisableCount = crashDisableCount, ) }.stateIn( scope = viewModelScope, @@ -62,4 +65,10 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application settingsRepository.setCrashReporting(enabled) } } + + fun confirmCrashReportingDisable() { + viewModelScope.launch { + settingsRepository.confirmCrashReportingDisable() + } + } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ffcab44..a1d8f82 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ kotlin = "2.4.20" composeBom = "2026.09.00" materialIcons = "1.7.8" composeUiTest = "1.12.1" -acra = "5.13.1" +acra = "5.14.2" materialKolor = "5.0.1" [libraries]