NTP-62367 | Disable touch (#16140)

Co-authored-by: abhinav-g_navi <abhinav.g@navi.com>
This commit is contained in:
Naman Khurmi
2025-05-12 21:03:41 +05:30
committed by GitHub
parent 4b03c8ac4c
commit 39493db486
6 changed files with 80 additions and 1 deletions

View File

@@ -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",

View File

@@ -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 {

View File

@@ -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)

View File

@@ -85,7 +85,6 @@ constructor(
eventHandler: (HpEvents) -> Unit,
) {
trackEvent(TYPE_SYNC_START, mapOf(PARAM_IS_FIRST_TIME to isFirstTimeRender.toString()))
if (isFirstTimeRender) {
initializeFirstTimeContentSync(
fetchHomeContent,

View File

@@ -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<Boolean> = MutableStateFlow(false)
val isClickEnabled: StateFlow<Boolean> = _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(

View File

@@ -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"