diff --git a/android/app/src/main/java/com/naviapp/webredirection/presentation/activity/WebRedirectionActivity.kt b/android/app/src/main/java/com/naviapp/webredirection/presentation/activity/WebRedirectionActivity.kt index 42b22525e1..a999f10685 100644 --- a/android/app/src/main/java/com/naviapp/webredirection/presentation/activity/WebRedirectionActivity.kt +++ b/android/app/src/main/java/com/naviapp/webredirection/presentation/activity/WebRedirectionActivity.kt @@ -418,7 +418,6 @@ class WebRedirectionActivity : BaseActivity() { get() = ModuleNameV2.App companion object { - const val WEB_REDIRECTION_SESSION_ID = "WEB_REDIRECTION_SESSION_ID" const val DATA_INGESTION_TIMEOUT = "DATA_INGESTION_TIMEOUT" const val DATA_INGESTION_TIMEOUT_DEFAULT_VALUE = 3000L const val CHROME_PACKAGE = "com.android.chrome" diff --git a/android/app/src/main/java/com/naviapp/webredirection/presentation/utils/Constants.kt b/android/app/src/main/java/com/naviapp/webredirection/presentation/utils/Constants.kt index 39e54bc32e..3098eedb73 100644 --- a/android/app/src/main/java/com/naviapp/webredirection/presentation/utils/Constants.kt +++ b/android/app/src/main/java/com/naviapp/webredirection/presentation/utils/Constants.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2024 by Navi Technologies Limited + * * Copyright © 2024-2025 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -23,3 +23,7 @@ const val WEB_REDIRECTION_DELAY_IN_MILLIS = "webRedirectionDelayInMillis" const val TIME_TAKEN = "timeTaken" const val DATA_PROCESSED = "dataProcessed" const val BUSINESS_UNIT = "businessUnit" +const val WEB_REDIRECTION_FIRST_LAUNCH_TIMESTAMP = "web_redirection_first_launch_timestamp" +const val WEB_REDIRECTION_FIRST_LAUNCH = "web_redirection_first_launch" +const val WEB_REDIRECTION_SUBSEQUENT_LAUNCH = "web_redirection_subsequent_launch" +const val DELAY_IN_MS = "delay_in_ms" diff --git a/android/app/src/main/java/com/naviapp/webredirection/presentation/utils/Utils.kt b/android/app/src/main/java/com/naviapp/webredirection/presentation/utils/Utils.kt new file mode 100644 index 0000000000..f7f3e46d74 --- /dev/null +++ b/android/app/src/main/java/com/naviapp/webredirection/presentation/utils/Utils.kt @@ -0,0 +1,58 @@ +/* + * + * * Copyright © 2025 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.webredirection.presentation.utils + +import com.navi.base.sharedpref.PreferenceManager +import com.navi.base.utils.orFalse +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.WEB_REDIRECTION_DEFAULT_DELAY_IN_MILLIS +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS +import com.navi.common.useruploaddata.model.IngestionType +import com.navi.common.useruploaddata.model.PreSignedUrlListResponse +import com.naviapp.webredirection.presentation.viewModel.WebRedirectionData + +fun isFirstLaunchIn24Hours(): Boolean { + val firstLaunchTimestamp = getFirstLaunchTimestamp() + if (firstLaunchTimestamp == 0L) { + return true + } + val elapsedTime = System.currentTimeMillis() - firstLaunchTimestamp + return elapsedTime >= 24 * 60 * 60 * 1000 +} + +fun setFirstLaunchTimestamp(timestamp: Long) { + PreferenceManager.setLongPreference(WEB_REDIRECTION_FIRST_LAUNCH_TIMESTAMP, timestamp) +} + +fun updateFirstLaunchTimestampIfNeeded() { + if (getFirstLaunchTimestamp() == 0L) { + setFirstLaunchTimestamp(System.currentTimeMillis()) + } +} + +fun getFirstLaunchTimestamp(): Long { + return PreferenceManager.getLongPreference(WEB_REDIRECTION_FIRST_LAUNCH_TIMESTAMP, 0L) +} + +fun calculateRedirectDelayForSmsUpload( + preSignedUrlListResponse: PreSignedUrlListResponse?, + webRedirectionData: WebRedirectionData?, +): Long { + val smsUploadStatus = + preSignedUrlListResponse + ?.preSignedUrlList + ?.find { it.ingestionType == IngestionType.SMS.name } + ?.upload + .orFalse() + return if (smsUploadStatus) { + FirebaseRemoteConfigHelper.getLong(WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS, 0L) + } else { + webRedirectionData?.webRedirectionDelayInMillis + ?: FirebaseRemoteConfigHelper.getLong(WEB_REDIRECTION_DEFAULT_DELAY_IN_MILLIS, 2000L) + } +} diff --git a/android/app/src/main/java/com/naviapp/webredirection/presentation/viewModel/WebRedirectionVM.kt b/android/app/src/main/java/com/naviapp/webredirection/presentation/viewModel/WebRedirectionVM.kt index dfa8c2b12d..1cc73a1beb 100644 --- a/android/app/src/main/java/com/naviapp/webredirection/presentation/viewModel/WebRedirectionVM.kt +++ b/android/app/src/main/java/com/naviapp/webredirection/presentation/viewModel/WebRedirectionVM.kt @@ -14,41 +14,42 @@ import androidx.lifecycle.viewModelScope import com.navi.ap.utils.constants.PL import com.navi.base.model.CtaData import com.navi.base.model.LineItem -import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.BaseUtils import com.navi.base.utils.generateRandomString import com.navi.base.utils.generateSHA256Hash import com.navi.base.utils.isNotNullAndNotEmpty -import com.navi.base.utils.orFalse import com.navi.common.checkmate.model.MetricInfo import com.navi.common.constants.APP_VERSION_CODE import com.navi.common.constants.OS_VERSION import com.navi.common.constants.OS_VERSION_NAME import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper -import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.WEB_REDIRECTION_DEFAULT_DELAY_IN_MILLIS -import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS +import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.WEB_REDIRECTION_FIRST_LAUNCH_DELAY_IN_MILLIS import com.navi.common.network.models.GenericErrorResponse -import com.navi.common.useruploaddata.model.IngestionType import com.navi.common.useruploaddata.model.PreSignedUrlListResponse import com.navi.common.utils.Constants.URL import com.navi.common.utils.buildUrlWithParameters -import com.navi.common.utils.getSessionId import com.navi.common.utils.isValidResponse import com.navi.common.viewmodel.BaseVM import com.navi.common.webredirection.data.WebRedirectionRepository +import com.naviapp.analytics.utils.NaviAnalytics import com.naviapp.common.navigator.NaviDeepLinkNavigator.WEB_URL import com.naviapp.utils.Constants import com.naviapp.utils.getVersionCode import com.naviapp.utils.toMutableMap -import com.naviapp.webredirection.presentation.activity.WebRedirectionActivity.Companion.WEB_REDIRECTION_SESSION_ID import com.naviapp.webredirection.presentation.utils.CODE_VERIFIER +import com.naviapp.webredirection.presentation.utils.DELAY_IN_MS import com.naviapp.webredirection.presentation.utils.RANDOM_STRING_LENGTH import com.naviapp.webredirection.presentation.utils.TOKEN import com.naviapp.webredirection.presentation.utils.WEB_BASE_URL import com.naviapp.webredirection.presentation.utils.WEB_REDIRECTION_DELAY_IN_MILLIS +import com.naviapp.webredirection.presentation.utils.WEB_REDIRECTION_FIRST_LAUNCH import com.naviapp.webredirection.presentation.utils.WEB_REDIRECTION_PLATFORM +import com.naviapp.webredirection.presentation.utils.WEB_REDIRECTION_SUBSEQUENT_LAUNCH import com.naviapp.webredirection.presentation.utils.WEB_REDIRECTION_SUBTITLE import com.naviapp.webredirection.presentation.utils.WEB_REDIRECTION_TITLE +import com.naviapp.webredirection.presentation.utils.calculateRedirectDelayForSmsUpload +import com.naviapp.webredirection.presentation.utils.isFirstLaunchIn24Hours +import com.naviapp.webredirection.presentation.utils.updateFirstLaunchTimestampIfNeeded import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject @@ -87,6 +88,8 @@ constructor( private var businessUnit: String? = null + private val analyticsTracker by lazy { NaviAnalytics.naviAnalytics.WebRedirection() } + fun fetchTemporarySessionToken(naeScreenName: String) { viewModelScope.safeLaunch(Dispatchers.IO) { val codeVerifier = generateRandomString(RANDOM_STRING_LENGTH) @@ -122,17 +125,30 @@ constructor( fun startRedirectionProcess(preSignedUrlListResponse: PreSignedUrlListResponse?) { viewModelScope.launch(Dispatchers.IO) { if (isSuccessAndRedirectToNonWebView()) { - val webRedirectionDelay = - calculateRedirectDelayForSmsUpload(preSignedUrlListResponse) - val webRedirectionSessionId = "${businessUnit}_$WEB_REDIRECTION_SESSION_ID" - if ( - PreferenceManager.getStringPreference(webRedirectionSessionId) != getSessionId() - ) { - delay(webRedirectionDelay) - getSessionId()?.let { - PreferenceManager.setStringPreference(webRedirectionSessionId, it) - } + val webRedirectionDelay: Long + if (isFirstLaunchIn24Hours()) { + webRedirectionDelay = + FirebaseRemoteConfigHelper.getLong( + key = WEB_REDIRECTION_FIRST_LAUNCH_DELAY_IN_MILLIS, + defaultValue = 2000L, + ) + analyticsTracker.webRedirectionEvent( + eventName = WEB_REDIRECTION_FIRST_LAUNCH, + eventValues = mapOf(DELAY_IN_MS to webRedirectionDelay.toString()), + ) + updateFirstLaunchTimestampIfNeeded() + } else { + webRedirectionDelay = + calculateRedirectDelayForSmsUpload( + preSignedUrlListResponse, + webRedirectionData.value, + ) + analyticsTracker.webRedirectionEvent( + eventName = WEB_REDIRECTION_SUBSEQUENT_LAUNCH, + eventValues = mapOf(DELAY_IN_MS to webRedirectionDelay.toString()), + ) } + delay(webRedirectionDelay) _webPageUrl.value = extractWebPageUrl() } } @@ -147,23 +163,6 @@ constructor( screenState.value is UiState.Success && webRedirectionPlatform.value != WebRedirectionPlatform.WEBVIEW - private fun calculateRedirectDelayForSmsUpload( - preSignedUrlListResponse: PreSignedUrlListResponse? - ): Long { - val smsUploadStatus = - preSignedUrlListResponse - ?.preSignedUrlList - ?.find { it.ingestionType == IngestionType.SMS.name } - ?.upload - .orFalse() - return if (smsUploadStatus) { - FirebaseRemoteConfigHelper.getLong(WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS) - } else { - webRedirectionData.value?.webRedirectionDelayInMillis - ?: FirebaseRemoteConfigHelper.getLong(WEB_REDIRECTION_DEFAULT_DELAY_IN_MILLIS) - } - } - private fun generateUrlForWebRedirect(codeVerifier: String, token: String): String? { return getValueFromMap(WEB_BASE_URL)?.let { url -> updateParameters(token, codeVerifier) diff --git a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt index 77efbe6012..a0362458d8 100644 --- a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt +++ b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt @@ -212,6 +212,8 @@ object FirebaseRemoteConfigHelper { const val WEB_REDIRECTION_DEFAULT_DELAY_IN_MILLIS = "WEB_REDIRECTION_DEFAULT_DELAY_IN_MILLIS" const val WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS = "WEB_REDIRECTION_SMS_UPLOADED_DELAY_IN_MILLIS" + const val WEB_REDIRECTION_FIRST_LAUNCH_DELAY_IN_MILLIS = + "WEB_REDIRECTION_FIRST_LAUNCH_DELAY_IN_MILLIS" const val ROOT_CA_ADDITION_TARGET_SDK = "ROOT_CA_ADDITION_TARGET_SDK"