From 9961809730f1daba2b0bbda3318fa1546614417a Mon Sep 17 00:00:00 2001 From: Infi Date: Sat, 28 Sep 2024 14:15:05 +0200 Subject: [PATCH] feat: always enable experiments in debug builds Signed-off-by: Infi --- .../chat/revolt/api/settings/Experiments.kt | 7 +- .../settings/ExperimentsSettingsScreen.kt | 73 ++++++++++++------- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/chat/revolt/api/settings/Experiments.kt b/app/src/main/java/chat/revolt/api/settings/Experiments.kt index bb4b0e96..4e02c9f7 100644 --- a/app/src/main/java/chat/revolt/api/settings/Experiments.kt +++ b/app/src/main/java/chat/revolt/api/settings/Experiments.kt @@ -3,6 +3,7 @@ package chat.revolt.api.settings import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import chat.revolt.BuildConfig import chat.revolt.RevoltApplication import chat.revolt.persistence.KVStorage @@ -30,7 +31,11 @@ object Experiments { suspend fun hydrateWithKv() { val kvStorage = KVStorage(RevoltApplication.instance) - GlobalState.experimentsEnabled = kvStorage.getBoolean("experimentsEnabled") ?: false + if (BuildConfig.DEBUG) { + GlobalState.experimentsEnabled = true + } else { + GlobalState.experimentsEnabled = kvStorage.getBoolean("experimentsEnabled") ?: false + } useKotlinBasedMarkdownRenderer.setEnabled( kvStorage.getBoolean("exp/useKotlinBasedMarkdownRenderer") ?: false diff --git a/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt b/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt index 0b5ef11c..f46ddc33 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt +++ b/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt @@ -1,19 +1,21 @@ package chat.revolt.screens.settings +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.ElevatedButton import androidx.compose.material3.ListItem import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import chat.revolt.BuildConfig +import chat.revolt.RevoltApplication import chat.revolt.api.settings.Experiments import chat.revolt.api.settings.GlobalState import chat.revolt.persistence.KVStorage @@ -21,17 +23,33 @@ import chat.revolt.settings.dsl.SettingsPage import chat.revolt.settings.dsl.SubcategoryContentInsets import kotlinx.coroutines.launch -@Composable -fun ExperimentsSettingsScreen(navController: NavController) { - val context = LocalContext.current - val kv = remember { KVStorage(context) } - val scope = rememberCoroutineScope() +class ExperimentsSettingsScreenViewModel : ViewModel() { + private val kv = KVStorage(RevoltApplication.instance) - var useKotlinMdRendererChecked by remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - useKotlinMdRendererChecked = kv.getBoolean("exp/useKotlinBasedMarkdownRenderer") ?: false + fun disableExperiments(then: () -> Unit = {}) { + viewModelScope.launch { + kv.remove("experimentsEnabled") + GlobalState.experimentsEnabled = false + then() + } } + val useKotlinMdRendererChecked = mutableStateOf(false) + + fun setUseKotlinMdRendererChecked(value: Boolean) { + viewModelScope.launch { + kv.set("exp/useKotlinBasedMarkdownRenderer", value) + Experiments.useKotlinBasedMarkdownRenderer.setEnabled(value) + useKotlinMdRendererChecked.value = value + } + } +} + +@Composable +fun ExperimentsSettingsScreen( + navController: NavController, + viewModel: ExperimentsSettingsScreenViewModel = viewModel() +) { SettingsPage( navController, title = { @@ -47,16 +65,11 @@ fun ExperimentsSettingsScreen(navController: NavController) { }, trailingContent = { Switch( - checked = useKotlinMdRendererChecked, - onCheckedChange = { isChecked -> - scope.launch { - kv.set("exp/useKotlinBasedMarkdownRenderer", isChecked) - Experiments.useKotlinBasedMarkdownRenderer.setEnabled(isChecked) - useKotlinMdRendererChecked = isChecked - } - } + checked = viewModel.useKotlinMdRendererChecked.value, + onCheckedChange = viewModel::setUseKotlinMdRendererChecked ) - } + }, + modifier = Modifier.clickable { viewModel.setUseKotlinMdRendererChecked(!viewModel.useKotlinMdRendererChecked.value) } ) Subcategory( @@ -67,14 +80,18 @@ fun ExperimentsSettingsScreen(navController: NavController) { ) { ElevatedButton( onClick = { - scope.launch { - kv.remove("experimentsEnabled") - GlobalState.experimentsEnabled = false + viewModel.disableExperiments { navController.popBackStack() } - } + }, + enabled = !BuildConfig.DEBUG, + modifier = Modifier.fillMaxWidth() ) { - Text("Disable") + if (BuildConfig.DEBUG) { + Text("Experiments are always enabled in debug builds") + } else { + Text("Disable") + } } } }