From 477a3c11dd5c7f16b92cecf5b54451f7ccde14a9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 29 Dec 2024 12:08:14 +0300 Subject: [PATCH] Updated on 2026-08-14 --- features/tester/impl/build.gradle.kts | 6 +- .../tester/presentation/TesterActivity.kt | 28 ++++-- .../menu/state/TesterMenuContentState.kt | 17 ---- .../presentation/menu/state/TesterMenuUM.kt | 28 ++++++ .../presentation/menu/ui/TesterMenuScreen.kt | 85 +++++++++---------- .../presentation/navigation/TesterScreen.kt | 1 + .../impl/src/main/res/values/strings.xml | 1 + 7 files changed, 95 insertions(+), 71 deletions(-) delete mode 100644 features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuContentState.kt create mode 100644 features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuUM.kt diff --git a/features/tester/impl/build.gradle.kts b/features/tester/impl/build.gradle.kts index 6897aff661..86afbab205 100644 --- a/features/tester/impl/build.gradle.kts +++ b/features/tester/impl/build.gradle.kts @@ -15,14 +15,15 @@ dependencies { implementation(deps.androidx.activity.compose) /** Compose */ + implementation(deps.compose.accompanist.systemUiController) + implementation(deps.compose.foundation) implementation(deps.compose.material) implementation(deps.compose.material3) - implementation(deps.compose.foundation) implementation(deps.compose.navigation) implementation(deps.compose.navigation.hilt) implementation(deps.compose.ui) implementation(deps.compose.ui.tooling) - implementation(deps.compose.accompanist.systemUiController) + implementation(deps.compose.ui.utils) /** DI */ implementation(deps.hilt.android) @@ -52,5 +53,6 @@ dependencies { /** Other modules */ implementation(projects.common.routing) + implementation(projects.libs.blockchainSdk) implementation(projects.libs.crypto) } \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt index 4ae38f7c83..c96aac013a 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/TesterActivity.kt @@ -23,12 +23,14 @@ import com.tangem.feature.tester.presentation.excludedblockchains.ExcludedBlockc import com.tangem.feature.tester.presentation.excludedblockchains.ExcludedBlockchainsViewModel import com.tangem.feature.tester.presentation.featuretoggles.ui.FeatureTogglesScreen import com.tangem.feature.tester.presentation.featuretoggles.viewmodels.FeatureTogglesViewModel -import com.tangem.feature.tester.presentation.menu.state.TesterMenuContentState +import com.tangem.feature.tester.presentation.menu.state.TesterMenuUM +import com.tangem.feature.tester.presentation.menu.state.TesterMenuUM.ButtonUM import com.tangem.feature.tester.presentation.menu.ui.TesterMenuScreen import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter import com.tangem.feature.tester.presentation.navigation.TesterScreen import com.tangem.features.tester.api.TesterRouter import dagger.hilt.android.AndroidEntryPoint +import kotlinx.collections.immutable.persistentSetOf import javax.inject.Inject /** Activity for testers */ @@ -70,14 +72,26 @@ internal class TesterActivity : ComposeActivity() { NavHost(navController = navController, startDestination = TesterScreen.MENU.name) { composable(route = TesterScreen.MENU.name) { TesterMenuScreen( - state = TesterMenuContentState( + state = TesterMenuUM( onBackClick = { appRouter.pop { finish() } }, - onFeatureTogglesClick = { innerTesterRouter.open(TesterScreen.FEATURE_TOGGLES) }, - onEnvironmentTogglesClick = { innerTesterRouter.open(TesterScreen.ENVIRONMENTS_TOGGLES) }, - onExcludedBlockchainsClick = { - innerTesterRouter.open(TesterScreen.EXCLUDED_BLOCKCHAINS) + buttons = persistentSetOf( + ButtonUM.FEATURE_TOGGLES, + ButtonUM.EXCLUDED_BLOCKCHAINS, + ButtonUM.ENVIRONMENT_TOGGLES, + ButtonUM.BLOCKCHAIN_PROVIDERS, + ButtonUM.TESTER_ACTIONS, + ), + onButtonClick = { + val route = when (it) { + ButtonUM.FEATURE_TOGGLES -> TesterScreen.FEATURE_TOGGLES + ButtonUM.EXCLUDED_BLOCKCHAINS -> TesterScreen.EXCLUDED_BLOCKCHAINS + ButtonUM.ENVIRONMENT_TOGGLES -> TesterScreen.ENVIRONMENTS_TOGGLES + ButtonUM.BLOCKCHAIN_PROVIDERS -> TesterScreen.BLOCKCHAIN_PROVIDERS + ButtonUM.TESTER_ACTIONS -> TesterScreen.TESTER_ACTIONS + } + + innerTesterRouter.open(route) }, - onTesterActionsClick = { innerTesterRouter.open(TesterScreen.TESTER_ACTIONS) }, ), ) } diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuContentState.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuContentState.kt deleted file mode 100644 index 2dd6061286..0000000000 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuContentState.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.tangem.feature.tester.presentation.menu.state - -/** - * Content state of tester menu screen - * - * @property onBackClick the lambda to be invoked when back button is pressed - * @property onFeatureTogglesClick the lambda to be invoked when feature toggles button is pressed - * @property onEnvironmentTogglesClick the lambda to be invoked when environment toggles button is pressed - * @property onTesterActionsClick the lambda to be invoked when tester actions button is pressed - */ -data class TesterMenuContentState( - val onBackClick: () -> Unit, - val onFeatureTogglesClick: () -> Unit, - val onEnvironmentTogglesClick: () -> Unit, - val onExcludedBlockchainsClick: () -> Unit, - val onTesterActionsClick: () -> Unit, -) \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuUM.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuUM.kt new file mode 100644 index 0000000000..67750c8620 --- /dev/null +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/state/TesterMenuUM.kt @@ -0,0 +1,28 @@ +package com.tangem.feature.tester.presentation.menu.state + +import androidx.annotation.StringRes +import com.tangem.feature.tester.impl.R +import kotlinx.collections.immutable.ImmutableSet + +/** + * Content state of tester menu screen + * + * @property onBackClick the lambda to be invoked when back button is pressed + * @property buttons list of buttons + * @property onButtonClick the lambda to be invoked when tester button is pressed + */ +data class TesterMenuUM( + val onBackClick: () -> Unit, + val buttons: ImmutableSet, + val onButtonClick: (ButtonUM) -> Unit, +) { + + enum class ButtonUM(@StringRes val textResId: Int) { + FEATURE_TOGGLES(R.string.feature_toggles), + EXCLUDED_BLOCKCHAINS(R.string.excluded_blockchains), + ENVIRONMENT_TOGGLES(R.string.environment_toggles), + BLOCKCHAIN_PROVIDERS(R.string.blockchain_providers), + TESTER_ACTIONS(R.string.tester_actions), + ; + } +} \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/ui/TesterMenuScreen.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/ui/TesterMenuScreen.kt index 6e4b42119a..da2e67b08d 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/ui/TesterMenuScreen.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/menu/ui/TesterMenuScreen.kt @@ -2,71 +2,62 @@ package com.tangem.feature.tester.presentation.menu.ui import android.content.res.Configuration import androidx.activity.compose.BackHandler +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.PrimaryButton import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.feature.tester.impl.R -import com.tangem.feature.tester.presentation.menu.state.TesterMenuContentState +import com.tangem.feature.tester.presentation.menu.state.TesterMenuUM +import com.tangem.feature.tester.presentation.menu.state.TesterMenuUM.ButtonUM +import kotlinx.collections.immutable.persistentSetOf +import kotlinx.collections.immutable.toImmutableList /** * Screen with functionality for testers * * @param state screen state */ +@OptIn(ExperimentalFoundationApi::class) @Composable -internal fun TesterMenuScreen(state: TesterMenuContentState) { +internal fun TesterMenuScreen(state: TesterMenuUM) { BackHandler(onBack = state.onBackClick) - Column( + LazyColumn( modifier = Modifier .fillMaxSize() - .background(TangemTheme.colors.background.secondary), + .background(TangemTheme.colors.background.primary), ) { - AppBarWithBackButton( - onBackClick = state.onBackClick, - text = stringResourceSafe(id = R.string.tester_menu), - ) - - Column( - modifier = Modifier - .padding( - horizontal = TangemTheme.dimens.spacing18, - vertical = TangemTheme.dimens.spacing8, - ) - .verticalScroll(rememberScrollState()), - verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing16), - ) { - PrimaryButton( - text = stringResourceSafe(R.string.feature_toggles), - onClick = state.onFeatureTogglesClick, - modifier = Modifier.fillMaxWidth(), + stickyHeader { + AppBarWithBackButton( + onBackClick = state.onBackClick, + text = stringResourceSafe(id = R.string.tester_menu), + containerColor = TangemTheme.colors.background.primary, ) + } + items( + items = state.buttons.toImmutableList(), + key = ButtonUM::textResId, + contentType = { "button" }, + ) { button -> PrimaryButton( - modifier = Modifier.fillMaxWidth(), - text = stringResourceSafe(R.string.excluded_blockchains), - onClick = state.onExcludedBlockchainsClick, - ) - - PrimaryButton( - text = stringResourceSafe(R.string.environment_toggles), - onClick = state.onEnvironmentTogglesClick, - modifier = Modifier.fillMaxWidth(), - ) - - PrimaryButton( - modifier = Modifier.fillMaxWidth(), - text = stringResourceSafe(id = R.string.tester_actions), - onClick = state.onTesterActionsClick, + text = stringResourceSafe(button.textResId), + onClick = { state.onButtonClick(button) }, + modifier = Modifier + .padding(horizontal = 16.dp, vertical = 8.dp) + .fillMaxWidth(), ) } } @@ -78,12 +69,16 @@ internal fun TesterMenuScreen(state: TesterMenuContentState) { private fun PreviewTesterMenuScreen() { TangemThemePreview { TesterMenuScreen( - state = TesterMenuContentState( + state = TesterMenuUM( onBackClick = {}, - onFeatureTogglesClick = {}, - onEnvironmentTogglesClick = {}, - onExcludedBlockchainsClick = {}, - onTesterActionsClick = {}, + buttons = persistentSetOf( + ButtonUM.FEATURE_TOGGLES, + ButtonUM.EXCLUDED_BLOCKCHAINS, + ButtonUM.ENVIRONMENT_TOGGLES, + ButtonUM.BLOCKCHAIN_PROVIDERS, + ButtonUM.TESTER_ACTIONS, + ), + onButtonClick = {}, ), ) } diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/navigation/TesterScreen.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/navigation/TesterScreen.kt index 5c501ce531..4e5ba7097d 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/navigation/TesterScreen.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/navigation/TesterScreen.kt @@ -11,4 +11,5 @@ internal enum class TesterScreen { ENVIRONMENTS_TOGGLES, TESTER_ACTIONS, EXCLUDED_BLOCKCHAINS, + BLOCKCHAIN_PROVIDERS, } \ No newline at end of file diff --git a/features/tester/impl/src/main/res/values/strings.xml b/features/tester/impl/src/main/res/values/strings.xml index 95ad57f1ad..ae85c60e3b 100644 --- a/features/tester/impl/src/main/res/values/strings.xml +++ b/features/tester/impl/src/main/res/values/strings.xml @@ -11,4 +11,5 @@ Toggle app theme - %s Excluded blockchains Filter by name or symbol + Blockchain providers