From f2462669f55ff37ca9970008c03951dc9b8cb439 Mon Sep 17 00:00:00 2001 From: Kerry Washington Date: Tue, 4 Mar 2025 08:32:41 +0000 Subject: [PATCH 01/26] WIP: Adding structure to the settings screen --- .../com/brainwallet/navigation/MainNav.kt | 6 + .../java/com/brainwallet/navigation/Route.kt | 3 + .../presenter/activities/BreadActivity.java | 3 +- .../tools/animation/BRAnimator.java | 40 ++++++ .../com/brainwallet/ui/BrainwalletActivity.kt | 2 +- .../composable/settingsrows/CurrencyDetail.kt | 2 + .../composable/settingsrows/LanguageDetail.kt | 69 +++++++++++ .../settingsrows/LitecoinBlockchainDetail.kt | 4 + .../composable/settingsrows/SecurityDetail.kt | 2 + .../ui/screens/settings/SettingsEvent.kt | 14 +++ .../ui/screens/settings/SettingsScreen.kt | 114 +++++++++++++++++- .../ui/screens/settings/SettingsState.kt | 15 +++ .../ui/screens/settings/SettingsViewModel.kt | 113 +++++++++++++++++ 13 files changed, 381 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt create mode 100644 app/src/main/java/com/brainwallet/ui/composable/settingsrows/LanguageDetail.kt create mode 100644 app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt create mode 100644 app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt create mode 100644 app/src/main/java/com/brainwallet/ui/screens/settings/SettingsEvent.kt create mode 100644 app/src/main/java/com/brainwallet/ui/screens/settings/SettingsState.kt create mode 100644 app/src/main/java/com/brainwallet/ui/screens/settings/SettingsViewModel.kt diff --git a/app/src/main/java/com/brainwallet/navigation/MainNav.kt b/app/src/main/java/com/brainwallet/navigation/MainNav.kt index 1d1fa5e1..8794bee0 100644 --- a/app/src/main/java/com/brainwallet/navigation/MainNav.kt +++ b/app/src/main/java/com/brainwallet/navigation/MainNav.kt @@ -10,6 +10,7 @@ import androidx.navigation.toRoute import com.brainwallet.ui.screens.inputwords.InputWordsScreen import com.brainwallet.ui.screens.ready.ReadyScreen import com.brainwallet.ui.screens.setpasscode.SetPasscodeScreen +import com.brainwallet.ui.screens.settings.SettingsScreen import com.brainwallet.ui.screens.topup.TopUpScreen import com.brainwallet.ui.screens.unlock.UnLockScreen import com.brainwallet.ui.screens.welcome.WelcomeScreen @@ -98,6 +99,11 @@ fun NavGraphBuilder.mainNavGraph( ) } + composable { navBackStackEntry -> + SettingsScreen( + shouldShowSettingsScreen = false + ) + } /** * for now, still using old activity & fragment [com.brainwallet.presenter.activities.BreadActivity] diff --git a/app/src/main/java/com/brainwallet/navigation/Route.kt b/app/src/main/java/com/brainwallet/navigation/Route.kt index 905d1bb8..92c50c59 100644 --- a/app/src/main/java/com/brainwallet/navigation/Route.kt +++ b/app/src/main/java/com/brainwallet/navigation/Route.kt @@ -15,6 +15,9 @@ sealed class Route : JavaSerializable { @Serializable object TopUp : Route() + @Serializable + object Settings : Route() + @Serializable data class SetPasscode( val passcode: List = emptyList() diff --git a/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java b/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java index b72234b7..e2f42bdb 100644 --- a/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java +++ b/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java @@ -220,7 +220,8 @@ private void setListeners() { secondaryPrice.setOnClickListener(v -> swap()); menuBut.setOnClickListener(v -> { if (BRAnimator.isClickAllowed()) { - BRAnimator.showMenuFragment(BreadActivity.this); + /// Calls a Composable + BRAnimator.showSettingsScreen(BreadActivity.this); } }); } diff --git a/app/src/main/java/com/brainwallet/tools/animation/BRAnimator.java b/app/src/main/java/com/brainwallet/tools/animation/BRAnimator.java index 41c6d64d..a1b925ae 100644 --- a/app/src/main/java/com/brainwallet/tools/animation/BRAnimator.java +++ b/app/src/main/java/com/brainwallet/tools/animation/BRAnimator.java @@ -1,5 +1,7 @@ package com.brainwallet.tools.animation; +import static androidx.databinding.DataBindingUtil.setContentView; + import android.Manifest; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -20,6 +22,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.compose.ui.platform.ComposeView; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentActivity; @@ -41,6 +44,7 @@ import com.brainwallet.presenter.fragments.FragmentSignal; import com.brainwallet.presenter.fragments.FragmentTransactionDetails; import com.brainwallet.presenter.interfaces.BROnSignalCompletion; +import com.brainwallet.ui.screens.settings.SettingsScreenKt; import java.util.List; @@ -52,6 +56,8 @@ public class BRAnimator { public static int SLIDE_ANIMATION_DURATION = 300; public static boolean supportIsShowing; + private static boolean shouldShowSettingsComposable = false; + public static void showBreadSignal(FragmentActivity activity, String title, String iconDescription, int drawableId, BROnSignalCompletion completion) { fragmentSignal = new FragmentSignal(); Bundle bundle = new Bundle(); @@ -242,6 +248,40 @@ public static void showMenuFragment(Activity app) { transaction.commit(); } + public static void showSettingsScreen(Activity app) { + + // Create a ComposeView + ComposeView composeView = new ComposeView(app); + +// // Set the Composable function +// composeView.setContent(() -> { +// SettingsScreenKt.SettingsScreen(shouldShowSettingsComposable); +// return null; +// }); +// +// // Set the ComposeView as the content view +// setContentView(composeView); + } + +// @Override +// protected void onCreate(Bundle savedInstanceState) { +// super.onCreate(savedInstanceState); +// setContentView(R.layout.activity_main); +// ComposeView composeView = findViewById(R.id.compose_view); +// composeView.setViewCompositionStrategy(ViewCompositionStrategy.[Your choice here]); +// composeView.setContent{ +// HomeKt.Home( +// // other function arguments +// ); +// }); +// } + + + + + + + public static boolean isClickAllowed() { if (clickAllowed) { clickAllowed = false; diff --git a/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt b/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt index fcd88f8c..178135c0 100644 --- a/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt +++ b/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt @@ -54,7 +54,7 @@ class BrainwalletActivity : BRActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - + /// DEV: Test / Dev Composable shortcut swap to launch val startDestination = intent.getSerializableExtra(EXTRA_START_DESTINATION) ?: Route.Welcome diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt new file mode 100644 index 00000000..4dd95a70 --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt @@ -0,0 +1,2 @@ +package com.brainwallet.ui.composable.settingsrows + diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LanguageDetail.kt b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LanguageDetail.kt new file mode 100644 index 00000000..95a4391d --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LanguageDetail.kt @@ -0,0 +1,69 @@ +package com.brainwallet.ui.composable.settingsrows + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.ListItemDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.brainwallet.data.model.Language +import com.brainwallet.data.repository.SettingRepository +import com.brainwallet.ui.theme.BrainwalletTheme + +@Composable +fun LanguageDetail( + selectedLanguage: Language, + onDismissRequest: () -> Unit, + onLanguageSelect: (Language) -> Unit +) { + Column() { + + Spacer(modifier = Modifier.weight(0.1f)) + + LazyColumn { + val languages = Language.entries.toTypedArray() + val lastLanguageItem = languages[languages.size - 1] + val lastLanguageBottomPad = 16 + lateinit var settingRepository: SettingRepository + val userPreferredLanguage = settingRepository.getCurrentLanguage() + + items( + items = languages + ) { language -> + ListItem( + colors = ListItemDefaults.colors( + containerColor = BrainwalletTheme.colors.background, + headlineColor = BrainwalletTheme.colors.content, + ), + modifier = Modifier.clickable { + if (language.code.isNotBlank()) { + onLanguageSelect.invoke(language) + } + } + .padding(bottom = if (language == lastLanguageItem) lastLanguageBottomPad.dp else 0.dp), + headlineContent = { + Text(language.title) + }, + trailingContent = { + if (userPreferredLanguage.code == language.code) { + Icon( + Icons.Default.CheckCircle, + contentDescription = null, + tint = BrainwalletTheme.colors.affirm + ) + } + } + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt new file mode 100644 index 00000000..7a56cd4b --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt @@ -0,0 +1,4 @@ +package com.brainwallet.ui.composable.settingsrows + +class LitecoinBlockchainDetail { +} \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt new file mode 100644 index 00000000..4dd95a70 --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt @@ -0,0 +1,2 @@ +package com.brainwallet.ui.composable.settingsrows + diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsEvent.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsEvent.kt new file mode 100644 index 00000000..728c8725 --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsEvent.kt @@ -0,0 +1,14 @@ +package com.brainwallet.ui.screens.settings + +import com.brainwallet.data.model.CurrencyEntity +import com.brainwallet.data.model.Language + +sealed class SettingsEvent { + object OnToggleDarkMode : SettingsEvent() + object OnLanguageSelectorButtonClick : SettingsEvent() + object OnLanguageSelectorDismiss : SettingsEvent() + data class OnLanguageChange(val language: Language) : SettingsEvent() + object OnFiatButtonClick : SettingsEvent() + object OnFiatSelectorDismiss : SettingsEvent() + data class OnFiatChange(val currency: CurrencyEntity) : SettingsEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt index b3d1f4c0..db478707 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt @@ -1,8 +1,114 @@ -package com.brainwallet.ui.screens.settings +@file:OptIn(ExperimentalMaterial3Api::class) +package com.brainwallet.ui.screens.settings +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowForward +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +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.LocalConfiguration +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.brainwallet.R +import com.brainwallet.navigation.OnNavigate +import com.brainwallet.navigation.UiEffect +import com.brainwallet.ui.composable.BrainwalletScaffold +import com.brainwallet.ui.composable.BrainwalletTopAppBar +import com.brainwallet.ui.composable.settingsrows.LanguageDetail +import com.brainwallet.ui.screens.welcome.WelcomeEvent +import com.brainwallet.ui.screens.welcome.WelcomeViewModel @Composable -fun SettingsScreen() { - //todo -} \ No newline at end of file +fun SettingsScreen( + shouldShowSettingsScreen: Boolean, + viewModel: SettingsViewModel = viewModel() +) { + val context = LocalContext.current + val state by viewModel.state.collectAsState() + val configuration = LocalConfiguration.current + + ///Language + var shouldShowLanguageDetail by remember { mutableStateOf(false) } + + + /// Layout values + val leadingCopyPadding = 16 + + val horizontalVerticalSpacing = 8 + val spacerHeight = 90 + + val activeRowHeight = 70 + + + LazyColumn { + + // Security Row > + item { + Text(text = "First item") + } + // Language Row > + item { + LanguageDetail( + selectedLanguage = state.selectedLanguage, + onDismissRequest = { shouldShowLanguageDetail = false }, + onLanguageSelect = { language -> + viewModel.onEvent( + SettingsEvent.OnLanguageChange( + language + ) + ) + } + ) + } + // Currency Dropdown Row + item { + Text(text = "First item") + } + // Games > + item { + Text(text = "First item") + } + // Blockchain: Litecoin > + item { + Text(text = "First item") + } + // Support + item { + Text(text = "First item") + } + // Social + item { + Text(text = "First item") + } + + // Lock / Unlock + item { + Text(text = "First item") + } + + + } +} diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsState.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsState.kt new file mode 100644 index 00000000..d3577aae --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsState.kt @@ -0,0 +1,15 @@ +package com.brainwallet.ui.screens.settings +import com.brainwallet.data.model.CurrencyEntity +import com.brainwallet.data.model.Language + +data class SettingsState( + val darkMode: Boolean = true, + val selectedLanguage: Language = Language.ENGLISH, + val selectedCurrency: CurrencyEntity = CurrencyEntity( + "USD", + "USD", + -1f + ), //-1 = need to fetch + val languageSelectorBottomSheetVisible: Boolean = false, + val fiatSelectorBottomSheetVisible: Boolean = false, +) \ No newline at end of file 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 new file mode 100644 index 00000000..6b5428d5 --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsViewModel.kt @@ -0,0 +1,113 @@ +package com.brainwallet.ui.screens.settings + +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import androidx.lifecycle.viewModelScope +import com.brainwallet.BrainwalletApp +import com.brainwallet.data.model.AppSetting +import com.brainwallet.data.model.Language +import com.brainwallet.data.repository.SettingRepository +import com.brainwallet.ui.BrainwalletViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.flow.updateAndGet +import kotlinx.coroutines.launch + +class SettingsViewModel : BrainwalletViewModel() { + private val _state = MutableStateFlow(SettingsState()) + val state: StateFlow = _state.asStateFlow() + + private var settingRepository: SettingRepository = + BrainwalletApp.module!!.settingRepository + + private val appSetting = settingRepository.settings + .distinctUntilChanged() + .onEach { setting -> + _state.update { + it.copy( + darkMode = setting.isDarkMode, + selectedLanguage = Language.find(setting.languageCode), + selectedCurrency = setting.currency + ) + } + } + .stateIn( + viewModelScope, + SharingStarted.Eagerly, + AppSetting() + ) + + override fun onEvent(event: SettingsEvent) { + when (event) { + SettingsEvent.OnToggleDarkMode -> viewModelScope.launch { + _state.update { + val toggled = it.darkMode.not() + + settingRepository.save( + appSetting.value.copy( + isDarkMode = toggled + ) + ) + + it.copy(darkMode = toggled) + } + } + + SettingsEvent.OnFiatButtonClick -> _state.update { + it.copy(fiatSelectorBottomSheetVisible = true) + } + + SettingsEvent.OnLanguageSelectorButtonClick -> _state.update { + it.copy(languageSelectorBottomSheetVisible = true) + } + + SettingsEvent.OnFiatSelectorDismiss -> _state.update { + it.copy( + fiatSelectorBottomSheetVisible = false + ) + } + + SettingsEvent.OnLanguageSelectorDismiss -> _state.update { + it.copy( + languageSelectorBottomSheetVisible = false + ) + } + + is SettingsEvent.OnLanguageChange -> _state.updateAndGet { + it.copy( + selectedLanguage = event.language, + languageSelectorBottomSheetVisible = false + ) + }.let { + viewModelScope.launch { + settingRepository.save(appSetting.value.copy(languageCode = event.language.code)) + + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags( + event.language.code + ) + ) + + } + } + + is SettingsEvent.OnFiatChange -> _state.updateAndGet { + it.copy(selectedCurrency = event.currency, fiatSelectorBottomSheetVisible = false) + }.let { + viewModelScope.launch { + settingRepository.save( + appSetting.value.copy( + currency = event.currency + ) + ) + } + } + } + } +} \ No newline at end of file From a54b7ad40830adb00b95e946540915c7447e3cae Mon Sep 17 00:00:00 2001 From: andhikayuana Date: Wed, 5 Mar 2025 16:23:47 +0700 Subject: [PATCH 02/26] chore: wip setting compose compat with xml --- .../presenter/activities/BreadActivity.java | 15 +- .../composable/settingsrows/CurrencyDetail.kt | 2 - .../settingsrows/LitecoinBlockchainDetail.kt | 4 - .../composable/settingsrows/SecurityDetail.kt | 2 - .../home/composable/HomeSettingDrawerSheet.kt | 51 ++++ .../composable/settingsrows/CurrencyDetail.kt | 2 + .../composable/settingsrows/LanguageDetail.kt | 2 +- .../settingsrows/LitecoinBlockchainDetail.kt | 4 + .../settingsrows/SecurityRowItem.kt | 54 ++++ .../ui/screens/settings/SettingsScreen.kt | 2 +- .../java/com/brainwallet/ui/theme/Theme.kt | 5 + app/src/main/res/layout/activity_bread.xml | 271 ++++++++++-------- 12 files changed, 280 insertions(+), 134 deletions(-) delete mode 100644 app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt delete mode 100644 app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt delete mode 100644 app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt create mode 100644 app/src/main/java/com/brainwallet/ui/screens/home/composable/HomeSettingDrawerSheet.kt create mode 100644 app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/CurrencyDetail.kt rename app/src/main/java/com/brainwallet/ui/{ => screens/home}/composable/settingsrows/LanguageDetail.kt (97%) create mode 100644 app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt create mode 100644 app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/SecurityRowItem.kt diff --git a/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java b/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java index e2f42bdb..23df7a06 100644 --- a/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java +++ b/app/src/main/java/com/brainwallet/presenter/activities/BreadActivity.java @@ -28,12 +28,12 @@ import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; import androidx.core.app.ActivityCompat; +import androidx.drawerlayout.widget.DrawerLayout; import androidx.transition.ChangeBounds; import androidx.transition.Fade; import androidx.transition.TransitionManager; import androidx.transition.TransitionSet; -import com.brainwallet.BrainwalletApp; import com.brainwallet.R; import com.brainwallet.presenter.activities.util.BRActivity; import com.brainwallet.presenter.customviews.BRNotificationBar; @@ -53,11 +53,13 @@ import com.brainwallet.tools.util.BRExchange; import com.brainwallet.tools.util.ExtensionKt; import com.brainwallet.tools.util.Utils; +import com.brainwallet.ui.screens.home.composable.HomeSettingDrawerComposeView; import com.brainwallet.util.PermissionUtil; import com.brainwallet.wallet.BRPeerManager; import com.brainwallet.wallet.BRWalletManager; import com.google.android.gms.tasks.Task; import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.google.android.material.navigation.NavigationView; import com.google.android.play.core.review.ReviewInfo; import com.google.android.play.core.review.ReviewManager; import com.google.android.play.core.review.ReviewManagerFactory; @@ -90,6 +92,9 @@ public class BreadActivity extends BRActivity implements BRWalletManager.OnBalan private BottomNavigationView bottomNav; private Handler mHandler = new Handler(); + private NavigationView navigationDrawer; + private DrawerLayout drawerLayout; + private HomeSettingDrawerComposeView homeSettingDrawerComposeView; public static BreadActivity getApp() { return app; @@ -220,8 +225,7 @@ private void setListeners() { secondaryPrice.setOnClickListener(v -> swap()); menuBut.setOnClickListener(v -> { if (BRAnimator.isClickAllowed()) { - /// Calls a Composable - BRAnimator.showSettingsScreen(BreadActivity.this); + drawerLayout.open(); } }); } @@ -367,6 +371,11 @@ protected void onDestroy() { private void initializeViews() { menuBut = findViewById(R.id.menuBut); + + navigationDrawer = findViewById(R.id.navigationDrawer); + drawerLayout = findViewById(R.id.drawerLayout); + homeSettingDrawerComposeView = findViewById(R.id.homeDrawerComposeView); + bottomNav = findViewById(R.id.bottomNav); bottomNav.getMenu().clear(); bottomNav.inflateMenu(isInUsa() ? R.menu.bottom_nav_menu_us : R.menu.bottom_nav_menu); diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt deleted file mode 100644 index 4dd95a70..00000000 --- a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/CurrencyDetail.kt +++ /dev/null @@ -1,2 +0,0 @@ -package com.brainwallet.ui.composable.settingsrows - diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt deleted file mode 100644 index 7a56cd4b..00000000 --- a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LitecoinBlockchainDetail.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.brainwallet.ui.composable.settingsrows - -class LitecoinBlockchainDetail { -} \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt b/app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt deleted file mode 100644 index 4dd95a70..00000000 --- a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/SecurityDetail.kt +++ /dev/null @@ -1,2 +0,0 @@ -package com.brainwallet.ui.composable.settingsrows - diff --git a/app/src/main/java/com/brainwallet/ui/screens/home/composable/HomeSettingDrawerSheet.kt b/app/src/main/java/com/brainwallet/ui/screens/home/composable/HomeSettingDrawerSheet.kt new file mode 100644 index 00000000..7085de1b --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/screens/home/composable/HomeSettingDrawerSheet.kt @@ -0,0 +1,51 @@ +package com.brainwallet.ui.screens.home.composable + +import android.content.Context +import android.util.AttributeSet +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.material3.ModalDrawerSheet +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.AbstractComposeView +import androidx.compose.ui.unit.dp +import com.brainwallet.ui.screens.home.composable.settingsrows.SecurityRowItem +import com.brainwallet.ui.theme.BrainwalletAppTheme +import com.brainwallet.ui.theme.BrainwalletTheme + +@Composable +fun HomeSettingDrawerSheet( + modifier: Modifier = Modifier +) { + ModalDrawerSheet( + modifier = modifier.fillMaxWidth(), + drawerContainerColor = BrainwalletTheme.colors.surface, + drawerContentColor = BrainwalletTheme.colors.content + ) { + + Spacer(Modifier.height(70.dp)) //70.dp is hack since wa are using xml? + + //TODO + SecurityRowItem() + + + Spacer(Modifier.height(12.dp)) + + } +} + +/** + * for backward compat with XML, for now we are using XML + * will used by [activity_bread.xml] + */ + +class HomeSettingDrawerComposeView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null +) : AbstractComposeView(context, attrs) { + @Composable + override fun Content() { + BrainwalletAppTheme { HomeSettingDrawerSheet() } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/CurrencyDetail.kt b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/CurrencyDetail.kt new file mode 100644 index 00000000..457164d3 --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/CurrencyDetail.kt @@ -0,0 +1,2 @@ +package com.brainwallet.ui.screens.home.composable.settingsrows + diff --git a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LanguageDetail.kt b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LanguageDetail.kt similarity index 97% rename from app/src/main/java/com/brainwallet/ui/composable/settingsrows/LanguageDetail.kt rename to app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LanguageDetail.kt index 95a4391d..474c0b46 100644 --- a/app/src/main/java/com/brainwallet/ui/composable/settingsrows/LanguageDetail.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LanguageDetail.kt @@ -1,4 +1,4 @@ -package com.brainwallet.ui.composable.settingsrows +package com.brainwallet.ui.screens.home.composable.settingsrows import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer diff --git a/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt new file mode 100644 index 00000000..11f25295 --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt @@ -0,0 +1,4 @@ +package com.brainwallet.ui.screens.home.composable.settingsrows + +class LitecoinBlockchainDetail { +} \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/SecurityRowItem.kt b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/SecurityRowItem.kt new file mode 100644 index 00000000..bfc5e988 --- /dev/null +++ b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/SecurityRowItem.kt @@ -0,0 +1,54 @@ +package com.brainwallet.ui.screens.home.composable.settingsrows + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Column +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowDown +import androidx.compose.material.icons.filled.KeyboardArrowUp +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.MenuDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import com.brainwallet.ui.theme.BrainwalletTheme + +//TODO +@Composable +fun SecurityRowItem( + modifier: Modifier = Modifier +) { + var expanded by remember { mutableStateOf(false) } + + Column( + modifier = modifier + ) { + DropdownMenuItem( + colors = MenuDefaults.itemColors( + textColor = BrainwalletTheme.colors.content, + trailingIconColor = BrainwalletTheme.colors.content, + ), + text = { + Text("Security") + }, + onClick = { + expanded = expanded.not() + }, + trailingIcon = { + Icon( + if (expanded) Icons.Default.KeyboardArrowUp else Icons.Default.KeyboardArrowDown, + contentDescription = null + ) + } + ) + + AnimatedVisibility(visible = expanded) { + Text("TODO CONTENT HERE") + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt index db478707..ce5e3b74 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/settings/SettingsScreen.kt @@ -37,7 +37,7 @@ import com.brainwallet.navigation.OnNavigate import com.brainwallet.navigation.UiEffect import com.brainwallet.ui.composable.BrainwalletScaffold import com.brainwallet.ui.composable.BrainwalletTopAppBar -import com.brainwallet.ui.composable.settingsrows.LanguageDetail +import com.brainwallet.ui.screens.home.composable.settingsrows.LanguageDetail import com.brainwallet.ui.screens.welcome.WelcomeEvent import com.brainwallet.ui.screens.welcome.WelcomeViewModel diff --git a/app/src/main/java/com/brainwallet/ui/theme/Theme.kt b/app/src/main/java/com/brainwallet/ui/theme/Theme.kt index 315ab497..819eb43e 100644 --- a/app/src/main/java/com/brainwallet/ui/theme/Theme.kt +++ b/app/src/main/java/com/brainwallet/ui/theme/Theme.kt @@ -1,9 +1,11 @@ package com.brainwallet.ui.theme import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Typography import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.Immutable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ComposeView @@ -79,6 +81,9 @@ object BrainwalletTheme { @Composable get() = LocalBrainwalletColors.current + val typography: Typography + @Composable @ReadOnlyComposable get() = MaterialTheme.typography + //todo: add typography, shape? for the design system } diff --git a/app/src/main/res/layout/activity_bread.xml b/app/src/main/res/layout/activity_bread.xml index 5fb9763b..3804bc90 100644 --- a/app/src/main/res/layout/activity_bread.xml +++ b/app/src/main/res/layout/activity_bread.xml @@ -1,139 +1,168 @@ - - - + + - - + + + + android:clipToPadding="false" + android:descendantFocusability="beforeDescendants" + android:filterTouchesWhenObscured="true" + android:fitsSystemWindows="true" + android:focusableInTouchMode="true" + tools:context="com.brainwallet.presenter.activities.BreadActivity"> - + android:elevation="8dp" + android:orientation="vertical"> - - - - -