From 2d5ae7c40240e87d43f52b4f3446ab8ea9df3b40 Mon Sep 17 00:00:00 2001 From: Shiv Natani Date: Tue, 28 Jan 2025 15:21:56 +0530 Subject: [PATCH] Ntp-28633 | Shiv Natani | alfred masking pms (#14615) --- .../navi/pay/common/ui/NaviPayCommonView.kt | 10 +++++- .../screens/CardDetailsScreen.kt | 25 ++++++++++++++ .../nativepayment/screens/MPSScreen.kt | 25 ++++++++++++++ .../nativepayment/screens/NPSScreen.kt | 25 ++++++++++++++ .../nativepayment/screens/ScanCardScreen.kt | 33 ++++++++++++++++++- 5 files changed, 116 insertions(+), 2 deletions(-) diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt index 8c4c8be7b4..0b963fcb05 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt @@ -176,6 +176,7 @@ import com.navi.pay.utils.noRippleClickable import com.navi.pay.utils.noRippleClickableWithDebounce import com.navi.pay.utils.shake import com.navi.pay.utils.shimmerEffect +import com.navi.uitron.utils.alfredMaskSensitiveComposable import com.navi.uitron.utils.orValue import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -3447,8 +3448,15 @@ fun RenderCheckBalanceActionOrResultSection( @Composable private fun RenderCheckBalanceSuccessState(balance: String, alpha: Float = 1f) { + val view = LocalView.current NaviText( - modifier = Modifier.padding(start = 4.dp), + modifier = + Modifier.padding(start = 4.dp) + .alfredMaskSensitiveComposable( + isSensitive = true, + rootView = view, + id = "balance_text", + ), text = balance, fontFamily = naviFontFamily, fontWeight = getFontWeight(FontWeightEnum.NAVI_HEADLINE_REGULAR), diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/CardDetailsScreen.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/CardDetailsScreen.kt index 8c91fb4259..838067d2a1 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/CardDetailsScreen.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/CardDetailsScreen.kt @@ -41,6 +41,7 @@ import androidx.compose.material3.Button import androidx.compose.material3.ButtonColors import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -74,8 +75,12 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.fragment.app.FragmentActivity import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil.compose.AsyncImage +import com.navi.alfred.AlfredManager import com.navi.base.utils.EMPTY import com.navi.common.utils.ClickDebounce import com.navi.common.utils.get @@ -145,6 +150,26 @@ fun CardDetailScreenRoot( val cardFocusRequester = remember { FocusRequester() } val expiryFocusRequester = remember { FocusRequester() } val cvvFocusRequester = remember { FocusRequester() } + val lifecycleOwner = LocalLifecycleOwner.current + + DisposableEffect(key1 = lifecycleOwner) { + val observer = LifecycleEventObserver { _, event -> + when (event) { + Lifecycle.Event.ON_CREATE, + Lifecycle.Event.ON_RESUME -> { + AlfredManager.setCurrentScreenName( + NaviPaymentAnalyticScreenName.CARD_SCREEN.screenName + ) + } + else -> {} + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + AlfredManager.setCurrentScreenName(paymentActivity.screenName) + } + } HandleScanCardResult(resultRecipientScanCardScreen, cardDetailScreenVM::onEvent) EffectsHandler( cardDetailScreenVM = cardDetailScreenVM, diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt index 65fe99972c..2345cb26e8 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.material.ModalBottomSheetValue import androidx.compose.material.Surface import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope @@ -29,7 +30,10 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.google.gson.Gson @@ -162,6 +166,27 @@ fun MPSScreen( skipHalfExpanded = true, ) + val lifecycleOwner = LocalLifecycleOwner.current + + DisposableEffect(key1 = lifecycleOwner) { + val observer = LifecycleEventObserver { _, event -> + when (event) { + Lifecycle.Event.ON_CREATE, + Lifecycle.Event.ON_RESUME -> { + AlfredManager.setCurrentScreenName( + NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName + ) + } + else -> {} + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + AlfredManager.setCurrentScreenName(naviPaymentActivity.screenName) + } + } + LaunchedEffect(key1 = bottomSheetStateHolder.showBottomSheet) { when (bottomSheetStateHolder.showBottomSheet) { true -> coroutineScope.launch { bottomSheetState.show() } diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/NPSScreen.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/NPSScreen.kt index ef5d6512e7..80f56ad0fc 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/NPSScreen.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/NPSScreen.kt @@ -36,6 +36,7 @@ import androidx.compose.material.ModalBottomSheetValue import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -52,10 +53,14 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.airbnb.lottie.compose.LottieAnimation import com.airbnb.lottie.compose.LottieCompositionSpec import com.airbnb.lottie.compose.rememberLottieComposition +import com.navi.alfred.AlfredManager import com.navi.base.utils.isNotNull import com.navi.base.utils.isNotNullAndNotEmpty import com.navi.base.utils.isNull @@ -158,6 +163,26 @@ fun NPSScreenRoot( ) val isKeyboardVisible = WindowInsets.isImeVisible val npsScreenState by npsViewModel.state.collectAsStateWithLifecycle() + val lifecycleOwner = LocalLifecycleOwner.current + + DisposableEffect(key1 = lifecycleOwner) { + val observer = LifecycleEventObserver { _, event -> + when (event) { + Lifecycle.Event.ON_CREATE, + Lifecycle.Event.ON_RESUME -> { + AlfredManager.setCurrentScreenName( + NaviPaymentAnalyticScreenName.FULL_PAYMENT_SCREEN.screenName + ) + } + else -> {} + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + AlfredManager.setCurrentScreenName(activity.screenName) + } + } LaunchedEffect(Unit) { naviPaymentAnalytics.onNPSLanded(npsViewModel.getAnalyticsParams()) diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/ScanCardScreen.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/ScanCardScreen.kt index 4c50cbd307..10d9ecb018 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/ScanCardScreen.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/ScanCardScreen.kt @@ -73,6 +73,7 @@ import androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion.LongPress import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -91,6 +92,7 @@ import com.google.accompanist.permissions.MultiplePermissionsState import com.google.mlkit.vision.common.InputImage import com.google.mlkit.vision.text.TextRecognition import com.google.mlkit.vision.text.latin.TextRecognizerOptions +import com.navi.alfred.AlfredManager import com.navi.base.utils.EMPTY import com.navi.common.utils.log import com.navi.design.font.FontWeightEnum @@ -121,6 +123,7 @@ import com.navi.payment.nativepayment.presentation.reducer.TorchEvent import com.navi.payment.nativepayment.viewmodel.ScanCardResult import com.navi.payment.nativepayment.viewmodel.ScanCardVM import com.navi.payment.utils.Constants.DEFAULT_ZOOM_RATIO +import com.navi.uitron.utils.alfredMaskSensitiveComposable import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.result.ResultBackNavigator import kotlinx.coroutines.CoroutineScope @@ -136,6 +139,7 @@ fun ScanCardScreenRoot( scanCardVM: ScanCardVM = hiltViewModel(), resultNavigator: ResultBackNavigator, paymentAmount: Double = 0.0, + activity: NaviPaymentActivity, scanCardAnalytics: NaviPaymentAnalytics.ScanCardScreen = NaviPaymentAnalytics.INSTANCE.ScanCardScreen(), ) { @@ -162,6 +166,25 @@ fun ScanCardScreenRoot( BackHandler { onEvent(ScanCardEvent.OnBackPress) } + DisposableEffect(key1 = lifecycleOwner) { + val observer = LifecycleEventObserver { _, event -> + when (event) { + Lifecycle.Event.ON_CREATE, + Lifecycle.Event.ON_RESUME -> { + AlfredManager.setCurrentScreenName( + NaviPaymentAnalyticScreenName.SCAN_CARD_SCREEN.screenName + ) + } + else -> {} + } + } + lifecycleOwner.lifecycle.addObserver(observer) + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + AlfredManager.setCurrentScreenName(activity.screenName) + } + } + EffectsHandler( scanCardVM = scanCardVM, resultNavigator = resultNavigator, @@ -280,13 +303,21 @@ private fun ScanCardMainContent( modifier = Modifier.fillMaxWidth().padding(horizontal = 32.dp).align(Alignment.Start) ) { + val view = LocalView.current CardScannerView( naviPaymentActivity = naviPaymentActivity, isFlashEnabled = scanCardVM.isTorchEnabled, scanCardAnalytics = scanCardAnalytics, onEvent = onEvent, modifier = - Modifier.fillMaxWidth().aspectRatio(1f).clip(RoundedCornerShape(4.dp)), + Modifier.fillMaxWidth() + .aspectRatio(1f) + .clip(RoundedCornerShape(4.dp)) + .alfredMaskSensitiveComposable( + isSensitive = true, + rootView = view, + id = "card_scan", + ), ) FrameImage() }