NTP-35718 | Android - Web Redirection Screen Optimization (#14882)
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user