diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt index e19202bf4f..a42cc3568e 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/MainScreen.kt @@ -14,6 +14,11 @@ sealed class MainScreen( class CardWasScanned : MainScreen("Card Was Scanned") class ButtonMyWallets : MainScreen("Button - My Wallets") + class EnableBiometrics(state: AnalyticsParam.OnOffState) : MainScreen( + event = "Enable Biometric", + params = mapOf("State" to state.value), + ) + class MainCurrencyChanged(currencyType: AnalyticsParam.CurrencyType) : MainScreen( event = "Main Currency Changed", params = mapOf("Currency Type" to currencyType.value), diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/MyWallets.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/MyWallets.kt new file mode 100644 index 0000000000..0fd08ddd88 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/MyWallets.kt @@ -0,0 +1,18 @@ +package com.tangem.tap.common.analytics.events + +sealed class MyWallets( + event: String, + params: Map = mapOf(), +) : AnalyticsEvent("My Wallets", event, params) { + + object MyWalletsScreenOpened : MyWallets(event = "My Wallets Screen Opened") + object CardWasScanned : MyWallets(event = "Card Was Scanned") + object WalletUnlockTapped : MyWallets(event = "Wallet Unlock Tapped") + + object Button { + object ScanNewCard : MyWallets(event = "Button - Scan New Card") + object UnlockWithBiometrics : MyWallets(event = "Button - Unlock all with Face ID") + object EditWalletTapped : MyWallets(event = "Button - Edit Wallet Tapped") + object DeleteWalletTapped : MyWallets(event = "Button - Delete Wallet Tapped") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt index 5634c25afa..92f55074e9 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Onboarding.kt @@ -73,4 +73,9 @@ sealed class Onboarding( class ClaimScreenOpened : Onboarding("Onboarding", "Claim screen opened") class ButtonClaim : Onboarding("Onboarding", "Button - Claim") class ClaimWasSuccessfully : Onboarding("Onboarding", "Claim was successfully") + class EnableBiometrics(state: AnalyticsParam.OnOffState) : Onboarding( + category = "Onboarding / Biometric", + event = "Enable Biometric", + params = mapOf("State" to state.value), + ) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt b/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt index 38725048a7..728662bdb9 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/events/Settings.kt @@ -58,16 +58,16 @@ sealed class Settings( params: Map = mapOf(), ) : Settings("Settings / App Settings", event, params) { - sealed class FaceIDSwitcherChanged(state: AnalyticsParam.OnOffState) : CardSettings( - event = "Face ID Switcher Changed", + class SaveWalletSwitcherChanged(state: AnalyticsParam.OnOffState) : CardSettings( + event = "Save Wallet Switcher Changed", params = mapOf("State" to state.value), ) - sealed class SaveAccessCodeSwitcherChanged(state: AnalyticsParam.OnOffState) : CardSettings( + class SaveAccessCodeSwitcherChanged(state: AnalyticsParam.OnOffState) : CardSettings( event = "Save Access Code Switcher Changed", params = mapOf("State" to state.value), ) - class ButtonEnableBiometricAuthentication : AppSettings("Button - Enable Biometric Authentication") + object ButtonEnableBiometricAuthentication : AppSettings("Button - Enable Biometric Authentication") } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 70751b615f..fb671a9cbc 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -232,6 +232,7 @@ class DetailsMiddleware { } private fun enrollBiometrics() { + Analytics.send(Settings.AppSettings.ButtonEnableBiometricAuthentication) store.dispatchOnMain(NavigationAction.OpenBiometricsSettings) } @@ -268,14 +269,18 @@ class DetailsMiddleware { Timber.e(error, "Wallet saving failed") } .doOnSuccess { + Analytics.send(Settings.AppSettings.SaveWalletSwitcherChanged(AnalyticsParam.OnOffState.On)) + preferencesStorage.shouldShowSaveUserWalletScreen = false preferencesStorage.shouldSaveUserWallets = true + store.dispatchOnMain( DetailsAction.AppSettings.SwitchPrivacySetting.Success( setting = PrivacySetting.SaveWallets, enable = true, ), ) + store.onUserWalletSelected(userWallet) } } @@ -284,22 +289,29 @@ class DetailsMiddleware { userWalletsListManager.clear() .flatMap { walletStoresManager.clear() } .doOnSuccess { + Analytics.send(Settings.AppSettings.SaveWalletSwitcherChanged(AnalyticsParam.OnOffState.Off)) + preferencesStorage.shouldSaveUserWallets = false + store.dispatchOnMain( DetailsAction.AppSettings.SwitchPrivacySetting.Success( setting = PrivacySetting.SaveWallets, enable = false, ), ) + store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Home)) } } private fun saveAccessCodes(state: DetailsState) { + Analytics.send(Settings.AppSettings.SaveAccessCodeSwitcherChanged(AnalyticsParam.OnOffState.On)) + preferencesStorage.shouldSaveAccessCodes = true tangemSdkManager.setAccessCodeRequestPolicy( useBiometricsForAccessCode = state.scanResponse?.card?.isAccessCodeSet == true, ) + store.dispatchOnMain( DetailsAction.AppSettings.SwitchPrivacySetting.Success( setting = PrivacySetting.SaveAccessCode, @@ -311,10 +323,13 @@ class DetailsMiddleware { private suspend fun deleteSavedAccessCodes() { tangemSdkManager.clearSavedUserCodes() .doOnSuccess { + Analytics.send(Settings.AppSettings.SaveAccessCodeSwitcherChanged(AnalyticsParam.OnOffState.Off)) + preferencesStorage.shouldSaveAccessCodes = false tangemSdkManager.setAccessCodeRequestPolicy( useBiometricsForAccessCode = false, ) + store.dispatchOnMain( DetailsAction.AppSettings.SwitchPrivacySetting.Success( setting = PrivacySetting.SaveAccessCode, diff --git a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt index e0bdc6c843..ee202bbc3a 100644 --- a/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/saveWallet/redux/SaveWalletMiddleware.kt @@ -4,6 +4,10 @@ import com.tangem.common.CompletionResult import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.flatMap +import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.events.AnalyticsParam +import com.tangem.tap.common.analytics.events.MainScreen +import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState @@ -36,9 +40,9 @@ internal class SaveWalletMiddleware { is SaveWalletAction.Save -> saveWalletIfBiometricsEnrolled(state) is SaveWalletAction.EnrollBiometrics.Enroll -> enrollBiometrics() is SaveWalletAction.SaveWalletWasShown -> saveWalletWasShown() + is SaveWalletAction.Dismiss -> dismiss(state) is SaveWalletAction.Save.Success, is SaveWalletAction.ProvideBackupInfo, - is SaveWalletAction.Dismiss, is SaveWalletAction.CloseError, is SaveWalletAction.Save.Error, is SaveWalletAction.EnrollBiometrics, @@ -74,6 +78,13 @@ internal class SaveWalletMiddleware { ?: store.state.globalState.scanResponse ?: return + if (state.backupInfo != null) { + // TODO: Remove after onboarding refactoring + Analytics.send(Onboarding.EnableBiometrics(AnalyticsParam.OnOffState.On)) + } else { + Analytics.send(MainScreen.EnableBiometrics(AnalyticsParam.OnOffState.On)) + } + scope.launch { val userWallet = UserWalletBuilder(scanResponse) .backupCardsIds(state.backupInfo?.backupCardsIds) @@ -114,6 +125,15 @@ internal class SaveWalletMiddleware { } } + private fun dismiss(state: SaveWalletState) { + if (state.backupInfo != null) { + // TODO: Remove after onboarding refactoring + Analytics.send(Onboarding.EnableBiometrics(AnalyticsParam.OnOffState.Off)) + } else { + Analytics.send(MainScreen.EnableBiometrics(AnalyticsParam.OnOffState.Off)) + } + } + private fun saveWalletWasShown() { preferencesStorage.shouldShowSaveUserWalletScreen = false } diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 28f6fcc965..bbe6f90378 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -8,6 +8,7 @@ import com.tangem.common.extensions.guard import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam +import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Token.ButtonRemoveToken import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.dispatchErrorNotification @@ -181,6 +182,7 @@ class MultiWalletMiddleware { selectedWallet: UserWallet, state: WalletState?, ) = scope.launch { + Analytics.send(MainScreen.CardWasScanned()) ScanCardProcessor.scan( cardId = selectedWallet.cardId, additionalBlockchainsToDerive = state?.missingDerivations?.map { it.blockchain }, diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 83cca6c428..f6e0c47011 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -12,6 +12,7 @@ import com.tangem.domain.common.extensions.withMainContext import com.tangem.operations.attestation.Attestation import com.tangem.operations.attestation.OnlineCardVerifier import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.events.MainScreen import com.tangem.tap.common.analytics.events.Token import com.tangem.tap.common.extensions.copyToClipboard import com.tangem.tap.common.extensions.dispatchDebugErrorNotification @@ -349,9 +350,11 @@ class WalletMiddleware { private fun changeWallet() { when { userWalletsListManager.hasSavedUserWallets -> { + Analytics.send(MainScreen.ButtonMyWallets()) store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.WalletSelector)) } else -> { + Analytics.send(MainScreen.ButtonScanCard()) store.dispatch(WalletAction.Scan) } } diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index cb7ac66a6c..b2642b071c 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -7,6 +7,8 @@ import com.tangem.common.flatMap import com.tangem.common.map import com.tangem.domain.common.ScanResponse import com.tangem.domain.common.util.UserWalletId +import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.events.MyWallets import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.onUserWalletSelected import com.tangem.tap.common.redux.AppState @@ -104,6 +106,8 @@ internal class WalletSelectorMiddleware { } private fun unlockWalletsWithBiometry() { + Analytics.send(MyWallets.Button.UnlockWithBiometrics) + scope.launch { userWalletsListManager.unlockWithBiometry() .doOnFailure { error -> @@ -116,6 +120,8 @@ internal class WalletSelectorMiddleware { } private fun addWallet() = scope.launch { + Analytics.send(MyWallets.Button.ScanNewCard) + scanCardInternal { scanResponse -> val userWallet = UserWalletBuilder(scanResponse).build() @@ -124,6 +130,8 @@ internal class WalletSelectorMiddleware { store.dispatchOnMain(WalletSelectorAction.AddWallet.Error(error)) } .doOnSuccess { + Analytics.send(MyWallets.CardWasScanned) + userWalletsListManager.selectWallet(userWallet.walletId) store.dispatchOnMain(WalletSelectorAction.AddWallet.Success) updateAccessCodeRequestPolicy(userWallet) @@ -148,6 +156,8 @@ internal class WalletSelectorMiddleware { } private fun removeWallets(walletIdsToRemove: List, state: WalletSelectorState) { + Analytics.send(MyWallets.Button.DeleteWalletTapped) + scope.launch { when (walletIdsToRemove.size) { state.wallets.size -> clearUserWallets() @@ -160,6 +170,8 @@ internal class WalletSelectorMiddleware { } private fun renameWallet(walletId: String, newName: String) { + Analytics.send(MyWallets.Button.EditWalletTapped) + scope.launch { userWalletsListManager.get(walletId = UserWalletId(walletId)) .map { it.copy(name = newName) } 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 50ee972e7d..717f82ed16 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 @@ -1,5 +1,7 @@ package com.tangem.tap.features.walletSelector.ui +import android.app.Dialog +import android.os.Bundle import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -14,6 +16,8 @@ import androidx.compose.ui.platform.rememberNestedScrollInteropConnection import androidx.fragment.app.viewModels import com.tangem.core.ui.fragments.ComposeBottomSheetFragment import com.tangem.core.ui.res.TangemTheme +import com.tangem.tap.common.analytics.Analytics +import com.tangem.tap.common.analytics.events.MyWallets import com.tangem.tap.features.details.ui.cardsettings.resolveReference import com.tangem.tap.features.walletSelector.ui.components.RenameWalletDialogContent import com.tangem.tap.features.walletSelector.ui.components.WalletSelectorScreenContent @@ -22,6 +26,12 @@ import com.tangem.tap.features.walletSelector.ui.model.RenameWalletDialog internal class WalletSelectorBottomSheetFragment : ComposeBottomSheetFragment() { private val viewModel by viewModels() + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + Analytics.send(MyWallets.MyWalletsScreenOpened) + + return super.onCreateDialog(savedInstanceState) + } + @Composable override fun provideState(): State { return viewModel.state.collectAsState()