NTP-35718 | Android - Web Redirection Screen Optimization (#14882)

This commit is contained in:
Sanjay P
2025-02-11 14:39:33 +05:30
committed by GitHub
parent ebcd5c106c
commit 8635de08c0
5 changed files with 98 additions and 36 deletions

View File

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

View File

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

View File

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

View File

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

View File

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