diff --git a/android/app/src/main/java/com/naviapp/adverse/AdverseDependencyProvider.kt b/android/app/src/main/java/com/naviapp/adverse/AdverseDependencyProvider.kt index ad91ebd35f..e650e6b4de 100644 --- a/android/app/src/main/java/com/naviapp/adverse/AdverseDependencyProvider.kt +++ b/android/app/src/main/java/com/naviapp/adverse/AdverseDependencyProvider.kt @@ -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 diff --git a/android/app/src/main/java/com/naviapp/analytics/deeplink/DeeplinkManager.kt b/android/app/src/main/java/com/naviapp/analytics/deeplink/DeeplinkManager.kt index 36c6f7b6d4..bbd9e857cd 100644 --- a/android/app/src/main/java/com/naviapp/analytics/deeplink/DeeplinkManager.kt +++ b/android/app/src/main/java/com/naviapp/analytics/deeplink/DeeplinkManager.kt @@ -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) } diff --git a/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt b/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt index c8edf0be60..58ce1c54ff 100644 --- a/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt +++ b/android/app/src/main/java/com/naviapp/analytics/utils/NaviAnalytics.kt @@ -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" diff --git a/android/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt b/android/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt index 8eae896d39..bef8a2c8c0 100644 --- a/android/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt +++ b/android/app/src/main/java/com/naviapp/common/navigator/NaviDeepLinkNavigator.kt @@ -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? { return when (url) { BOTTOM_SHEET_R11_PAYMENT -> Pair(R11PaymentBottomSheet.TAG, R11PaymentBottomSheet()) diff --git a/android/app/src/main/java/com/naviapp/deeplinkmanagement/usecase/NativeDeeplinkManager.kt b/android/app/src/main/java/com/naviapp/deeplinkmanagement/usecase/NativeDeeplinkManager.kt index 6d67030213..59e4c1011f 100644 --- a/android/app/src/main/java/com/naviapp/deeplinkmanagement/usecase/NativeDeeplinkManager.kt +++ b/android/app/src/main/java/com/naviapp/deeplinkmanagement/usecase/NativeDeeplinkManager.kt @@ -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 diff --git a/android/app/src/main/java/com/naviapp/utils/Constants.kt b/android/app/src/main/java/com/naviapp/utils/Constants.kt index 81a548e189..57bc4cc820 100644 --- a/android/app/src/main/java/com/naviapp/utils/Constants.kt +++ b/android/app/src/main/java/com/naviapp/utils/Constants.kt @@ -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" diff --git a/android/navi-base/src/main/java/com/navi/base/deeplink/listener/DeepLinkListener.kt b/android/navi-base/src/main/java/com/navi/base/deeplink/listener/DeepLinkListener.kt index 4dcbccf147..59f2ac5df1 100644 --- a/android/navi-base/src/main/java/com/navi/base/deeplink/listener/DeepLinkListener.kt +++ b/android/navi-base/src/main/java/com/navi/base/deeplink/listener/DeepLinkListener.kt @@ -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) } diff --git a/android/navi-chat/src/main/java/com/navi/chat/ui/activities/CRMWebViewActivity.kt b/android/navi-chat/src/main/java/com/navi/chat/ui/activities/CRMWebViewActivity.kt index cf6def10ec..644530deab 100644 --- a/android/navi-chat/src/main/java/com/navi/chat/ui/activities/CRMWebViewActivity.kt +++ b/android/navi-chat/src/main/java/com/navi/chat/ui/activities/CRMWebViewActivity.kt @@ -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( diff --git a/android/navi-common/src/main/java/com/navi/common/utils/Constants.kt b/android/navi-common/src/main/java/com/navi/common/utils/Constants.kt index 5dd179058e..7f6edfa1e0 100644 --- a/android/navi-common/src/main/java/com/navi/common/utils/Constants.kt +++ b/android/navi-common/src/main/java/com/navi/common/utils/Constants.kt @@ -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"