From ca2e2ae1f110f61b273c99d09ac199e4bf9a2939 Mon Sep 17 00:00:00 2001 From: Aparna Vadlamani Date: Fri, 6 Dec 2024 12:49:26 +0530 Subject: [PATCH] NTP-8836 | NTP-14898 | Added Analytics Events for new app update and notify me widget (#14013) --- .../naviapp/analytics/utils/NaviAnalytics.kt | 45 ++++++++++++++ .../common/viewmodel/InAppUpdateHelper.kt | 4 -- .../home/compose/activity/HomePageActivity.kt | 2 + .../ui/content/HomeAppUpdateNudgeWidget.kt | 15 ++++- .../home/ui/content/HomeNotifyMeWidget.kt | 28 ++++++--- .../profile/ProfileAppUpdateNudgeWidget.kt | 9 ++- .../com/naviapp/home/utils/HomePageUtils.kt | 16 +++++ .../bottomsheet/ui/HomeScreenBottomSheet.kt | 6 +- .../navi/common/utils/CommonNaviAnalytics.kt | 61 ++++++++++++++++++- 9 files changed, 168 insertions(+), 18 deletions(-) diff --git a/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt b/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt index ffa3829cca..2fa48a64c6 100644 --- a/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt +++ b/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt @@ -1467,6 +1467,51 @@ class NaviAnalytics private constructor() { ) } + inner class InAppUpdate(val screenName: String? = null) { + + fun appUpdateStateEvent(state: String) { + NaviTrackEvent.trackEvent( + eventName = "naviapp_app_update_state_event", + eventValues = mapOf(Pair("state", state)) + ) + } + + fun appUpdateNudgeViewEvent() { + NaviTrackEvent.trackEvent( + eventName = "naviapp_app_update_nudge_view_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun appUpdateNudgeClickEvent() { + NaviTrackEvent.trackEvent( + eventName = "naviapp_app_update_nudge_click_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun appInstallNudgeClickEvent() { + NaviTrackEvent.trackEvent( + eventName = "naviapp_app_install_nudge_click_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun appUpdateNudgeDismissEvent() { + NaviTrackEvent.trackEvent( + eventName = "naviapp_app_update_nudge_dismiss_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun appUpdateUnavailableClickEvent() { + NaviTrackEvent.trackEvent( + eventName = "naviapp_app_update_unavailable_click_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + } + companion object { const val AMOUNT = "amount" const val SELECTED_OPTION = "selected_option" diff --git a/android/app/src/main/java/com/naviapp/common/viewmodel/InAppUpdateHelper.kt b/android/app/src/main/java/com/naviapp/common/viewmodel/InAppUpdateHelper.kt index 4d5c55b1fd..0ef71356ee 100644 --- a/android/app/src/main/java/com/naviapp/common/viewmodel/InAppUpdateHelper.kt +++ b/android/app/src/main/java/com/naviapp/common/viewmodel/InAppUpdateHelper.kt @@ -98,10 +98,6 @@ class InAppUpdateHelper( naviAnalyticsInAppUpdate.onInAppSuccessFully() } - fun inAppUpdateSnackBarClick() { - naviAnalyticsInAppUpdate.inAppUpdateSnackBarClick() - } - fun registerAppUpdateFlow() { naviAnalyticsInAppUpdate.inAppUpdateBottomSheetUpdateBtn() } diff --git a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt index 24f8846b86..5a48b28fce 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt @@ -1649,6 +1649,7 @@ class HomePageActivity : } override fun setAppUpdateState(appUpdateState: AppUpdateState) { + NaviAnalytics.naviAnalytics.InAppUpdate().appUpdateStateEvent(state = appUpdateState.name) sharedVM.setAppUpdateState(appUpdateState) } @@ -1660,6 +1661,7 @@ class HomePageActivity : } override fun installUpdate() { + inAppUpdateHelper.registerAppUpdateSuccessAnalytics() inAppUpdateHelper.completeUpdate() } } diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeAppUpdateNudgeWidget.kt b/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeAppUpdateNudgeWidget.kt index 4e19d89688..165a4a44ea 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeAppUpdateNudgeWidget.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeAppUpdateNudgeWidget.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -39,16 +40,20 @@ import com.navi.elex.atoms.ElexAsyncImage import com.navi.elex.atoms.ElexText import com.navi.elex.font.FontWeightEnum import com.navi.uitron.model.UiTronResponse +import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.listeners.InAppUpdateBridge import com.naviapp.common.model.AppUpdateState import com.naviapp.home.utils.getHomeWidgetAnimationSpec +import com.naviapp.utils.Constants.HOME_SCREEN_IN_CAPS @Composable fun HomeAppUpdateWidget( content: AlchemistWidgetModelDefinition, appUpdateState: AppUpdateState, inAppUpdateBridge: InAppUpdateBridge, - dismissNudge: () -> Unit + dismissNudge: () -> Unit, + appUpdateAnalytics: NaviAnalytics.InAppUpdate = + NaviAnalytics.naviAnalytics.InAppUpdate(HOME_SCREEN_IN_CAPS) ) { val data = content.widgetData?.data?.get(APP_UPDATE_DATA) as? AppUpdateNudgeData val visible = @@ -58,6 +63,11 @@ fun HomeAppUpdateWidget( appUpdateState != AppUpdateState.UPDATE_DOWNLOADING } } + LaunchedEffect(visible.value) { + if (visible.value) { + appUpdateAnalytics.appUpdateNudgeViewEvent() + } + } AnimatedVisibility( visible = visible.value, enter = @@ -114,8 +124,10 @@ fun HomeAppUpdateWidget( Modifier.clip(RoundedCornerShape(4.dp)) .clickable { if (appUpdateState != AppUpdateState.UPDATE_DOWNLOADED) { + appUpdateAnalytics.appUpdateNudgeClickEvent() inAppUpdateBridge.downloadUpdate() } else { + appUpdateAnalytics.appInstallNudgeClickEvent() inAppUpdateBridge.installUpdate() } } @@ -139,6 +151,7 @@ fun HomeAppUpdateWidget( contentDescription = "", modifier = Modifier.padding(start = 12.dp, end = 4.dp).size(24.dp).clickable { + appUpdateAnalytics.appUpdateNudgeDismissEvent() dismissNudge() }, ) diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeNotifyMeWidget.kt b/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeNotifyMeWidget.kt index 0c58ce01cc..c6ea1ef64c 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeNotifyMeWidget.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/ui/content/HomeNotifyMeWidget.kt @@ -36,12 +36,14 @@ import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState import com.google.accompanist.permissions.shouldShowRationale import com.navi.common.alchemist.model.AlchemistWidgetModelDefinition +import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.Constants.NOTIFY_WIDGET_DATA import com.navi.elex.atoms.ElexAsyncImage import com.navi.elex.atoms.ElexText import com.navi.elex.font.FontWeightEnum import com.navi.uitron.model.UiTronResponse import com.naviapp.home.compose.model.NotifyMeWidgetData +import com.naviapp.utils.Constants.HOME_SCREEN_IN_CAPS @OptIn(ExperimentalPermissionsApi::class) @Composable @@ -49,7 +51,9 @@ fun HomeNotifyMeWidget( widget: AlchemistWidgetModelDefinition, showBottomSheet: () -> Unit, onDismissNudge: () -> Unit, - onPermissionGranted: (Boolean) -> Unit + onPermissionGranted: (Boolean) -> Unit, + notifyMeAnalytics: CommonNaviAnalytics.NotifyMe = + CommonNaviAnalytics.naviAnalytics.NotifyMe(HOME_SCREEN_IN_CAPS) ) { val notificationPermission = rememberPermissionState(permission = android.Manifest.permission.POST_NOTIFICATIONS) @@ -57,21 +61,29 @@ fun HomeNotifyMeWidget( val visible by remember { mutableStateOf(notificationPermission.status.isGranted.not()) } LaunchedEffect(notificationPermission.status.isGranted) { if (notificationPermission.status.isGranted) { + notifyMeAnalytics.notifyMeNudgePermissionGrantedEvent() onPermissionGranted(true) } } if (visible) { + notifyMeAnalytics.notifyMeNudgeViewEvent() NotifyMeUI( permissionGranted = notificationPermission.status.isGranted, widgetData, - onDismissNudge - ) { - if (notificationPermission.status.shouldShowRationale) { - notificationPermission.launchPermissionRequest() - } else { - showBottomSheet() + onDismissNudge = { + notifyMeAnalytics.notifyMeNudgeDismissEvent() + onDismissNudge() + }, + onClick = { + notifyMeAnalytics.notifyMeNudgeClickEvent() + if (notificationPermission.status.shouldShowRationale) { + notifyMeAnalytics.notifyMeNudgePermissionPromptShownEvent() + notificationPermission.launchPermissionRequest() + } else { + showBottomSheet() + } } - } + ) } } diff --git a/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileAppUpdateNudgeWidget.kt b/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileAppUpdateNudgeWidget.kt index 98e80dd9a2..8e817769d1 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileAppUpdateNudgeWidget.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/profile/ProfileAppUpdateNudgeWidget.kt @@ -36,10 +36,12 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.setViewTreeLifecycleOwner import androidx.savedstate.SavedStateRegistryOwner import androidx.savedstate.setViewTreeSavedStateRegistryOwner +import com.navi.common.utils.Constants.PROFILE_SCREEN import com.navi.elex.atoms.ElexAsyncImage import com.navi.elex.atoms.ElexText import com.navi.elex.font.FontWeightEnum import com.naviapp.R +import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.listeners.InAppUpdateBridge import com.naviapp.common.model.AppUpdateState import com.naviapp.home.compose.model.AppUpdateToastData @@ -49,7 +51,9 @@ import com.naviapp.home.compose.model.ProfileAppUpdateSettingData fun ProfileAppUpdateWidget( data: ProfileAppUpdateSettingData, appUpdateState: AppUpdateState, - inAppUpdateBridge: InAppUpdateBridge + inAppUpdateBridge: InAppUpdateBridge, + appUpdateAnalytics: NaviAnalytics.InAppUpdate = + NaviAnalytics.naviAnalytics.InAppUpdate(PROFILE_SCREEN) ) { val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current @@ -60,6 +64,7 @@ fun ProfileAppUpdateWidget( modifier = Modifier.fillMaxWidth() .clickable(enabled = (appUpdateState == AppUpdateState.UPDATE_NOT_AVAILABLE)) { + appUpdateAnalytics.appUpdateUnavailableClickEvent() showToast( content = { toast: Toast? -> AppUpdateToastUI(data.toastData, toast) }, context = context, @@ -94,6 +99,7 @@ fun ProfileAppUpdateWidget( AppUpdateState.UPDATE_FAILED, AppUpdateState.UPDATE_PENDING -> { UpdateButton(text = data.updateCtaText.orEmpty()) { + appUpdateAnalytics.appUpdateNudgeClickEvent() inAppUpdateBridge.downloadUpdate() } } @@ -109,6 +115,7 @@ fun ProfileAppUpdateWidget( } AppUpdateState.UPDATE_DOWNLOADED -> { UpdateButton(text = data.installCtaText.orEmpty()) { + appUpdateAnalytics.appInstallNudgeClickEvent() inAppUpdateBridge.installUpdate() } } diff --git a/android/app/src/main/java/com/naviapp/home/utils/HomePageUtils.kt b/android/app/src/main/java/com/naviapp/home/utils/HomePageUtils.kt index 4c19750bb8..9fb4721459 100644 --- a/android/app/src/main/java/com/naviapp/home/utils/HomePageUtils.kt +++ b/android/app/src/main/java/com/naviapp/home/utils/HomePageUtils.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp import androidx.lifecycle.viewModelScope +import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.viewmodel.BaseVM import com.navi.design.font.FontWeightEnum import com.navi.design.font.getFontWeight @@ -47,6 +48,7 @@ import com.naviapp.home.compose.home.ui.content.HomeAppUpdateWidget import com.naviapp.home.compose.home.ui.content.HomeNotifyMeWidget import com.naviapp.home.model.HomeCustomWidgetType import com.naviapp.home.model.HpBottomSheetComposableType +import com.naviapp.home.model.HpBottomSheetConfig import com.naviapp.home.model.HpBottomSheetContent import com.naviapp.home.model.HpBottomSheetRenderType import com.naviapp.home.model.HpBottomSheetState @@ -57,6 +59,7 @@ import com.naviapp.screenOverlay.nudge.model.NudgeEvent import com.naviapp.screenOverlay.nudge.model.StaticNudgeData import com.naviapp.screenOverlay.nudge.model.StaticNudgeUiState import com.naviapp.screenOverlay.viewModel.ScreenOverlayVM +import com.naviapp.utils.Constants.HOME_SCREEN_IN_CAPS import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -166,6 +169,19 @@ fun WidgetRenderer( showBottomSheet = { sharedVM.updateBottomSheetState( state = HpBottomSheetState.Visible, + config = + HpBottomSheetConfig( + onDismiss = { + CommonNaviAnalytics.naviAnalytics + .NotifyMe(HOME_SCREEN_IN_CAPS) + .notifyMeNudgeOpenSettingsBottomSheetDismissEvent() + }, + onVisible = { + CommonNaviAnalytics.naviAnalytics + .NotifyMe(HOME_SCREEN_IN_CAPS) + .notifyMeNudgeOpenSettingsBottomSheetLandEvent() + } + ), content = HpBottomSheetContent( composableType = diff --git a/android/app/src/main/java/com/naviapp/screenOverlay/bottomsheet/ui/HomeScreenBottomSheet.kt b/android/app/src/main/java/com/naviapp/screenOverlay/bottomsheet/ui/HomeScreenBottomSheet.kt index 474223aeca..b76b1e2478 100644 --- a/android/app/src/main/java/com/naviapp/screenOverlay/bottomsheet/ui/HomeScreenBottomSheet.kt +++ b/android/app/src/main/java/com/naviapp/screenOverlay/bottomsheet/ui/HomeScreenBottomSheet.kt @@ -34,9 +34,9 @@ import com.navi.base.model.CtaData import com.navi.base.utils.orTrue import com.navi.common.uitron.model.action.CtaAction import com.navi.common.uitron.render.CommonCustomUiTronRenderer +import com.navi.common.utils.CommonNaviAnalytics import com.navi.common.utils.Constants.HIDE import com.navi.common.utils.getStatusBarHeight -import com.navi.insurance.util.REDIRECTION_CTA import com.navi.uitron.model.data.UiTronAction import com.navi.uitron.model.data.UiTronActionData import com.navi.uitron.render.UiTronRenderer @@ -52,6 +52,7 @@ import com.naviapp.home.model.HpBottomSheetRenderType import com.naviapp.home.model.HpBottomSheetState import com.naviapp.home.model.InvestmentBottomSheetData import com.naviapp.home.viewmodel.SharedVM +import com.naviapp.utils.Constants.HOME_SCREEN_IN_CAPS @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -150,6 +151,9 @@ private fun BottomSheetContentRenderer( NotificationSettingBottomSheetContent( onDismiss = { viewModel.handle[BOTTOM_SHEET_VISIBILITY] = HIDE }, onClick = { + CommonNaviAnalytics.naviAnalytics + .NotifyMe(HOME_SCREEN_IN_CAPS) + .notifyMeNudgeOpenSettingsBottomSheetClickEvent() viewModel.handleActions( UiTronActionData( actions = diff --git a/android/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt b/android/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt index e8e0669af2..1b1b5c0e06 100644 --- a/android/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt +++ b/android/navi-common/src/main/java/com/navi/common/utils/CommonNaviAnalytics.kt @@ -330,9 +330,6 @@ class CommonNaviAnalytics private constructor() { fun inAppUpdateBottomSheetView() = NaviTrackEvent.trackEvent("in_app_update_bottomSheet_view") - - fun inAppUpdateSnackBarClick() = - NaviTrackEvent.trackEvent("in_app_update_snackBar_install_click") } inner class NaviLocationManager { @@ -1077,6 +1074,64 @@ class CommonNaviAnalytics private constructor() { } } + inner class NotifyMe(val screenName: String? = null) { + fun notifyMeNudgeViewEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_view_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun notifyMeNudgeClickEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_click_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun notifyMeNudgeDismissEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_dismiss_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun notifyMeNudgePermissionPromptShownEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_permission_prompt_shown_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun notifyMeNudgePermissionGrantedEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_permission_granted_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun notifyMeNudgeOpenSettingsBottomSheetLandEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_open_settings_bottomsheet_land_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun notifyMeNudgeOpenSettingsBottomSheetClickEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_open_settings_bottomsheet_click_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + + fun notifyMeNudgeOpenSettingsBottomSheetDismissEvent() { + NaviTrackEvent.trackEvent( + eventName = "notify_me_nudge_open_settings_bottomsheet_dismiss_event", + eventValues = mapOf(Pair("screen_name", screenName.orEmpty())) + ) + } + } + companion object { const val OVERRIDE_EVENT = "override_event" const val TEXT_TRUE = "true"