From 39493db486084210d806356b1d592db2f91663aa Mon Sep 17 00:00:00 2001 From: Naman Khurmi Date: Mon, 12 May 2025 21:03:41 +0530 Subject: [PATCH] NTP-62367 | Disable touch (#16140) Co-authored-by: abhinav-g_navi --- .../naviapp/analytics/utils/NaviAnalytics.kt | 8 ++++ .../home/compose/activity/HomePageActivity.kt | 41 +++++++++++++++++++ .../home/ui/screen/HomeScreenScaffold.kt | 12 ++++++ .../usecase/HomeContentProcessingUseCase.kt | 1 - .../naviapp/home/viewmodel/HomeViewModel.kt | 16 ++++++++ .../FirebaseRemoteConfigHelper.kt | 3 ++ 6 files changed, 80 insertions(+), 1 deletion(-) 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 5305d3bbb9..49eba3fbcc 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 @@ -314,6 +314,14 @@ class NaviAnalytics private constructor() { ) } + fun homeClickDisabled() { + NaviTrackEvent.trackEvent("NaviApp_HomePage_click_disabled") + } + + fun homeClickEnabled() { + NaviTrackEvent.trackEvent("NaviApp_HomePage_click_enabled") + } + fun onHomePageApiCall() { NaviTrackEvent.trackEvent( "G_Homepage_Home_Api_Start", diff --git a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt index 811ad362c9..7f15caa84f 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivity.kt @@ -13,6 +13,7 @@ import android.net.Uri import android.os.Bundle import android.provider.Settings import android.text.TextUtils +import android.view.WindowManager import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge @@ -78,6 +79,7 @@ import com.navi.common.utils.getDeviceSignature import com.navi.common.utils.getLocalStorageLocation import com.navi.common.utils.getNetworkType import com.navi.common.utils.getScreenRefreshRate +import com.navi.common.utils.getTotalRamMemory import com.navi.common.utils.isInstalledInProfile import com.navi.common.utils.logNaviPayGlanceWidgetClick import com.navi.common.utils.observeNonNull @@ -323,6 +325,7 @@ class HomePageActivity : } } initObservers() + handleInitialTouchEventState() initErrors() fetchHomeData() trackLaunchEvents() @@ -338,6 +341,44 @@ class HomePageActivity : TraceManager.endAllTraces() } + private fun shouldDisableInitialTouchEvent(): Boolean { + val isTouchDisabled = + FirebaseRemoteConfigHelper.getBoolean( + FirebaseRemoteConfigHelper.DISABLE_INITIAL_TOUCH_EVENT, + false, + ) + val maxRamThresholdGb = + FirebaseRemoteConfigHelper.getDouble( + FirebaseRemoteConfigHelper.DISABLE_INITIAL_TOUCH_EVENT_MAX_RAM + ) + val deviceRamGb = getTotalRamMemory(this)?.toDoubleOrNull() ?: 0.0 + + return isTouchDisabled && deviceRamGb < maxRamThresholdGb + } + + private fun handleInitialTouchEventState() { + lifecycleScope.launch { + if (shouldDisableInitialTouchEvent()) { + homeVM.isClickEnabled.collect { isEnabled -> + when { + !isEnabled -> { + window.setFlags( + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, + ) + naviAnalyticsEventTracker.homeClickDisabled() + } + + else -> { + window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) + naviAnalyticsEventTracker.homeClickEnabled() + } + } + } + } + } + } + private fun checkForAppLaunchEvent() { AppLoadTimerMapper.setAppLaunchEventStatus(intent.action != Intent.ACTION_MAIN) intent?.getStringExtra(NAVI_PAY_SECTION_GLANCE_WIDGET_SCREEN)?.let { diff --git a/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeScreenScaffold.kt b/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeScreenScaffold.kt index e5793b1470..0156fd2d57 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeScreenScaffold.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/home/ui/screen/HomeScreenScaffold.kt @@ -119,6 +119,18 @@ internal fun HomeScreenScaffoldRoot( ) } } + HandleClickOnHome(hpStates, homeVM) +} + +@Composable +fun HandleClickOnHome(hpStates: () -> HpStates, homeVM: () -> HomeViewModel) { + LaunchedEffect(hpStates().isHomePageRendered) { + homeVM().isClickEnabled.collect { enabled -> + if (!enabled && hpStates().isHomePageRendered) { + homeVM().updateClickEnabledState(true) + } + } + } } @OptIn(ExperimentalFoundationApi::class) diff --git a/android/app/src/main/java/com/naviapp/home/usecase/HomeContentProcessingUseCase.kt b/android/app/src/main/java/com/naviapp/home/usecase/HomeContentProcessingUseCase.kt index b56703d9ea..a2de6aace0 100644 --- a/android/app/src/main/java/com/naviapp/home/usecase/HomeContentProcessingUseCase.kt +++ b/android/app/src/main/java/com/naviapp/home/usecase/HomeContentProcessingUseCase.kt @@ -85,7 +85,6 @@ constructor( eventHandler: (HpEvents) -> Unit, ) { trackEvent(TYPE_SYNC_START, mapOf(PARAM_IS_FIRST_TIME to isFirstTimeRender.toString())) - if (isFirstTimeRender) { initializeFirstTimeContentSync( fetchHomeContent, diff --git a/android/app/src/main/java/com/naviapp/home/viewmodel/HomeViewModel.kt b/android/app/src/main/java/com/naviapp/home/viewmodel/HomeViewModel.kt index 28844d58cb..e67082167b 100644 --- a/android/app/src/main/java/com/naviapp/home/viewmodel/HomeViewModel.kt +++ b/android/app/src/main/java/com/naviapp/home/viewmodel/HomeViewModel.kt @@ -62,8 +62,11 @@ import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.TimeoutCancellationException +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout @@ -105,6 +108,19 @@ constructor( viewModelScope.safeLaunch((Dispatchers.IO)) { observeInternetConnectivity() } } + private val _isClickEnabled: MutableStateFlow = MutableStateFlow(false) + val isClickEnabled: StateFlow = _isClickEnabled + + fun updateClickEnabledState(isClickEnabled: Boolean) { + viewModelScope.safeLaunch(Dispatchers.IO) { + _isClickEnabled.value = isClickEnabled + delay(10_000) + if (_isClickEnabled.value.not()) { + updateClickEnabledState(true) + } + } + } + private suspend fun observeActionCallback() { getActionCallback().collect { action -> ctaHandler.onActionTriggered( diff --git a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt index 406043c911..127de7196c 100644 --- a/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt +++ b/android/navi-common/src/main/java/com/navi/common/firebaseremoteconfig/FirebaseRemoteConfigHelper.kt @@ -247,6 +247,9 @@ object FirebaseRemoteConfigHelper { const val ROOT_CA_ADDITION_TARGET_SDK = "ROOT_CA_ADDITION_TARGET_SDK" + const val DISABLE_INITIAL_TOUCH_EVENT = "DISABLE_INITIAL_TOUCH_EVENT" + const val DISABLE_INITIAL_TOUCH_EVENT_MAX_RAM = "DISABLE_INITIAL_TOUCH_EVENT_MAX_RAM" + // Api Retry constants const val RETRY_INTERCEPTOR_ENABLED = "RETRY_INTERCEPTOR_ENABLED" const val UPI_RETRY_INTERCEPTOR_ENABLED = "UPI_RETRY_INTERCEPTOR_ENABLED"