NTP-7543 | Add events to track save and get of tokens from Pref manager (#13035)

This commit is contained in:
Soumya Ranjan Patra
2024-10-14 13:32:02 +05:30
committed by GitHub
parent 5db8a3f420
commit 369fe906a5
5 changed files with 104 additions and 38 deletions

View File

@@ -9,6 +9,7 @@ package com.naviapp.app.initializers
import android.content.Context
import com.navi.alfred.network.AlfredApiLogsManager
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.sharedpref.PreferenceManager
import com.navi.base.utils.NetWatchManger
import com.navi.common.uitron.util.UiTronDependencyProvider
@@ -22,7 +23,9 @@ import javax.inject.Inject
class SdkInitializer @Inject constructor() : ComponentInitializer {
override fun initialize(application: NaviApplication) {
PreferenceManager.init(application)
PreferenceManager.init(application) { eventName, eventValues ->
NaviTrackEvent.trackEvent(eventName, eventValues)
}
NaviSDKHelper.init(naviApplication = application)
UiTronSdkManager.init(UiTronDependencyProvider(application.applicationContext))
initSdkDebugMode(application.applicationContext)

View File

@@ -37,6 +37,9 @@ object PreferenceManager {
MasterKey.Builder(application).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build()
}
private var eventCallback: ((eventName: String, eventValues: Map<String, String>?) -> Unit)? =
null
// Cleared on logout/endOfSession
private lateinit var sharedPreferencesForSession: SharedPreferences
private val secureSharedPreferencesForSession: SharedPreferences? by lazy {
@@ -49,6 +52,10 @@ object PreferenceManager {
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
} catch (e: Exception) {
this.eventCallback?.invoke(
"secured_preference_manager_exception",
mapOf("error_message" to e.message.toString())
)
null
}
}
@@ -69,8 +76,12 @@ object PreferenceManager {
}
}
fun init(application: Application) {
fun init(
application: Application,
trackEvent: (eventName: String, eventValues: Map<String, String>?) -> Unit = { _, _ -> }
) {
this.application = application
this.eventCallback = trackEvent
sharedPreferencesForSession =
application.getSharedPreferences(PREFS_FILENAME_SESSION, Context.MODE_PRIVATE)
sharedPreferencesForApp =
@@ -296,6 +307,32 @@ object PreferenceManager {
} else setStringPreference(key, value)
}
fun saveStringTokenSecurelySynchronously(key: String, value: String, refresh: Boolean) {
if (shouldUseEncryptedSharedPref()) {
val editor = secureSharedPreferencesForSession?.edit()
editor?.putString(key, value)
editor?.commit()
eventCallback?.invoke(
"token_saved",
mapOf(
"is_secured" to "true",
"key_$key" to value.takeLast(5),
"refresh" to refresh.toString()
)
)
} else {
setStringPreferenceSynchronously(key, value)
eventCallback?.invoke(
"token_saved",
mapOf(
"is_secured" to "false",
"key_$key" to value.takeLast(5),
"refresh" to refresh.toString()
)
)
}
}
fun saveIntSecurely(key: String, value: Int) {
if (shouldUseEncryptedSharedPref()) {
val editor = secureSharedPreferencesForSession?.edit()

View File

@@ -55,17 +55,28 @@ object BaseUtils {
?: run { PreferenceManager.getStringPreference(CommonPrefConstants.SESSION_TOKEN) }
}
fun saveSessionToken(sessionToken: String) {
PreferenceManager.saveStringSecurely(CommonPrefConstants.SESSION_TOKEN, sessionToken)
fun saveSessionToken(sessionToken: String, refresh: Boolean = false) {
PreferenceManager.saveStringTokenSecurelySynchronously(
CommonPrefConstants.SESSION_TOKEN,
sessionToken,
refresh
)
}
fun getRefreshToken(): String? {
fun getRefreshToken(trackEvent: () -> Unit = {}): String? {
return PreferenceManager.getSecureString(CommonPrefConstants.REFRESH_TOKEN)
?: run { PreferenceManager.getStringPreference(CommonPrefConstants.REFRESH_TOKEN) }
?: run {
trackEvent()
PreferenceManager.getStringPreference(CommonPrefConstants.REFRESH_TOKEN)
}
}
fun saveRefreshToken(refreshToken: String) {
PreferenceManager.saveStringSecurely(CommonPrefConstants.REFRESH_TOKEN, refreshToken)
fun saveRefreshToken(refreshToken: String, refresh: Boolean = false) {
PreferenceManager.saveStringTokenSecurelySynchronously(
CommonPrefConstants.REFRESH_TOKEN,
refreshToken,
refresh
)
}
fun getPhoneNumber(): String? {

View File

@@ -114,8 +114,14 @@ private constructor(
return if (isLoggedIn) {
val updatedSessionToken = BaseUtils.getSessionToken()
val updatedRefreshToken = BaseUtils.getRefreshToken()
val updatedRefreshToken =
BaseUtils.getRefreshToken { analyticsTracker.getRefreshTokenFromUnsecuredPref() }
analyticsTracker.logTokens(
sessionToken = updatedSessionToken?.takeLast(5).orEmpty(),
refreshToken = updatedRefreshToken?.takeLast(5).orEmpty(),
isUpdateRequired = false,
response.request.url.toString()
)
SessionData(sessionToken = updatedSessionToken, refreshToken = updatedRefreshToken)
} else {
null
@@ -133,9 +139,19 @@ private constructor(
val refreshTokenRequest =
RefreshTokenRequest(
sessionToken = BaseUtils.getSessionToken(),
refreshToken = BaseUtils.getRefreshToken()
refreshToken =
BaseUtils.getRefreshToken {
analyticsTracker.getRefreshTokenFromUnsecuredPref()
}
)
analyticsTracker.logTokens(
sessionToken = refreshTokenRequest.sessionToken?.takeLast(5).orEmpty(),
refreshToken = refreshTokenRequest.refreshToken?.takeLast(5).orEmpty(),
isUpdateRequired = true,
response.request.url.toString()
)
val refreshTokenApiResponse =
apiResponseCallback(
CommonRetrofitProvider.authenticationRetrofitService.refreshToken(
@@ -166,8 +182,8 @@ private constructor(
)
return if (isSuccessWithData) {
val refreshTokenResponse = refreshTokenApiResponse.data!!
BaseUtils.saveSessionToken(refreshTokenResponse.sessionToken!!)
BaseUtils.saveRefreshToken(refreshTokenResponse.refreshToken!!)
BaseUtils.saveSessionToken(refreshTokenResponse.sessionToken!!, true)
BaseUtils.saveRefreshToken(refreshTokenResponse.refreshToken!!, true)
acknowledgeRefreshedToken()
SessionData(
sessionToken = refreshTokenResponse.sessionToken,

View File

@@ -434,24 +434,6 @@ class CommonNaviAnalytics private constructor() {
)
)
}
fun timeSpendOnScreen(
eventName: String?,
screenName: String,
loanApplicationId: String,
loanType: String,
duration: String
) {
NaviTrackEvent.trackEventOnClickStream(
eventName ?: "HL_Screen_Activity",
mapOf(
Pair("screen_name", screenName),
Pair("loan_application_id", loanApplicationId),
Pair("loan_type", loanType),
Pair("duration_ms", duration)
)
)
}
}
inner class CustomerFeedback {
@@ -579,6 +561,30 @@ class CommonNaviAnalytics private constructor() {
NaviTrackEvent.trackEvent("refresh_token_cancelled", map)
}
fun getRefreshTokenFromUnsecuredPref() {
NaviTrackEvent.trackEvent(
eventName = "get_unsecured_ref_token",
)
}
fun logTokens(
sessionToken: String,
refreshToken: String,
isUpdateRequired: Boolean,
url: String
) {
NaviTrackEvent.trackEvent(
eventName = "log_tokens",
eventValues =
mapOf(
Pair(CommonPrefConstants.SESSION_TOKEN, sessionToken),
Pair(CommonPrefConstants.REFRESH_TOKEN, refreshToken),
Pair("isUpdateRequired", isUpdateRequired.toString()),
Pair("apiUrl", url)
)
)
}
fun onGetExistingSessionToken(apiUrl: String, isLoggedIn: Boolean) {
val map = mapOf(Pair("isLoggedIn", isLoggedIn.toString()), Pair("apiUrl", apiUrl))
NaviTrackEvent.trackEvent("dev_get_existing_session_token", map)
@@ -1093,13 +1099,6 @@ class CommonNaviAnalytics private constructor() {
)
}
fun sourceOfLocation(source: String) {
NaviTrackEvent.trackEvent(
eventName = "geocoding_source",
eventValues = mapOf("source" to source)
)
}
fun onLocationFetched(deviceLocation: DeviceLocation) {
NaviTrackEvent.trackEvent(
eventName = "geocoding_location_fetched",