NTP-59939 | Add gps pop up in coin screen before redemption (#16616)
This commit is contained in:
committed by
GitHub
parent
bfa78fbc99
commit
1a730f0607
@@ -136,6 +136,7 @@ import com.navi.common.navigation.clearResult
|
||||
import com.navi.common.navigation.rememberNavigatorWithResultAndParams
|
||||
import com.navi.common.permission.PermissionResult
|
||||
import com.navi.common.permission.rememberMultiplePermissions
|
||||
import com.navi.common.uitron.handler.HandleTriggerGpsAction
|
||||
import com.navi.common.uitron.model.action.CtaAction
|
||||
import com.navi.common.uitron.model.action.ExecuteActionsCorrespondingToKey
|
||||
import com.navi.common.utils.CommonNaviAnalytics
|
||||
@@ -195,6 +196,8 @@ fun CoinHomeScreenV2(
|
||||
|
||||
val bottomSheetData by viewModel.bottomSheetDataAlchemist.collectAsState(null)
|
||||
|
||||
HandleTriggerGpsAction(context, viewModel)
|
||||
|
||||
val bottomSheetState =
|
||||
rememberModalBottomSheetState(
|
||||
initialValue = ModalBottomSheetValue.Hidden,
|
||||
@@ -255,7 +258,11 @@ fun CoinHomeScreenV2(
|
||||
|
||||
fun sendLocationUpdates() {
|
||||
if (viewModel.locationManager.isLocationOn(context)) {
|
||||
viewModel.locationManager.requestLocationUpdates(context, postLocation = true)
|
||||
viewModel.locationManager.requestLocationUpdates(
|
||||
context,
|
||||
postLocation = true,
|
||||
shouldTriggerGpsIntentOnFailure = false,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.navi.common.uitron.model.action.PostLocationAction
|
||||
import com.navi.common.uitron.model.action.PostPermissionAction
|
||||
import com.navi.common.uitron.model.action.SystemUiAction
|
||||
import com.navi.common.uitron.model.action.ThirdPartySdkAction
|
||||
import com.navi.common.uitron.model.action.TriggerGpsCheckAction
|
||||
import com.navi.common.uitron.model.action.UpdateStateHandleActionV2
|
||||
import com.navi.common.uitron.model.action.UpdateViewStateActionV2
|
||||
import com.navi.common.uitron.model.action.UpdateWidgetsStateAction
|
||||
@@ -77,6 +78,8 @@ open class UiTronActionDeserializer : BaseUiTronActionDeserializer() {
|
||||
context?.deserialize(jsonObject, SystemUiAction::class.java)
|
||||
ApActionType.PostPermissionAction.name ->
|
||||
context?.deserialize(jsonObject, PostPermissionAction::class.java)
|
||||
UiTronActionType.TriggerGpsCheckAction.name ->
|
||||
context?.deserialize(jsonObject, TriggerGpsCheckAction::class.java)
|
||||
else -> super.deserialize(json, typeOfT, context)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.common.uitron.handler
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.location.LocationManager
|
||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||
import androidx.activity.result.IntentSenderRequest
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import com.google.android.gms.common.api.ResolvableApiException
|
||||
import com.google.android.gms.location.LocationRequest
|
||||
import com.google.android.gms.location.LocationServices
|
||||
import com.google.android.gms.location.LocationSettingsRequest
|
||||
import com.google.android.gms.location.Priority
|
||||
import com.navi.common.uitron.model.action.TriggerGpsCheckAction
|
||||
import com.navi.uitron.viewmodel.UiTronViewModel
|
||||
|
||||
@Composable
|
||||
fun HandleTriggerGpsAction(context: Context, viewModel: UiTronViewModel) {
|
||||
var action by remember { mutableStateOf<TriggerGpsCheckAction?>(null) }
|
||||
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
|
||||
|
||||
val launcher =
|
||||
rememberLauncherForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) {
|
||||
result ->
|
||||
if (result.resultCode == Activity.RESULT_OK) {
|
||||
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
|
||||
action?.onSuccess?.let { viewModel.handleActions(it) }
|
||||
} else {
|
||||
action?.onFailure?.let { viewModel.handleActions(it) }
|
||||
}
|
||||
} else {
|
||||
action?.onDismiss?.let { viewModel.handleActions(it) }
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
viewModel.getActionCallback().collect { uiTronAction ->
|
||||
if (uiTronAction is TriggerGpsCheckAction) {
|
||||
action = uiTronAction
|
||||
val isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
|
||||
|
||||
if (isGpsEnabled) {
|
||||
uiTronAction.onSuccess?.let { viewModel.handleActions(it) }
|
||||
return@collect
|
||||
}
|
||||
|
||||
val locationRequest =
|
||||
LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000L)
|
||||
.setMinUpdateIntervalMillis(5000L)
|
||||
.build()
|
||||
|
||||
val builder =
|
||||
LocationSettingsRequest.Builder()
|
||||
.addLocationRequest(locationRequest)
|
||||
.setAlwaysShow(true)
|
||||
|
||||
val client = LocationServices.getSettingsClient(context)
|
||||
val task = client.checkLocationSettings(builder.build())
|
||||
|
||||
task.addOnSuccessListener {
|
||||
uiTronAction.onSuccess?.let { viewModel.handleActions(it) }
|
||||
}
|
||||
|
||||
task.addOnFailureListener { exception ->
|
||||
if (exception is ResolvableApiException) {
|
||||
try {
|
||||
val intentSenderRequest =
|
||||
IntentSenderRequest.Builder(exception.resolution).build()
|
||||
launcher.launch(intentSenderRequest)
|
||||
} catch (e: Exception) {
|
||||
uiTronAction.onFailure?.let { viewModel.handleActions(it) }
|
||||
}
|
||||
} else {
|
||||
uiTronAction.onFailure?.let { viewModel.handleActions(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2025 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.common.uitron.model.action
|
||||
|
||||
import com.navi.uitron.model.data.ActionDetails
|
||||
import com.navi.uitron.model.data.UiTronAction
|
||||
import com.navi.uitron.model.data.UiTronActionData
|
||||
|
||||
data class TriggerGpsCheckAction(
|
||||
val onSuccess: UiTronActionData? = null,
|
||||
val onFailure: UiTronActionData? = null,
|
||||
val onDismiss: UiTronActionData? = null,
|
||||
) : UiTronAction() {
|
||||
|
||||
override suspend fun manageAction(actionDetails: ActionDetails) {
|
||||
val action = actionDetails.uiTronAction as? TriggerGpsCheckAction
|
||||
actionDetails.actionCallbackFlow?.emit(action)
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import com.navi.common.uitron.model.action.PostLocationAction
|
||||
import com.navi.common.uitron.model.action.PostPermissionAction
|
||||
import com.navi.common.uitron.model.action.SystemUiAction
|
||||
import com.navi.common.uitron.model.action.ThirdPartySdkAction
|
||||
import com.navi.common.uitron.model.action.TriggerGpsCheckAction
|
||||
import com.navi.common.uitron.model.action.UpdateStateHandleActionV2
|
||||
import com.navi.common.uitron.model.action.UpdateViewStateActionV2
|
||||
import com.navi.common.uitron.model.action.UpdateWidgetsStateAction
|
||||
@@ -92,6 +93,8 @@ open class UiTronActionSerializer : BaseUiTronActionSerializer() {
|
||||
context?.serialize(src as PaymentStatusAction, PaymentStatusAction::class.java)
|
||||
ApActionType.PostPermissionAction.name ->
|
||||
context?.serialize(src as PostPermissionAction, PostPermissionAction::class.java)
|
||||
UiTronActionType.TriggerGpsCheckAction.name ->
|
||||
context?.serialize(src as TriggerGpsCheckAction, TriggerGpsCheckAction::class.java)
|
||||
else -> super.serialize(src, typeOfSrc, context)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user