From facf309dc6e39a55f3710d1c4122327130c326c8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 4 Aug 2022 12:36:12 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../features/details/redux/DetailsReducer.kt | 9 +-- .../ui/cardsettings/CardSettingsFragment.kt | 11 ++- .../ui/cardsettings/CardSettingsScreen.kt | 4 +- .../cardsettings/CardSettingsScreenState.kt | 74 +++++++++++++++---- .../ui/cardsettings/CardSettingsViewModel.kt | 55 +++++--------- .../ui/common/DetailsComposeElements.kt | 1 - .../details/ui/details/DetailsFragment.kt | 5 +- .../details/ui/details/DetailsViewModel.kt | 2 +- .../details/ui/resetcard/ResetCardFragment.kt | 5 +- .../ui/securitymode/SecurityModeFragment.kt | 5 +- 10 files changed, 93 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt index 72a47793f6..99024b0c20 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsReducer.kt @@ -23,10 +23,10 @@ private fun internalReduce(action: Action, state: AppState): DetailsState { val detailsState = state.detailsState return when (action) { is DetailsAction.PrepareScreen -> { - handlePrepareScreen(action, detailsState) + handlePrepareScreen(action) } is DetailsAction.PrepareCardSettingsData -> { - hanldePrepareCardSettingsScreen(action.card, detailsState) + handlePrepareCardSettingsScreen(action.card, detailsState) } is DetailsAction.ResetCardSettingsData -> detailsState.copy(cardSettingsState = null) is DetailsAction.ResetToFactory -> { @@ -47,7 +47,6 @@ private fun internalReduce(action: Action, state: AppState): DetailsState { private fun handlePrepareScreen( action: DetailsAction.PrepareScreen, - state: DetailsState, ): DetailsState { return DetailsState( @@ -59,9 +58,7 @@ private fun handlePrepareScreen( ) } -private fun hanldePrepareCardSettingsScreen( - card: Card, state: DetailsState, -): DetailsState { +private fun handlePrepareCardSettingsScreen(card: Card, state: DetailsState): DetailsState { val cardSettingsState = CardSettingsState( cardInfo = card.toCardInfo(), manageSecurityState = prepareSecurityOptions(card), diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsFragment.kt index f58e5dcd77..a679020e84 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsFragment.kt @@ -14,7 +14,6 @@ import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.details.redux.DetailsAction import com.tangem.tap.features.details.redux.DetailsState import com.tangem.tap.store -import com.tangem.wallet.R import org.rekotlin.StoreSubscriber class CardSettingsFragment : Fragment(), StoreSubscriber { @@ -22,21 +21,21 @@ class CardSettingsFragment : Fragment(), StoreSubscriber { private val viewModel = CardSettingsViewModel(store) private var screenState: MutableState = - mutableStateOf(viewModel.updateState(store.state.detailsState.cardSettingsState, context)) + mutableStateOf(viewModel.updateState(store.state.detailsState.cardSettingsState)) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val inflater = TransitionInflater.from(requireContext()) - enterTransition = inflater.inflateTransition(R.transition.slide_right) - exitTransition = inflater.inflateTransition(R.transition.fade) + enterTransition = inflater.inflateTransition(android.R.transition.fade) + exitTransition = inflater.inflateTransition(android.R.transition.fade) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, - ): View? { + ): View { return ComposeView(requireContext()).apply { setContent { isTransitionGroup = true @@ -69,6 +68,6 @@ class CardSettingsFragment : Fragment(), StoreSubscriber { override fun newState(state: DetailsState) { if (activity == null || view == null) return - screenState.value = viewModel.updateState(state.cardSettingsState, context) + screenState.value = viewModel.updateState(state.cardSettingsState) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt index 37fe4e5ab9..92eec4c59b 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreen.kt @@ -145,13 +145,13 @@ fun CardSettings( val titleColor = if (it.clickable) R.color.text_primary_1 else R.color.text_tertiary val subtitleColor = if (it.clickable) R.color.text_secondary else R.color.text_tertiary Text( - text = stringResource(id = it.titleRes), + text = it.titleRes.resolveReference(), color = colorResource(id = titleColor), style = TangemTypography.subtitle1, ) Spacer(modifier = modifier.size(4.dp)) Text( - text = it.subtitle, + text = it.subtitle.resolveReference(), color = colorResource(id = subtitleColor), style = TangemTypography.body2, ) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreenState.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreenState.kt index 422cad9ae2..7a74e5ec20 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreenState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsScreenState.kt @@ -1,5 +1,11 @@ package com.tangem.tap.features.details.ui.cardsettings +import androidx.annotation.StringRes +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.ui.res.stringResource +import com.tangem.tap.features.details.redux.SecurityOption +import com.tangem.tap.features.details.ui.securitymode.toTitleRes import com.tangem.wallet.R data class CardSettingsScreenState( @@ -9,28 +15,66 @@ data class CardSettingsScreenState( ) sealed class CardInfo( - val titleRes: Int, val subtitle: String, val clickable: Boolean = false, + val titleRes: TextReference, val subtitle: TextReference, val clickable: Boolean = false, ) { - class CardId(subtitle: String) : CardInfo(R.string.details_row_title_cid, subtitle) + class CardId(subtitle: String) : CardInfo( + titleRes = TextReference.Res(R.string.details_row_title_cid), + subtitle = TextReference + .Str(subtitle), + ) - class Issuer(subtitle: String) : CardInfo(R.string.details_row_title_issuer, subtitle) + class Issuer(subtitle: String) : CardInfo( + titleRes = TextReference.Res(R.string.details_row_title_issuer), + subtitle = TextReference + .Str(subtitle), + ) - class SignedHashes(subtitle: String) : CardInfo(R.string.details_row_title_signed_hashes, subtitle) + class SignedHashes(hashes: String) : CardInfo( + titleRes = TextReference.Res(R.string.details_row_title_signed_hashes), + subtitle = TextReference.Res(R.string.details_row_subtitle_signed_hashes_format, hashes), + ) class SecurityMode( - subtitle: String, + securityOption: SecurityOption, clickable: Boolean, - ) : CardInfo(R.string.card_settings_security_mode, subtitle, clickable) - - class ChangeAccessCode(subtitle: String) : CardInfo( - R.string.card_settings_change_access_code, - subtitle, - true, + ) : CardInfo( + titleRes = TextReference.Res(R.string.card_settings_security_mode), + subtitle = TextReference.Res(securityOption.toTitleRes()), + clickable = clickable, ) - class ResetToFactorySettings(subtitle: String) : CardInfo( - R.string.details_row_title_reset_factory_settings, - subtitle, - true, + object ChangeAccessCode : CardInfo( + titleRes = TextReference.Res(R.string.card_settings_change_access_code), + subtitle = TextReference.Res(R.string.card_settings_change_access_code_footer), + clickable = true, ) + + object ResetToFactorySettings : CardInfo( + titleRes = TextReference.Res(R.string.details_row_title_reset_factory_settings), + subtitle = TextReference.Res(R.string.card_settings_reset_factory_footer), + clickable = true, + ) +} + +sealed interface TextReference { + class Res(@StringRes val id: Int, val formatArgs: List = emptyList()) : TextReference { + constructor(@StringRes id: Int, vararg formatArgs: Any) : this(id, formatArgs.toList()) + } + + class Str(val value: String) : TextReference +} + +@Composable +@ReadOnlyComposable +fun TextReference.resolveReference(): String { + return when (this) { + is TextReference.Res -> { + // if (source.formatArgs) { + // stringResource(source.id) + // } else { + stringResource(this.id, *this.formatArgs.toTypedArray()) + // } + } + is TextReference.Str -> this.value + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt index 46da4c5d72..a90886ff81 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt @@ -1,6 +1,5 @@ package com.tangem.tap.features.details.ui.cardsettings -import android.content.Context import com.tangem.domain.common.getTwinCardIdForUser import com.tangem.domain.common.isTangemTwins import com.tangem.tap.common.redux.AppState @@ -8,13 +7,11 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.details.redux.CardSettingsState import com.tangem.tap.features.details.redux.DetailsAction -import com.tangem.tap.features.details.ui.securitymode.toTitleRes -import com.tangem.wallet.R import org.rekotlin.Store class CardSettingsViewModel(private val store: Store) { - fun updateState(state: CardSettingsState?, context: Context?): CardSettingsScreenState { + fun updateState(state: CardSettingsState?): CardSettingsScreenState { return if (state?.manageSecurityState == null) { CardSettingsScreenState( @@ -30,43 +27,25 @@ class CardSettingsViewModel(private val store: Store) { } else { state.cardInfo.cardId } - val cardDetails: MutableList = listOfNotNull( + val cardDetails: MutableList = mutableListOf( CardInfo.CardId(cardId), CardInfo.Issuer(state.cardInfo.issuer), - ).toMutableList() + ) - context?.let { context -> - if (!state.card.isTangemTwins()) { - cardDetails.add( - CardInfo.SignedHashes( - context - .getString( - R.string.details_row_subtitle_signed_hashes_format, - state.cardInfo.signedHashes.toString(), - ), - ), - ) - } - cardDetails.add( - CardInfo.SecurityMode( - subtitle = context.getString(state.manageSecurityState.currentOption.toTitleRes()), - clickable = state.manageSecurityState.allowedOptions.size > 1, - ), - ) - if (state.card.backupStatus?.isActive == true && state.card.isAccessCodeSet) { - cardDetails.add( - CardInfo.ChangeAccessCode( - subtitle = context.getString(R.string.card_settings_change_access_code_footer), - ), - ) - } - if (state.resetCardAllowed) { - cardDetails.add( - CardInfo.ResetToFactorySettings( - subtitle = context.getString(R.string.card_settings_reset_factory_footer), - ), - ) - } + if (!state.card.isTangemTwins()) { + cardDetails.add(CardInfo.SignedHashes(state.cardInfo.signedHashes.toString())) + } + cardDetails.add( + CardInfo.SecurityMode( + securityOption = state.manageSecurityState.currentOption, + clickable = state.manageSecurityState.allowedOptions.size > 1, + ), + ) + if (state.card.backupStatus?.isActive == true && state.card.isAccessCodeSet) { + cardDetails.add(CardInfo.ChangeAccessCode) + } + if (state.resetCardAllowed) { + cardDetails.add(CardInfo.ResetToFactorySettings) } CardSettingsScreenState( diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt b/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt index 81ae1a11dc..a0117d0fdc 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/common/DetailsComposeElements.kt @@ -81,7 +81,6 @@ fun EmptyTopBarWithNavigation( }, backgroundColor = colorResource(id = R.color.background_primary), elevation = 0.dp, - modifier = modifier, ) } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt index 30a8fa4533..6674371319 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsFragment.kt @@ -13,7 +13,6 @@ import com.google.accompanist.appcompattheme.AppCompatTheme import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.details.redux.DetailsState import com.tangem.tap.store -import com.tangem.wallet.R import org.rekotlin.StoreSubscriber class DetailsFragment : Fragment(), StoreSubscriber { @@ -27,8 +26,8 @@ class DetailsFragment : Fragment(), StoreSubscriber { super.onCreate(savedInstanceState) val inflater = TransitionInflater.from(requireContext()) - enterTransition = inflater.inflateTransition(R.transition.slide_right) - exitTransition = inflater.inflateTransition(R.transition.fade) + enterTransition = inflater.inflateTransition(android.R.transition.fade) + exitTransition = inflater.inflateTransition(android.R.transition.fade) } override fun onCreateView( diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt index d458556260..9e6dc602e2 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsViewModel.kt @@ -60,7 +60,7 @@ class DetailsViewModel(private val store: Store) { store.dispatch(NavigationAction.NavigateTo(AppScreen.CardSettings)) } SettingsElement.AppSettings -> { - // store.dispatch(NavigationAction.NavigateTo()) TODO: To be available later + store.dispatch(NavigationAction.NavigateTo(AppScreen.AppSettings)) //TODO: To be available later } SettingsElement.LinkMoreCards -> { store.dispatch(DetailsAction.CreateBackup) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardFragment.kt index 9cf655653e..fa63874859 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/resetcard/ResetCardFragment.kt @@ -13,7 +13,6 @@ import com.google.accompanist.appcompattheme.AppCompatTheme import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.details.redux.DetailsState import com.tangem.tap.store -import com.tangem.wallet.R import org.rekotlin.StoreSubscriber class ResetCardFragment : Fragment(), StoreSubscriber { @@ -27,8 +26,8 @@ class ResetCardFragment : Fragment(), StoreSubscriber { super.onCreate(savedInstanceState) val inflater = TransitionInflater.from(requireContext()) - enterTransition = inflater.inflateTransition(R.transition.slide_right) - exitTransition = inflater.inflateTransition(R.transition.fade) + enterTransition = inflater.inflateTransition(android.R.transition.fade) + exitTransition = inflater.inflateTransition(android.R.transition.fade) } override fun onCreateView( diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeFragment.kt index e57337eb80..96d55a808a 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeFragment.kt @@ -13,7 +13,6 @@ import com.google.accompanist.appcompattheme.AppCompatTheme import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.details.redux.DetailsState import com.tangem.tap.store -import com.tangem.wallet.R import org.rekotlin.StoreSubscriber class SecurityModeFragment : Fragment(), StoreSubscriber { @@ -27,8 +26,8 @@ class SecurityModeFragment : Fragment(), StoreSubscriber { super.onCreate(savedInstanceState) val inflater = TransitionInflater.from(requireContext()) - enterTransition = inflater.inflateTransition(R.transition.slide_right) - exitTransition = inflater.inflateTransition(R.transition.fade) + enterTransition = inflater.inflateTransition(android.R.transition.fade) + exitTransition = inflater.inflateTransition(android.R.transition.fade) } override fun onCreateView(