NTP-8836 | NTP-14898 | Added Analytics Events for new app update and notify me widget (#14013)

This commit is contained in:
Aparna Vadlamani
2024-12-06 12:49:26 +05:30
committed by GitHub
parent 6572aa5c77
commit ca2e2ae1f1
9 changed files with 168 additions and 18 deletions

View File

@@ -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"

View File

@@ -98,10 +98,6 @@ class InAppUpdateHelper(
naviAnalyticsInAppUpdate.onInAppSuccessFully()
}
fun inAppUpdateSnackBarClick() {
naviAnalyticsInAppUpdate.inAppUpdateSnackBarClick()
}
fun registerAppUpdateFlow() {
naviAnalyticsInAppUpdate.inAppUpdateBottomSheetUpdateBtn()
}

View File

@@ -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()
}
}

View File

@@ -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<UiTronResponse>,
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()
},
)

View File

@@ -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<UiTronResponse>,
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()
}
}
}
)
}
}

View File

@@ -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()
}
}

View File

@@ -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 =

View File

@@ -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 =

View File

@@ -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"