NTP-63568 | NaviLink support for CRM WebView (#16680)

This commit is contained in:
Soumya Ranjan Patra
2025-06-21 12:07:53 +05:30
committed by GitHub
parent f5e3603314
commit 83abfe5e8b
9 changed files with 62 additions and 65 deletions

View File

@@ -31,13 +31,13 @@ import com.navi.base.utils.isNotNull
import com.navi.base.utils.orFalse
import com.navi.common.uitron.model.action.CtaAction
import com.navi.common.utils.Constants.ADVERSE
import com.navi.common.utils.Constants.NAVILINK
import com.navi.common.utils.Constants.PAGE_LAUNCH_SOURCE
import com.navi.common.utils.getSessionId
import com.navi.common.utils.registerUiTronDeSerializers
import com.navi.uitron.model.action.AnalyticsAction
import com.navi.uitron.model.data.UiTronAction
import com.naviapp.deeplinkmanagement.ui.DeeplinkManagementActivity
import com.naviapp.utils.Constants.NAVILINK
import com.naviapp.utils.Constants.NAVILINK_SMALL
import retrofit2.Response

View File

@@ -17,7 +17,9 @@ import com.navi.base.utils.BaseUtils
import com.navi.base.utils.isNotNull
import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.base.utils.orFalse
import com.navi.base.utils.orTrue
import com.navi.common.constants.DEVICE_ID
import com.navi.common.extensions.or
import com.navi.common.utils.Constants
import com.navi.common.utils.Constants.CHANNEL
import com.navi.common.utils.Constants.EVENT_NAME
@@ -26,6 +28,7 @@ import com.navi.common.utils.Constants.REWARDS_EXPERIMENT_NAME
import com.navi.common.utils.Constants.REWARD_CAMPAIGN_NAME
import com.navi.common.utils.Constants.SECONDARY_URL
import com.navi.common.utils.Constants.TYPE
import com.navi.common.utils.isValidResponse
import com.navi.common.utils.log
import com.navi.pay.utils.NAVI_PAY_CTA_URL_PREFIX
import com.navi.pay.utils.NAVI_PAY_OF_TYPE_INTENT_TRANSACTION
@@ -56,6 +59,7 @@ import io.branch.referral.Branch
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONObject
class DeeplinkManager(
@@ -71,7 +75,6 @@ class DeeplinkManager(
private const val META_DATA = "metadata"
private const val IS_UPI_DYNAMIC_DEEP_LINK = "isUpiDynamicDeeplink"
private const val NAVI_PAY_HOME_PAGE_URL = "naviPayHomePageUrl"
const val DEEPLINK_TYPE = "deeplinkType"
const val DEEPLINK_MANAGER = "DeeplinkManager"
const val NAVILINK_IDENTIFIER = "naviLinkIdentifier"
@@ -504,6 +507,32 @@ class DeeplinkManager(
}
}
fun processNaviLink(activity: Activity, naviLink: String, finish: Boolean? = true) {
CoroutineScope(Dispatchers.IO).launch {
val naviLinkIdentifier = naviLink.substringAfter("/", "")
naviAnalytics.sendNaviLinkDeeplinkEvent(naviLinkIdentifier)
val response = DeeplinkRepository().fetchNaviLinkData(naviLinkIdentifier)
if (response.isValidResponse()) {
withContext(Dispatchers.Main) {
naviAnalytics.sendNaviLinkSuccessEvent(
response.data?.nextCta,
wasUserLoggedIn = true,
)
navigateTo(
ctaData = response.data?.nextCta ?: CtaData(url = HOME_SMALL),
bundle = response.data?.nextCta?.bundle ?: Bundle(),
activity = activity,
finish = finish.orTrue(),
)
}
} else {
naviAnalytics.sendNaviLinkFailureEvent(
response.error?.message.or(response.errors?.firstOrNull()?.message)
)
}
}
}
fun sendEvent(originalLink: String?) {
naviAnalytics.sendSplashEvent(originalLink)
}

View File

@@ -565,13 +565,6 @@ class NaviAnalytics private constructor() {
NaviTrackEvent.trackEvent("jusPayAdditionalTracking_$log")
}
fun onNaviPayRequestCodeReceived(actionString: String?) {
NaviTrackEvent.trackEvent(
"onNaviPayRequestCodeReceived",
mapOf("actionString" to actionString.toString()),
)
}
fun trackEvent(eventName: String, screenName: String? = null) {
NaviTrackEvent.trackEvent(
eventName,
@@ -616,16 +609,6 @@ class NaviAnalytics private constructor() {
}
}
inner class PaymentTransaction {
fun onEmiPaymentsClick() {
NaviTrackEvent.trackEvent(HL_TRANCHE_EMI_PAYMENTS_TAB_CLICK)
}
fun onEmiDisbursalClick() {
NaviTrackEvent.trackEvent(HL_TRANCHE_EMI_DISBURSALS_TAB_CLICK)
}
}
inner class PartPrePayment {
fun onPageLaunch(widgetId: String?) {
if (widgetId == com.navi.common.utils.Constants.HOME_LOAN) {
@@ -733,18 +716,6 @@ class NaviAnalytics private constructor() {
mapOf(Pair("type", type.lowercase(Locale.ENGLISH))),
)
fun paymentProviderSuccess(type: String) =
NaviTrackEvent.trackEvent(
"payment_provider_success",
mapOf(Pair("type", type.lowercase(Locale.ENGLISH))),
)
fun paymentProviderFailure(type: String) =
NaviTrackEvent.trackEvent(
"payment_provider_failure",
mapOf(Pair("type", type.lowercase(Locale.ENGLISH))),
)
fun onPaymentButtonTap() = NaviTrackEvent.trackEvent("payment_button_tap")
fun onPaymentSDKInitializationFailed(provider: String, description: String) =
@@ -757,15 +728,6 @@ class NaviAnalytics private constructor() {
),
)
fun onPlPaymentTokenRecieved(isValidToken: Boolean) =
NaviTrackEvent.trackEvent(
eventName = "pl_payment_token_received",
mapOf(
Pair("sync", "true"),
Pair(PaymentAnalytics.IS_TOKEN_VALID, isValidToken.toString()),
),
)
fun onPlPaymentInitiatePaymentCalled(loanType: String?) =
NaviTrackEvent.trackEvent(
eventName = "pl_initiate_payment_called",
@@ -970,6 +932,13 @@ class NaviAnalytics private constructor() {
),
)
}
fun sendNaviLinkFailureEvent(errorMessage: String? = null) {
NaviTrackEvent.trackEventOnClickStream(
"NaviLink_Deeplink_Failure_Event",
mapOf(Pair("errorMessage", errorMessage.orEmpty())),
)
}
}
inner class TopUpLoanIntro(val screenName: String? = null) {
@@ -1251,8 +1220,6 @@ class NaviAnalytics private constructor() {
const val SPLASH = "splash"
const val PHONE_NUMBER = "phone_number"
const val OTP_NUMBER = "otp_screen"
const val KYC = "kyc"
const val BANK_DETAILS = "bank_details"
const val HOME = "home"
const val NEW_HOME = "NaviApp_HomePage_Lands"
const val IS_GPS_ENABLED = "is_gps_enabled"
@@ -1269,7 +1236,6 @@ class NaviAnalytics private constructor() {
const val PROFILE_SCREEN = "profile_screen"
const val NEW_USER_EXPERIENCE_ACTIVITY = "new_user_experience_activity"
const val NAVI_DEEPLINK_MANAGEMENT_ACTIVITY = "NaviDeeplinkManagementActivityLanded"
const val LOAN_DETAILS = "loan_details"
const val CUSTOMER_SUPPORT = "customer_support"
const val ABOUT_US = "about_us"
const val REGISTRATION = "registration"
@@ -1277,12 +1243,9 @@ class NaviAnalytics private constructor() {
const val TRUE = "true"
const val FALSE = "false"
const val NO = "no"
const val INSTALLMENT = "installment"
const val AUTO_PAY = "autopay"
const val CURRENCY = "INR"
private const val BOTTOM_SHEET = "bottom_sheet"
const val CSAT_BOTTOM_SHEET = "csat_$BOTTOM_SHEET"
@@ -1291,10 +1254,7 @@ class NaviAnalytics private constructor() {
const val CUSTOM_PAYMENT_TYPE_SCREEN = "custom_payment_type_screen"
const val LOAN_REPAYMENT_TYPE_SCREEN = "loan_repayment_type_screen"
const val CUSTOM_PAYMENT_SCREEN = "custom_payment_screen"
const val PART_PRE_PAYMENT_TYPE_SCREEN = "part_pre_payment_type_screen"
const val PART_PRE_PAYMENT_SCREEN = "part_pre_payment_screen"
const val PART_PRE_PAYMENT_CUSTOM_AMOUNT_SCREEN = "part_pre_payment_custom_amount_screen"
const val PART_PRE_PAYMENT_EMI_CALENDAR_SCREEN = "part_pre_payment_emi_calendar_screen"
const val UPFRONT_PAYMENT_SCREEN = "upfront_payment_screen"
const val PAYMENT_SCREEN = "payment_screen"
const val COMMON_BOTTOM_SHEET = "common_bottom_sheet"
@@ -1313,8 +1273,6 @@ class NaviAnalytics private constructor() {
const val PL_PAY_CUSTOM_AMOUNT_PAY_NOW_FLOW = "pay_custom_amount_pay_now"
const val PL_DETAILS_FORECLOSE_PAY_CLICK = "PL_forecloseLoan_CTA_Pay_click"
const val PL_FORECLOSE_PAY_CLICK = "PL_foreclose_pay_click"
const val HL_TRANCHE_EMI_PAYMENTS_TAB_CLICK = "HL_tranche_txns_my_payments_tab_click"
const val HL_TRANCHE_EMI_DISBURSALS_TAB_CLICK = "HL_tranche_txns_disbsl_by_navi_tab_click"
const val HL_PPP_PAGE_LAUNCH = "HL_ppp_page_lands"
const val PL_PPP_PAGE_LAUNCH = "PL_ppp_page_lands"
const val HL_PPP_PAY_CLICK = "HL_ppp_CTA_pay_click"
@@ -1333,12 +1291,9 @@ class NaviAnalytics private constructor() {
const val METHOD_NAME = "method_name"
const val LINE_NUMBER = "line_number"
const val ANR_MESSAGE = "anr_message"
const val ANR_STACK_TRACE = "anr_stack_trace"
const val VERTICAL = "vertical"
const val FOREGROUND_SCREEN = "foregroundScreen"
const val ALFRED_SESSION_ID = "alfredSessionId"
const val CUSTOM_DNS_ENABLED = "customDnsV2Enabled"
const val NETWORK_CONNECTIVITY_INTERCEPTOR_ENABLED = "networkConnectivityInterceptorEnabled"
const val FOREGROUND_VERTICAL = "foregroundVertical"
const val EXTERNAL = "EXTERNAL"
const val TRACE_SIZE = "trace_size"
@@ -1363,8 +1318,6 @@ class NaviAnalytics private constructor() {
const val PL_LOAN_REPAYMENT_BOTTOMSHEET_POPUP = "pl_post_more_options_bottomsheet_popup"
const val CUSTOM_AMOUNT_CALENDAR_REVIEW_SCREEN = "custom_amount_calendar_review_screen"
const val LOGIN_FLAG = "login_flag"
const val POLICY_GRID_BOTTOMSHEET = "policy_grid_bottomsheet"
@@ -1377,15 +1330,12 @@ class NaviAnalytics private constructor() {
const val ELIGIBLE_FOR_BALANCE_TRANSFER = "Eligible for balance transfer"
const val COLENDING_BALANCE_TRANSFER_EVENT = "coLendingBalanceTransferEvent"
const val PL_FORECLOSE_PRE_APPROVED_VIEW = "PL_foreclose_preapproved_view"
const val AMC_BTN_DASHBOARD_INVEST_NOW = "amc_btn_dashboard_invest_now"
const val PAYMENT_BEHAVIOUR_ACTIVITY = "payment_behaviour_activity"
const val PAYMENT_BEHAVIOUR_SCREEN = "payment_behaviour_screen"
const val DISBURSEMENT_PAGE_LAND = "disbursementsPageLand"
const val REASON_PAYMENT_REQUEST_OBJ_NULL = "Payment request object is null"
const val ACTIVITY_REF_NULL = "Activity reference is null"
const val PAYMENT_PROVIDER_NULL = "Payment provider is null"

View File

@@ -942,6 +942,10 @@ object NaviDeepLinkNavigator : DeepLinkListener {
DeeplinkManager().fetchBranchSDKData(activity, deeplink, clearTask, finish)
}
override fun processNaviLink(activity: Activity, naviLink: String, finish: Boolean?) {
DeeplinkManager().processNaviLink(activity = activity, naviLink = naviLink, finish = finish)
}
private fun getBottomSheet(url: String?): Pair<String, BottomSheetDialogFragment>? {
return when (url) {
BOTTOM_SHEET_R11_PAYMENT -> Pair(R11PaymentBottomSheet.TAG, R11PaymentBottomSheet())

View File

@@ -16,6 +16,7 @@ import com.navi.base.utils.BaseUtils
import com.navi.chat.utils.CHAT_PN_OPENED
import com.navi.chat.utils.HOME_SCREEN
import com.navi.chat.utils.SCREEN_NAME
import com.navi.common.utils.Constants.NAVILINK
import com.naviapp.analytics.deeplink.DeeplinkType
import com.naviapp.common.navigator.NaviDeepLinkNavigator
import com.naviapp.deeplinkmanagement.analytics.NaviDeeplinkAnalytics
@@ -23,7 +24,6 @@ import com.naviapp.models.DeeplinkData
import com.naviapp.registration.helper.getChatParams
import com.naviapp.registration.helper.isNotificationAlive
import com.naviapp.utils.Constants
import com.naviapp.utils.Constants.NAVILINK
import com.naviapp.utils.isPublicPage
import kotlin.reflect.KFunction1

View File

@@ -34,7 +34,6 @@ object Constants {
const val HOME_LOAN = "home"
const val PERSONAL_LOAN = "personal"
const val MESSAGE_ID = "messageId"
const val NAVILINK = "NAVILINK"
const val NAVILINK_SMALL = "navilink"
const val BRANCH = "branch"
const val DEEPLINK = "deeplink"
@@ -49,8 +48,6 @@ object Constants {
const val INPUT_TEXT_MAX_LENGTH = 50
const val TYPE_PERSONAL_LOAN = "PERSONAL_LOAN"
const val IS_COMING_FROM_INREVIEW_PAGE = "is_coming_from_inreview_page"
const val PREVIOUS_SCREEN = "PREVIOUS_SCREEN"
const val LOAN_CLOSED = "Loan_Closed"
const val SUCCESS = "Success"
const val DATE_FORMAT_MONTH_YEAR = "MM/yyyy"
const val ZERO = "0"
@@ -75,7 +72,6 @@ object Constants {
const val DELIVERED = "DELIVERED"
const val NOTIFICATION_PERMISSION_DENIED = "NOTIFICATION_PERMISSION_DENIED"
const val HOME_FEATURE = "PPE"
const val ANR_NAVI_REGEX = "com.navi"
const val SUCCESS_CAPITAL = "SUCCESS"
const val FAILED = "FAILED"
const val TEMPLATE_NAME = "templateName"
@@ -166,7 +162,6 @@ object Constants {
const val SHOW_LOW_UPI_LITE_BALANCE = "show_low_upi_lite_balance"
const val HIDE = "hide"
const val JOURNEY_SOURCE = "JOURNEY_SOURCE"
const val ALFRED_MODULE = "Alfred"
const val PAGE_HOME = "home"
const val HOME_SCREEN_IN_CAPS = "HOME_SCREEN"
const val PUSH_NOTIFICATION = "PUSH_NOTIFICATION"

View File

@@ -29,4 +29,14 @@ interface DeepLinkListener {
clearTask: Boolean?,
finish: Boolean?,
)
/**
* This is a generic method that should be used to process NaviLink from any activity/module.
*
* @param activity: The activity from which the link is being processed.
* @param naviLink: The Navi link to be processed. Example: "NAVILINK/NAVIQA_xyz"
* @param finish: Optional parameter to indicate whether to finish the activity after processing
* the link.
*/
fun processNaviLink(activity: Activity, naviLink: String, finish: Boolean? = true)
}

View File

@@ -59,6 +59,7 @@ import com.navi.common.model.ModuleNameV2
import com.navi.common.network.models.GenericErrorResponse
import com.navi.common.ui.activity.BaseActivity
import com.navi.common.utils.Constants
import com.navi.common.utils.Constants.NAVILINK
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@@ -211,6 +212,13 @@ class CRMWebViewActivity : BaseActivity() {
finish = ctaData.finish.orFalse(),
clearTask = ctaData.clearTask.orFalse(),
)
} else if (it.startsWith(NAVILINK)) {
DeepLinkManager.getDeepLinkListener()
?.processNaviLink(
activity = activity,
naviLink = it,
finish = ctaData.finish.orFalse(),
)
} else {
DeepLinkManager.getDeepLinkListener()
?.navigateTo(

View File

@@ -81,6 +81,7 @@ object Constants {
const val UTM_SOURCE = "utm_source"
const val UTM_MEDIUM = "utm_medium"
const val LINK_CLICK_ID = "link_click_id"
const val NAVILINK = "NAVILINK"
const val SECONDARY_URL = "secondaryUrl"
const val DATA = "data"