From 7e32fd5341df5a719d8f282a973d0f46aa335fcc Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 5 May 2023 18:04:58 +0800 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/common/extensions/Navigation.kt | 63 +++++++++++++++---- .../ui/WalletSelectorBottomSheetFragment.kt | 6 +- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt index efd80355aa..fbecc6daed 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt @@ -5,6 +5,7 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction import com.tangem.feature.referral.ReferralFragment import com.tangem.feature.swap.presentation.SwapFragment import com.tangem.tap.common.redux.navigation.AppScreen @@ -45,24 +46,35 @@ fun FragmentActivity.openFragment( bundle: Bundle? = null, fgShareTransition: FragmentShareTransition? = null, ) { - val transaction = this.supportFragmentManager.beginTransaction() - val fragment = fragmentFactory(screen) - fragment.arguments = bundle - fgShareTransition?.apply { - fragment.sharedElementEnterTransition = enterTransitionSet - fragment.sharedElementReturnTransition = exitTransitionSet - transaction.setReorderingAllowed(true) - shareElements.forEach { shareElement -> - shareElement.wView.get()?.let { view -> - transaction.addSharedElement(view, shareElement.elementName) + val transaction = supportFragmentManager.beginTransaction().apply { + setReorderingAllowed(true) + } + + val fragment = fragmentFactory(screen).apply { + arguments = bundle + + if (fgShareTransition != null) { + sharedElementEnterTransition = fgShareTransition.enterTransitionSet + sharedElementReturnTransition = fgShareTransition.exitTransitionSet + fgShareTransition.shareElements.forEach { shareElement -> + shareElement.wView.get()?.let { view -> + transaction.addSharedElement(view, shareElement.elementName) + } } } } + if (screen.isDialogFragment) { - (fragment as DialogFragment).show(transaction, screen.name) - if (addToBackstack) { - transaction.addToBackStack(screen.name) + val dialogFragment = requireNotNull(fragment as? DialogFragment) { + "If screen.isDialogFragment == true then fragment must be a DialogFragment" } + + dialogFragment.showAllowingStateLoss( + fragmentManager = supportFragmentManager, + baseTransaction = transaction, + tag = screen.name, + addToBackstack = addToBackstack, + ) } else { transaction.replace(R.id.fragment_container, fragment, screen.name) if (addToBackstack) { @@ -72,6 +84,29 @@ fun FragmentActivity.openFragment( } } +private fun DialogFragment.showAllowingStateLoss( + fragmentManager: FragmentManager, + baseTransaction: FragmentTransaction, + tag: String, + addToBackstack: Boolean, +) { + runCatching { + if (addToBackstack) baseTransaction.addToBackStack(tag) + show(baseTransaction, tag) + } + .onFailure { throwable -> + if (throwable is IllegalStateException) { + val transaction = fragmentManager.beginTransaction() + transaction.add(this, tag) + if (addToBackstack) transaction.addToBackStack(tag) + + transaction.commitAllowingStateLoss() + } else { + Timber.e(throwable) + } + } +} + fun FragmentActivity.popBackTo(screen: AppScreen?, inclusive: Boolean = false) { val inclusiveFlag = if (inclusive) FragmentManager.POP_BACK_STACK_INCLUSIVE else 0 try { @@ -119,6 +154,7 @@ private fun fragmentFactory(screen: AppScreen): Fragment { ) if (featureToggles.isRedesignedScreenEnabled) TokensListFragment() else AddTokensFragment() } + AppScreen.AddCustomToken -> { val featureToggles = store.state.daggerGraphState.get( getDependency = DaggerGraphState::customTokenFeatureToggles, @@ -129,6 +165,7 @@ private fun fragmentFactory(screen: AppScreen): Fragment { AddCustomTokenFragment() } } + AppScreen.WalletDetails -> WalletDetailsFragment() AppScreen.WalletConnectSessions -> WalletConnectFragment() AppScreen.QrScan -> QrScanFragment() diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt index 4f24d56193..ecb5291d26 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/WalletSelectorBottomSheetFragment.kt @@ -15,7 +15,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment -import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.rememberNestedScrollInteropConnection @@ -46,11 +45,8 @@ internal class WalletSelectorBottomSheetFragment : ComposeBottomSheetFragment { - return viewModel.state.collectAsState() - } + override fun provideState(): State = viewModel.state.collectAsState() - @OptIn(ExperimentalComposeUiApi::class) @Composable override fun ScreenContent(state: WalletSelectorScreenState, modifier: Modifier) { val snackbarHostState = remember { SnackbarHostState() }