Updated on 2026-08-14

This commit is contained in:
Tangem 2023-02-07 17:32:08 +08:00
parent e5876470de
commit 91c52c039c
17 changed files with 398 additions and 13 deletions

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tangem.feature.tester.impl">
<application>
<activity
android:name="com.tangem.feature.tester.presentation.TesterActivity"
android:exported="false" />
</application>
</manifest>

View file

@ -0,0 +1,17 @@
package com.tangem.feature.tester.presentation
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import dagger.hilt.android.AndroidEntryPoint
/** Activity for testers */
@AndroidEntryPoint
internal class TesterActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
// TODO("2949") add logic to screens
}
}
}

View file

@ -0,0 +1,14 @@
package com.tangem.feature.tester.presentation.featuretoggles.models
/**
* Presentation model of feature toggle
*
* @property name name
* @property isEnabled availability
*
[REDACTED_AUTHOR]
*/
data class TesterFeatureToggle(
val name: String,
val isEnabled: Boolean
)

View file

@ -0,0 +1,24 @@
package com.tangem.feature.tester.presentation.featuretoggles.state
import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle
/**
* State holder of feature toggles screen
*
[REDACTED_AUTHOR]
*/
sealed interface FeatureTogglesStateHolder {
/**
* Content
*
* @property featureToggles feature toggles list
* @property onToggleValueChange the lambda to be invoked when switch button is pressed
* @property onBackClicked the lambda to be invoked when back button is pressed
*/
data class Content(
val onBackClicked: () -> Unit,
val featureToggles: List<TesterFeatureToggle>,
val onToggleValueChange: (String, Boolean) -> Unit,
) : FeatureTogglesStateHolder
}

View file

@ -0,0 +1,119 @@
package com.tangem.feature.tester.presentation.featuretoggles.ui
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
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.material.Switch
import androidx.compose.material.SwitchDefaults
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.components.appbar.AppBarWithBackButton
import com.tangem.core.ui.res.TangemTheme
import com.tangem.feature.tester.impl.R
import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle
import com.tangem.feature.tester.presentation.featuretoggles.state.FeatureTogglesStateHolder
/**
* Screen with feature toggles list
*
* @param stateHolder screen state
*/
@Composable
fun FeatureTogglesScreen(stateHolder: FeatureTogglesStateHolder) {
when (stateHolder) {
is FeatureTogglesStateHolder.Content -> FeatureTogglesContent(content = stateHolder)
}
}
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun FeatureTogglesContent(content: FeatureTogglesStateHolder.Content) {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.background(TangemTheme.colors.background.secondary),
) {
stickyHeader {
AppBarWithBackButton(
onBackClick = content.onBackClicked,
text = stringResource(id = R.string.feature_toggles),
)
}
items(content.featureToggles) { featureToggle ->
FeatureToggleItem(
toggle = featureToggle,
onCheckedChange = { isChange -> content.onToggleValueChange(featureToggle.name, isChange) },
)
}
}
}
@Composable
private fun FeatureToggleItem(toggle: TesterFeatureToggle, onCheckedChange: (Boolean) -> Unit) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = TangemTheme.dimens.spacing18),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = toggle.name,
color = TangemTheme.colors.text.primary1,
maxLines = 1,
style = TangemTheme.typography.body1,
)
Switch(
checked = toggle.isEnabled,
onCheckedChange = onCheckedChange,
colors = SwitchDefaults.colors(
checkedThumbColor = TangemTheme.colors.control.checked,
uncheckedThumbColor = TangemTheme.colors.control.unchecked,
),
)
}
}
@Preview
@Composable
private fun PreviewFeatureTogglesScreen_InLightTheme() {
TangemTheme(isDark = false) {
FeatureTogglesScreen(
stateHolder = FeatureTogglesStateHolder.Content(
featureToggles = listOf(
TesterFeatureToggle(name = "FEATURE_TOGGLE_1", isEnabled = true),
TesterFeatureToggle(name = "FEATURE_TOGGLE_2", isEnabled = false),
),
onToggleValueChange = { _, _ -> },
onBackClicked = {},
),
)
}
}
@Preview
@Composable
private fun PreviewFeatureTogglesScreen_InDarkTheme() {
TangemTheme(isDark = true) {
FeatureTogglesScreen(
stateHolder = FeatureTogglesStateHolder.Content(
featureToggles = listOf(
TesterFeatureToggle(name = "FEATURE_TOGGLE_1", isEnabled = true),
TesterFeatureToggle(name = "FEATURE_TOGGLE_2", isEnabled = false),
),
onToggleValueChange = { _, _ -> },
onBackClicked = {},
),
)
}
}

View file

@ -0,0 +1,20 @@
package com.tangem.feature.tester.presentation.menu.state
/**
* State holder of tester menu screen
*
[REDACTED_AUTHOR]
*/
sealed interface TesterMenuStateHolder {
/**
* Content
*
* @property onBackClicked the lambda to be invoked when back button is pressed
* @property onFeatureTogglesClicked the lambda to be invoked when feature toggles button is pressed
*/
data class Content(
val onBackClicked: () -> Unit,
val onFeatureTogglesClicked: () -> Unit
) : TesterMenuStateHolder
}

View file

@ -0,0 +1,92 @@
package com.tangem.feature.tester.presentation.menu.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.components.PrimaryButton
import com.tangem.core.ui.components.appbar.AppBarWithBackButton
import com.tangem.core.ui.res.TangemTheme
import com.tangem.feature.tester.impl.R
import com.tangem.feature.tester.presentation.menu.state.TesterMenuStateHolder
/**
* Screen with functionality for testers
*
* @param stateHolder screen state
*/
@Composable
fun TesterMenuScreen(stateHolder: TesterMenuStateHolder) {
when (stateHolder) {
is TesterMenuStateHolder.Content -> TesterMenuContent(content = stateHolder)
}
}
@Composable
private fun TesterMenuContent(content: TesterMenuStateHolder.Content) {
Column(
modifier = Modifier
.fillMaxSize()
.background(TangemTheme.colors.background.secondary),
) {
AppBarWithBackButton(
onBackClick = content.onBackClicked,
text = stringResource(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 = stringResource(R.string.feature_toggles),
onClick = content.onFeatureTogglesClicked,
modifier = Modifier.fillMaxWidth(),
)
PrimaryButton(
text = stringResource(R.string.stand_toggles),
onClick = content.onFeatureTogglesClicked,
modifier = Modifier.fillMaxWidth(),
enabled = false,
)
}
}
}
@Preview
@Composable
private fun PreviewTesterMenuScreen_InLightTheme() {
TangemTheme(isDark = false) {
TesterMenuScreen(
stateHolder = TesterMenuStateHolder.Content(
onBackClicked = {},
onFeatureTogglesClicked = {},
),
)
}
}
@Preview
@Composable
private fun PreviewTesterMenuScreen_InDarkTheme() {
TangemTheme(isDark = true) {
TesterMenuScreen(
stateHolder = TesterMenuStateHolder.Content(
onBackClicked = {},
onFeatureTogglesClicked = {},
),
)
}
}

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tester_menu" translatable="false">Tester menu</string>
<string name="feature_toggles" translatable="false">Feature toggles</string>
<string name="stand_toggles" translatable="false">Stand toggles</string>
</resources>