From 546c26a18e6b7803b0f800572a7cd6f48ae5b670 Mon Sep 17 00:00:00 2001 From: kcw-grunt Date: Fri, 17 Jul 2026 09:26:13 +0100 Subject: [PATCH 1/2] Added a check to show/ hide the Brainwallet Phrase in Settings --- app/build.gradle.kts | 4 +- .../ui/screens/settings/SettingsViewModel.kt | 6 +++ .../settingsrows/HomeSettingDrawerSheet.kt | 1 + .../settings/settingsrows/SecurityDetail.kt | 49 ++++++++++--------- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 779f1af1..9b590970 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -31,8 +31,8 @@ android { applicationId = "ltd.grunt.brainwallet" minSdk = 29 targetSdk = 35 - versionCode = 202506341 - versionName = "v4.10.3" + versionCode = 202506342 + versionName = "v4.10.4" multiDexEnabled = true base.archivesName.set("${defaultConfig.versionName}(${defaultConfig.versionCode})") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsViewModel.kt index b47d87d7..86440b06 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsViewModel.kt @@ -1,5 +1,6 @@ package com.brainwallet.ui.screens.settings +import android.app.Application import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat import androidx.lifecycle.viewModelScope @@ -9,6 +10,7 @@ import com.brainwallet.data.model.toFeeOptions import com.brainwallet.data.repository.LtcRepository import com.brainwallet.data.repository.SettingRepository import com.brainwallet.domain.LanguageSwitcherUseCase +import com.brainwallet.tools.manager.BRSharedPrefs import com.brainwallet.tools.manager.FeeManager import com.brainwallet.ui.BrainwalletViewModel import com.brainwallet.util.EventBus @@ -34,6 +36,7 @@ class SettingsViewModel( private val languageSwitcherUseCase: LanguageSwitcherUseCase, private val ltcRepository: LtcRepository, versionCodeProvider: VersionCodeProvider, + private val app: Application, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO ) : BrainwalletViewModel() { @@ -87,6 +90,9 @@ class SettingsViewModel( } } } + fun hasUserSetEmojis(): Boolean { + return BRSharedPrefs.wereEmojisChosen(app) + } override fun onEvent(event: SettingsEvent) { when (event) { diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt index 5bfd38a0..fde019be 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt @@ -89,6 +89,7 @@ fun HomeSettingDrawerSheet( .fillMaxSize() .wrapContentHeight(), shareAnalyticsDataEnabled = state.shareAnalyticsDataEnabled, + userSetEmojis = viewModel.hasUserSetEmojis(), onEvent = { viewModel.onEvent(it) } diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/SecurityDetail.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/SecurityDetail.kt index c859312c..f4f965d3 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/SecurityDetail.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/SecurityDetail.kt @@ -26,6 +26,7 @@ import com.brainwallet.ui.screens.settings.SettingsEvent fun SecurityDetail( modifier: Modifier = Modifier, shareAnalyticsDataEnabled: Boolean = false, + userSetEmojis: Boolean = false, onEvent: (SettingsEvent) -> Unit ) { // / Layout values @@ -68,29 +69,31 @@ fun SecurityDetail( } } - Row( - modifier = Modifier - .height(contentHeight.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text(stringResource(R.string.security_brainwallet_phrase_title)) - Spacer(modifier = Modifier.weight(1f)) - Button(onClick = { - onEvent.invoke(SettingsEvent.OnSecurityBrainwalletPhraseClick) - }) { - Text( - text = "😅", - style = TextStyle( - fontWeight = FontWeight.Normal, - fontSize = 20.sp, - shadow = Shadow( - color = Color.Black.copy(alpha = 0.5f), - offset = Offset(x = 4f, y = 4f), - blurRadius = 4f - ) - ), - maxLines = 1 - ) + if (userSetEmojis) { + Row( + modifier = Modifier + .height(contentHeight.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text(stringResource(R.string.security_brainwallet_phrase_title)) + Spacer(modifier = Modifier.weight(1f)) + Button(onClick = { + onEvent.invoke(SettingsEvent.OnSecurityBrainwalletPhraseClick) + }) { + Text( + text = "😅", + style = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 20.sp, + shadow = Shadow( + color = Color.Black.copy(alpha = 0.5f), + offset = Offset(x = 4f, y = 4f), + blurRadius = 4f + ) + ), + maxLines = 1 + ) + } } } Row( From f67d35b07f70f3823d5715f9120d6e1770ba28bd Mon Sep 17 00:00:00 2001 From: kcw-grunt Date: Fri, 17 Jul 2026 10:55:58 +0100 Subject: [PATCH 2/2] Hooked in the drawerState to set and clear the emojis --- .../ui/screens/emojis/YourEmojisScreen.kt | 9 ++++++ .../brainwallet/ui/screens/main/MainScreen.kt | 28 ++++++++++++----- .../ui/screens/main/MainScreenEvent.kt | 2 ++ .../ui/screens/main/MainScreenState.kt | 1 + .../ui/screens/main/MainViewModel.kt | 11 +++++-- .../settingsrows/HomeSettingDrawerSheet.kt | 31 +++++++++++++------ 6 files changed, 63 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/brainwallet/ui/screens/emojis/YourEmojisScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/emojis/YourEmojisScreen.kt index f028a891..b5380c49 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/emojis/YourEmojisScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/emojis/YourEmojisScreen.kt @@ -27,6 +27,7 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -47,7 +48,10 @@ import com.brainwallet.ui.screens.main.MainViewModel import com.brainwallet.ui.theme.DesignTheme import com.brainwallet.ui.theme.IBMPlexSans import kotlinx.collections.immutable.ImmutableList +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.koin.compose.koinInject +import kotlin.time.Duration.Companion.milliseconds @Composable fun YourEmojisScreen( @@ -60,6 +64,7 @@ fun YourEmojisScreen( val horizontalVerticalSpacing = 8 val leadingCopyPadding = 8 val detailLineHeight = 24 + val coroutineScope = rememberCoroutineScope() BrainwalletScaffold( topBar = { @@ -121,6 +126,10 @@ fun YourEmojisScreen( LargeButton( onClick = { viewModel.onEvent(MainScreenEvent.OnUserClearsEmojis) + coroutineScope.launch { + delay(200L.milliseconds) + onNavigate.invoke(UiEffect.Navigate.Back()) + } }, ) { Text( diff --git a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt index f0506e7f..920cd67f 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreen.kt @@ -41,6 +41,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -200,6 +201,24 @@ fun MainScreen( } } + LaunchedEffect(state.isDrawerOpen) { + if (state.isDrawerOpen) { + if (drawerState.isClosed) drawerState.open() + } else { + if (drawerState.isOpen) drawerState.close() + } + } + + LaunchedEffect(drawerState) { + snapshotFlow { drawerState.currentValue } + .collect { value -> + val isOpen = value == DrawerValue.Open + if (isOpen != state.isDrawerOpen) { + viewModel.onEvent(MainScreenEvent.OnDrawerVisibilityChanged(isOpen)) + } + } + } + ModalNavigationDrawer( drawerState = drawerState, gesturesEnabled = drawerState.isOpen, @@ -213,6 +232,7 @@ fun MainScreen( topNavStartEndPadding + topNavButtonSize ), + isDrawerOpen = drawerState.isOpen ) } ) { @@ -307,13 +327,7 @@ fun MainScreen( Spacer(modifier = Modifier.weight(1f)) SettingsButton( isDarkMode = isDarkMode, - onClick = { - scope.launch { - drawerState.apply { - if (isClosed) open() else close() - } - } - } + onClick = { viewModel.onEvent(MainScreenEvent.OnToggleDrawer) } ) } LazyVerticalGrid( diff --git a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenEvent.kt b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenEvent.kt index 759803c5..88c07011 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenEvent.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenEvent.kt @@ -16,6 +16,8 @@ sealed class MainScreenEvent { data object OnExportTransactions : MainScreenEvent() data class OnCopyTransactions(val transactionItem: TxItem) : MainScreenEvent() data object OnToggleGameHub : MainScreenEvent() + data object OnToggleDrawer : MainScreenEvent() + data class OnDrawerVisibilityChanged(val isOpen: Boolean) : MainScreenEvent() data object OnUserClearsEmojis : MainScreenEvent() diff --git a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenState.kt b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenState.kt index 6cc413c5..01a0fad2 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenState.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/main/MainScreenState.kt @@ -41,6 +41,7 @@ data class MainScreenState( 0f, "$" ), + val isDrawerOpen: Boolean = false, val isInternetReachable: Boolean = true, val formattedCurrency: String = "", val gameURLString: String = "", diff --git a/app/src/main/java/com/brainwallet/ui/screens/main/MainViewModel.kt b/app/src/main/java/com/brainwallet/ui/screens/main/MainViewModel.kt index f8ffa304..13d8fa1b 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/main/MainViewModel.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/main/MainViewModel.kt @@ -509,15 +509,22 @@ class MainViewModel( Timber.e(e) } } + is MainScreenEvent.OnToggleDrawer -> { + _state.update { it.copy(isDrawerOpen = !it.isDrawerOpen) } + } + + is MainScreenEvent.OnDrawerVisibilityChanged -> { + _state.update { it.copy(isDrawerOpen = event.isOpen) } + } is MainScreenEvent.OnUserChoosesEmojis -> { } is MainScreenEvent.OnUserClearsEmojis -> { - BRSharedPrefs.putEmojisChosen(this.app, false) + BRSharedPrefs.putEmojisChosen(app, false) val emptyBytes = "".toByteArray(Charsets.UTF_8) BRKeyStore.putEmojis( emptyBytes, - this.app, + app, BWConstants.PUT_EMOJIS_REQUEST_CODE ) } diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt index fde019be..8649a678 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/settingsrows/HomeSettingDrawerSheet.kt @@ -18,6 +18,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.AbstractComposeView @@ -44,28 +47,36 @@ import kotlinx.coroutines.flow.onEach import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel import org.koin.java.KoinJavaComponent.inject +import timber.log.Timber @Composable fun HomeSettingDrawerSheet( modifier: Modifier = Modifier, + isDrawerOpen: Boolean = false, syncAnalyticsRepository: SyncAnalyticsRepository = koinInject(), viewModel: SettingsViewModel = koinViewModel() ) { val state by viewModel.state.collectAsState() val context = LocalContext.current + var hasUserSetEmojis by remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - viewModel.onEvent( - SettingsEvent.OnLoad( - shareAnalyticsDataEnabled = BRSharedPrefs.getShareData( - context - ), // currently just load analytics share data here - lastSyncMetadata = syncAnalyticsRepository.getLastSyncMetadata(), // currently just load sync metadata here + LaunchedEffect(isDrawerOpen) { + if (isDrawerOpen) { + Timber.d("timber drawer open") + viewModel.onEvent( + SettingsEvent.OnLoad( + shareAnalyticsDataEnabled = BRSharedPrefs.getShareData(context), + lastSyncMetadata = syncAnalyticsRepository.getLastSyncMetadata(), + ) ) - ) + hasUserSetEmojis = viewModel.hasUserSetEmojis() + } else { + hasUserSetEmojis = viewModel.hasUserSetEmojis() + Timber.d("timber drawer closed") + } } - // / Layout values + // Layout values val headerPadding = 56 ModalDrawerSheet( @@ -89,7 +100,7 @@ fun HomeSettingDrawerSheet( .fillMaxSize() .wrapContentHeight(), shareAnalyticsDataEnabled = state.shareAnalyticsDataEnabled, - userSetEmojis = viewModel.hasUserSetEmojis(), + userSetEmojis = hasUserSetEmojis, onEvent = { viewModel.onEvent(it) }