Updated on 2026-08-14
This commit is contained in:
parent
e5876470de
commit
91c52c039c
17 changed files with 398 additions and 13 deletions
10
features/tester/impl/src/main/AndroidManifest.xml
Normal file
10
features/tester/impl/src/main/AndroidManifest.xml
Normal 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>
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
)
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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 = {},
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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 = {},
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
6
features/tester/impl/src/main/res/values/strings.xml
Normal file
6
features/tester/impl/src/main/res/values/strings.xml
Normal 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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue