diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index b7c9ad608a..5ef7c985a6 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -15,7 +15,6 @@ import com.tangem.operations.backup.BackupService import com.tangem.tangem_sdk_new.extensions.init import com.tangem.tap.common.ActivityResultCallbackHolder import com.tangem.tap.common.DialogManager -import com.tangem.tap.common.IntentHandler import com.tangem.tap.common.OnActivityResultCallback import com.tangem.tap.common.SnackbarHandler import com.tangem.tap.common.extensions.dispatchOnMain @@ -29,6 +28,7 @@ import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.domain.userWalletList.UserWalletsListManager import com.tangem.tap.domain.userWalletList.di.provideBiometricImplementation import com.tangem.tap.features.shop.redux.ShopAction +import com.tangem.tap.features.welcome.redux.WelcomeAction import com.tangem.tap.proxy.AppStateHolder import com.tangem.wallet.R import com.tangem.wallet.databinding.ActivityMainBinding @@ -66,7 +66,6 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac private var snackbar: Snackbar? = null private val dialogManager = DialogManager() - private val intentHandler = IntentHandler() private val binding: ActivityMainBinding by viewBinding(ActivityMainBinding::bind) private val onActivityResultCallbacks = mutableListOf() @@ -119,16 +118,23 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac val isOnboardingServiceActive = store.state.globalState.onboardingState.onboardingStarted val shopOpened = store.state.shopState.total != null if (backStackIsEmpty || (!isOnboardingServiceActive && !isScannedBefore && !shopOpened)) { - val navigateTo = if (userWalletsListManager.hasSavedUserWallets) AppScreen.Welcome else AppScreen.Home - - store.dispatchOnMain(NavigationAction.NavigateTo(navigateTo)) + if (userWalletsListManager.hasSavedUserWallets) { + store.dispatchOnMain(WelcomeAction.HandleDeepLink(intent)) + store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Welcome)) + } else { + store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Home)) + intentHandler.handleWalletConnectLink(intent) + } } - intentHandler.handleIntent(intent) + intentHandler.handleBackgroundScan(intent) + intentHandler.handleSellCurrencyCallback(intent) } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) - intentHandler.handleIntent(intent) + intentHandler.handleBackgroundScan(intent) + intentHandler.handleSellCurrencyCallback(intent) + intentHandler.handleWalletConnectLink(intent) } override fun onStart() { diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index d17e83bd33..0d483b43ee 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -16,6 +16,7 @@ import com.tangem.domain.DomainLayer import com.tangem.domain.common.LogConfig import com.tangem.tap.common.AndroidAssetReader import com.tangem.tap.common.AssetReader +import com.tangem.tap.common.IntentHandler import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder @@ -109,6 +110,7 @@ val walletCurrenciesManager by lazy { val totalFiatBalanceCalculator by lazy { TotalFiatBalanceCalculator.provideDefaultImplementation() } +val intentHandler by lazy { IntentHandler() } @HiltAndroidApp class TapApplication : Application(), ImageLoaderFactory { diff --git a/app/src/main/java/com/tangem/tap/common/IntentHandler.kt b/app/src/main/java/com/tangem/tap/common/IntentHandler.kt index 1e41053369..cfee84fd69 100644 --- a/app/src/main/java/com/tangem/tap/common/IntentHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/IntentHandler.kt @@ -19,13 +19,13 @@ class IntentHandler { private val CURRENCY_AMOUNT_PARAM = "baseCurrencyAmount" private val DEPOSIT_WALLET_ADDRESS_PARAM = "depositWalletAddress" - fun handleIntent(intent: Intent?) { - handleBackgroundScan(intent) - handleWalletConnectLink(intent) - handleSellCurrencyCallback(intent) + fun handleWalletConnectLink(intent: Intent?) { + if (intent?.scheme == WalletConnectManager.WC_SCHEME) { + store.dispatch(WalletConnectAction.HandleDeepLink(intent.data?.toString())) + } } - private fun handleBackgroundScan(intent: Intent?) { + fun handleBackgroundScan(intent: Intent?) { if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action ) @@ -40,13 +40,7 @@ class IntentHandler { } } - private fun handleWalletConnectLink(intent: Intent?) { - if (intent?.scheme == WalletConnectManager.WC_SCHEME) { - store.dispatch(WalletConnectAction.HandleDeepLink(intent.data?.toString())) - } - } - - private fun handleSellCurrencyCallback(intent: Intent?) { + fun handleSellCurrencyCallback(intent: Intent?) { try { val transactionID = intent?.data?.getQueryParameter(TRANSACTION_ID_PARAM) ?: return diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt index f68e5122d7..681a3cea77 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeAction.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.welcome.redux +import android.content.Intent import com.tangem.common.core.TangemError import org.rekotlin.Action @@ -14,5 +15,7 @@ internal sealed interface WelcomeAction : Action { data class Error(val error: TangemError) : WelcomeAction } + data class HandleDeepLink(val intent: Intent?) : WelcomeAction + object CloseError : WelcomeAction } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt index 9e18faf7c0..88c0038a3c 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeMiddleware.kt @@ -1,5 +1,6 @@ package com.tangem.tap.features.welcome.redux +import android.content.Intent import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.domain.common.ScanResponse @@ -10,6 +11,7 @@ import com.tangem.tap.common.redux.navigation.AppScreen import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.domain.model.builders.UserWalletBuilder import com.tangem.tap.domain.scanCard.ScanCardProcessor +import com.tangem.tap.intentHandler import com.tangem.tap.preferencesStorage import com.tangem.tap.scope import com.tangem.tap.store @@ -19,30 +21,37 @@ import kotlinx.coroutines.launch import org.rekotlin.Middleware internal class WelcomeMiddleware { - val middleware: Middleware = { _, _ -> + val middleware: Middleware = { _, appStateProvider -> { next -> { action -> - if (action is WelcomeAction) { - handleAction(action) + val appState = appStateProvider() + if (action is WelcomeAction && appState != null) { + handleAction(action, appState.welcomeState) } next(action) } } } - private fun handleAction(action: WelcomeAction) { + private fun handleAction(action: WelcomeAction, state: WelcomeState) { when (action) { - is WelcomeAction.ProceedWithBiometrics -> proceedWithBiometry() - is WelcomeAction.ProceedWithCard -> proceedWithCard() - is WelcomeAction.ProceedWithBiometrics.Error -> Unit - is WelcomeAction.ProceedWithCard.Error -> Unit - is WelcomeAction.ProceedWithBiometrics.Success -> Unit - is WelcomeAction.ProceedWithCard.Success -> Unit - is WelcomeAction.CloseError -> Unit + is WelcomeAction.ProceedWithBiometrics -> { + proceedWithBiometry(state) + } + is WelcomeAction.ProceedWithCard -> { + proceedWithCard(state) + } + is WelcomeAction.ProceedWithBiometrics.Error, + is WelcomeAction.ProceedWithCard.Error, + is WelcomeAction.ProceedWithBiometrics.Success, + is WelcomeAction.ProceedWithCard.Success, + is WelcomeAction.CloseError, + is WelcomeAction.HandleDeepLink, + -> Unit } } - private fun proceedWithBiometry() { + private fun proceedWithBiometry(state: WelcomeState) { scope.launch { userWalletsListManager.unlockWithBiometry() .doOnFailure { error -> @@ -58,12 +67,14 @@ internal class WelcomeMiddleware { store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet)) store.dispatchOnMain(WelcomeAction.ProceedWithBiometrics.Success) store.onUserWalletSelected(selectedUserWallet) + + handleDeepLinkIfNeeded(state.deepLinkIntent) } } } } - private fun proceedWithCard() = scope.launch { + private fun proceedWithCard(state: WelcomeState) = scope.launch { scanCardInternal { scanResponse -> val userWallet = UserWalletBuilder(scanResponse).build() @@ -78,10 +89,16 @@ internal class WelcomeMiddleware { store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Wallet)) store.dispatchOnMain(WelcomeAction.ProceedWithCard.Success) store.onUserWalletSelected(userWallet) + + handleDeepLinkIfNeeded(state.deepLinkIntent) } } } + private fun handleDeepLinkIfNeeded(intent: Intent?) { + intentHandler.handleWalletConnectLink(intent) + } + private suspend inline fun scanCardInternal( crossinline onCardScanned: suspend (ScanResponse) -> Unit, ) { diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt index d5f3e0276b..42a6d4d0e1 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeReducer.kt @@ -12,6 +12,7 @@ internal object WelcomeReducer { private fun internalReduce(action: WelcomeAction, state: WelcomeState): WelcomeState { return when (action) { + is WelcomeAction.HandleDeepLink -> state.copy(deepLinkIntent = action.intent) is WelcomeAction.ProceedWithBiometrics -> state.copy(isUnlockWithBiometricsInProgress = true) is WelcomeAction.ProceedWithCard -> state.copy(isUnlockWithCardInProgress = true) is WelcomeAction.ProceedWithBiometrics.Error -> state.copy( diff --git a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt index a4fce23f93..f40046600d 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/redux/WelcomeState.kt @@ -1,10 +1,12 @@ package com.tangem.tap.features.welcome.redux +import android.content.Intent import com.tangem.common.core.TangemError import org.rekotlin.StateType data class WelcomeState( val isUnlockWithBiometricsInProgress: Boolean = false, val isUnlockWithCardInProgress: Boolean = false, + val deepLinkIntent: Intent? = null, val error: TangemError? = null, ) : StateType \ No newline at end of file