Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions app/src/main/java/org/cssnr/deviceinfo/data/SettingsRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -56,6 +57,17 @@ class SettingsRepository(private val context: Context) {
awaitClose { acraPreferences.unregisterOnSharedPreferenceChangeListener(listener) }
}

val crashDisableCount: Flow<Int> = 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
Expand All @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -95,6 +96,7 @@ fun SettingsScreen(
onSeedHueChange: (Float) -> Unit,
onCopyKeyAndValueChange: (Boolean) -> Unit,
onCrashReportingChange: (Boolean) -> Unit,
onCrashReportingDisable: () -> Unit,
onCrashReportingMoreInfo: () -> Unit,
onAboutClick: () -> Unit = {},
) {
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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))
}
},
)
}
}
Expand Down Expand Up @@ -315,6 +322,7 @@ fun SettingsScreenPreview() {
onSeedHueChange = {},
onCopyKeyAndValueChange = {},
onCrashReportingChange = {},
onCrashReportingDisable = {},
onCrashReportingMoreInfo = {},
onAboutClick = {},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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,
Expand Down Expand Up @@ -62,4 +65,10 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application
settingsRepository.setCrashReporting(enabled)
}
}

fun confirmCrashReportingDisable() {
viewModelScope.launch {
settingsRepository.confirmCrashReportingDisable()
}
}
}
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
Loading