TP-65017 | Location permission on biller list screen (#10906)
Co-authored-by: Shaurya Rehan <shaurya.rehan@navi.com>
This commit is contained in:
@@ -82,6 +82,13 @@ class NaviBbpsAnalytics private constructor() {
|
||||
)
|
||||
}
|
||||
|
||||
fun onLocationPermissionAction(naviPermissionResult: NaviPermissionResult) {
|
||||
NaviTrackEvent.trackEventOnClickStream(
|
||||
eventName = "NaviBBPS_BillerList_PermissionResult",
|
||||
eventValues = mapOf("naviPermissionResult" to naviPermissionResult.toString())
|
||||
)
|
||||
}
|
||||
|
||||
fun onBillerItemClicked(
|
||||
billCategoryEntity: BillCategoryEntity,
|
||||
billerEntity: BillerItemEntity,
|
||||
|
||||
@@ -103,6 +103,9 @@ constructor(
|
||||
private val _navigateToNextScreen = MutableSharedFlow<Direction>()
|
||||
val navigateToNextScreen = _navigateToNextScreen.asSharedFlow()
|
||||
|
||||
private val _showPopUpPermission = MutableStateFlow(false)
|
||||
val showPopUpPermission = _showPopUpPermission.asStateFlow()
|
||||
|
||||
private val _isPayBillShimmerVisible = MutableStateFlow(false)
|
||||
val isPayBillShimmerVisible = _isPayBillShimmerVisible.asStateFlow()
|
||||
|
||||
@@ -176,6 +179,12 @@ constructor(
|
||||
initSearchFlow()
|
||||
}
|
||||
|
||||
var isPermissionPopupSeenOnLanded = false
|
||||
|
||||
fun onPermissionPopupSeenOnLanded() {
|
||||
isPermissionPopupSeenOnLanded = true
|
||||
}
|
||||
|
||||
private fun replaceIfPresent(billerListStateHeading: String?, stateValue: String): String {
|
||||
if (billerListStateHeading.isNullOrEmpty())
|
||||
return resourceProvider
|
||||
@@ -204,6 +213,10 @@ constructor(
|
||||
_isDeleteBillInProgress.update { isInProgress }
|
||||
}
|
||||
|
||||
fun updateShowPopUpPermission(showPopUpPermission: Boolean) {
|
||||
_showPopUpPermission.update { showPopUpPermission }
|
||||
}
|
||||
|
||||
fun updateSnackBarState(showSnackBar: Boolean) {
|
||||
_showSnackBar.update { showSnackBar }
|
||||
}
|
||||
|
||||
@@ -37,9 +37,13 @@ import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
||||
import com.navi.bbps.R
|
||||
import com.navi.bbps.common.CATEGORY_ID_MOBILE_POSTPAID
|
||||
import com.navi.bbps.common.NaviBbpsAnalytics
|
||||
import com.navi.bbps.common.model.view.NaviPermissionResult
|
||||
import com.navi.bbps.common.model.view.PermissionResult
|
||||
import com.navi.bbps.common.model.view.rememberMultiplePermissions
|
||||
import com.navi.bbps.common.theme.NaviBbpsColor
|
||||
import com.navi.bbps.common.ui.InputTextFieldWithDescriptionHeader
|
||||
import com.navi.bbps.common.ui.NaviBbpsHeader
|
||||
@@ -55,7 +59,11 @@ import com.navi.bbps.feature.billerlist.model.view.BillerListState
|
||||
import com.navi.bbps.feature.category.model.view.BillCategoryEntity
|
||||
import com.navi.bbps.feature.contactlist.model.view.PhoneContactEntity
|
||||
import com.navi.bbps.feature.destinations.CustomerDataInputScreenDestination
|
||||
import com.navi.bbps.feature.destinations.NaviBbpsPermissionScreenDestination
|
||||
import com.navi.bbps.feature.mybills.model.view.MyBillEntity
|
||||
import com.navi.bbps.feature.permission.model.view.PermissionState
|
||||
import com.navi.bbps.feature.permission.utils.PermissionKeys
|
||||
import com.navi.bbps.feature.permission.utils.PermissionUtils
|
||||
import com.navi.bbps.initials
|
||||
import com.navi.design.font.FontWeightEnum
|
||||
import com.navi.design.snackbar.SuccessSnackBar
|
||||
@@ -64,11 +72,13 @@ import com.navi.design.theme.ttComposeFontFamily
|
||||
import com.navi.naviwidgets.extensions.NaviText
|
||||
import com.ramcosta.composedestinations.annotation.Destination
|
||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||
import com.ramcosta.composedestinations.result.NavResult
|
||||
import com.ramcosta.composedestinations.result.ResultRecipient
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@OptIn(ExperimentalMaterialApi::class)
|
||||
@OptIn(ExperimentalMaterialApi::class, ExperimentalPermissionsApi::class)
|
||||
@Destination
|
||||
@Composable
|
||||
fun BillerListScreen(
|
||||
@@ -78,6 +88,7 @@ fun BillerListScreen(
|
||||
billCategoryEntity: BillCategoryEntity,
|
||||
phoneNumberDetail: PhoneContactEntity? = null,
|
||||
isRootScreen: Boolean = false,
|
||||
resultRecipient: ResultRecipient<NaviBbpsPermissionScreenDestination, PermissionResult>,
|
||||
naviBbpsAnalytics: NaviBbpsAnalytics.BillerList = NaviBbpsAnalytics.INSTANCE.BillerList()
|
||||
) {
|
||||
LaunchedEffect(Unit) { naviBbpsAnalytics.onLanded(billCategoryEntity = billCategoryEntity) }
|
||||
@@ -101,6 +112,7 @@ fun BillerListScreen(
|
||||
val showSnackBar by billerListViewModel.showSnackBar.collectAsStateWithLifecycle()
|
||||
val isDeleteBillInProgress by
|
||||
billerListViewModel.isDeleteBillInProgress.collectAsStateWithLifecycle()
|
||||
val showPopUpPermission by billerListViewModel.showPopUpPermission.collectAsStateWithLifecycle()
|
||||
val bbpsSnackBarPredefinedConfig = remember { BbpsSnackBarPredefinedConfig() }
|
||||
|
||||
val bottomSheetState =
|
||||
@@ -201,6 +213,68 @@ fun BillerListScreen(
|
||||
|
||||
BackHandler { onBackClick() }
|
||||
|
||||
val fetchLocationPermissionState =
|
||||
rememberMultiplePermissions(
|
||||
permissions =
|
||||
PermissionUtils.getPermissionListFromPermissionKey(
|
||||
permissionKey = PermissionKeys.BBPS_LOCATION_PERMISSION_KEY
|
||||
)
|
||||
) {
|
||||
when (it) {
|
||||
NaviPermissionResult.AllGranted -> {
|
||||
naviBbpsAnalytics.onLocationPermissionAction(it)
|
||||
}
|
||||
NaviPermissionResult.HardDenied -> {
|
||||
naviBbpsAnalytics.onLocationPermissionAction(it)
|
||||
navigator.navigate(
|
||||
NaviBbpsPermissionScreenDestination(
|
||||
titleText = R.string.bbps_allow_location_permission,
|
||||
permissionKey = PermissionKeys.BBPS_LOCATION_PERMISSION_KEY,
|
||||
ctaText = R.string.bbps_go_to_settings,
|
||||
permissionState = PermissionState.HARD_DENIED
|
||||
)
|
||||
)
|
||||
}
|
||||
NaviPermissionResult.ShowRationale -> {
|
||||
naviBbpsAnalytics.onLocationPermissionAction(it)
|
||||
if (showPopUpPermission) {
|
||||
keyboardController?.customHide(context = context, view = view)
|
||||
navigator.navigate(
|
||||
NaviBbpsPermissionScreenDestination(
|
||||
titleText = R.string.bbps_allow_location_permission,
|
||||
permissionKey = PermissionKeys.BBPS_LOCATION_PERMISSION_KEY,
|
||||
ctaText = R.string.bbps_allow,
|
||||
permissionState = PermissionState.SHOW_RATIONALE
|
||||
)
|
||||
)
|
||||
} else {
|
||||
billerListViewModel.updateShowPopUpPermission(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resultRecipient.onNavResult { result ->
|
||||
when (result) {
|
||||
is NavResult.Canceled -> {}
|
||||
is NavResult.Value -> {
|
||||
if (
|
||||
result.value.permissionKey == PermissionKeys.BBPS_LOCATION_PERMISSION_KEY &&
|
||||
result.value.permissionRevoked
|
||||
) {
|
||||
fetchLocationPermissionState.launchMultiplePermissionRequest()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!fetchLocationPermissionState.allPermissionsGranted) {
|
||||
billerListViewModel.onPermissionPopupSeenOnLanded()
|
||||
if (showPopUpPermission) {
|
||||
LaunchedEffect(Unit) { fetchLocationPermissionState.launchMultiplePermissionRequest() }
|
||||
}
|
||||
}
|
||||
|
||||
NaviBbpsModalBottomSheetLayout(
|
||||
sheetContent = {
|
||||
BillerListBottomSheetContent(
|
||||
|
||||
@@ -164,6 +164,7 @@ fun ContactListScreen(
|
||||
keyboardController?.customHide(context = context, view = view)
|
||||
navigator.navigate(
|
||||
NaviBbpsPermissionScreenDestination(
|
||||
titleText = R.string.bbps_allow_contact_permission,
|
||||
permissionKey = PermissionKeys.BBPS_CONTACT_PERMISSION_KEY,
|
||||
ctaText = R.string.bbps_go_to_settings,
|
||||
permissionState = PermissionState.HARD_DENIED
|
||||
@@ -179,6 +180,7 @@ fun ContactListScreen(
|
||||
keyboardController?.customHide(context = context, view = view)
|
||||
navigator.navigate(
|
||||
NaviBbpsPermissionScreenDestination(
|
||||
titleText = R.string.bbps_allow_contact_permission,
|
||||
permissionKey = PermissionKeys.BBPS_CONTACT_PERMISSION_KEY,
|
||||
ctaText = R.string.bbps_allow,
|
||||
permissionState = PermissionState.SHOW_RATIONALE
|
||||
|
||||
@@ -77,7 +77,7 @@ fun NaviBbpsPermissionScreen(
|
||||
naviBbpsActivity: Activity,
|
||||
resultNavigator: ResultBackNavigator<PermissionResult>,
|
||||
permissionKey: String,
|
||||
titleText: Int = R.string.bbps_allow_app_permission, // TODO: Change this to a correct value
|
||||
titleText: Int,
|
||||
subTitleText: Int? = null,
|
||||
ctaText: Int = R.string.bbps_allow,
|
||||
showPermissionDeniedView: Boolean = true,
|
||||
|
||||
@@ -11,10 +11,16 @@ import android.Manifest
|
||||
import com.navi.bbps.R
|
||||
import com.navi.bbps.feature.permission.model.view.PermissionData
|
||||
import com.navi.bbps.feature.permission.utils.PermissionKeyData.BBPS_CONTACT_PERMISSION_DATA
|
||||
import com.navi.bbps.feature.permission.utils.PermissionKeyData.BBPS_LOCATION_PERMISSION_DATA
|
||||
import com.navi.bbps.feature.permission.utils.PermissionKeys.BBPS_CONTACT_PERMISSION_KEY
|
||||
import com.navi.bbps.feature.permission.utils.PermissionKeys.BBPS_LOCATION_PERMISSION_KEY
|
||||
|
||||
object PermissionUtils {
|
||||
val permissionDataMap = mapOf(Pair(BBPS_CONTACT_PERMISSION_KEY, BBPS_CONTACT_PERMISSION_DATA))
|
||||
val permissionDataMap =
|
||||
mapOf(
|
||||
Pair(BBPS_CONTACT_PERMISSION_KEY, BBPS_CONTACT_PERMISSION_DATA),
|
||||
Pair(BBPS_LOCATION_PERMISSION_KEY, BBPS_LOCATION_PERMISSION_DATA)
|
||||
)
|
||||
|
||||
fun getPermissionListFromPermissionKey(permissionKey: String): List<String> {
|
||||
val permissionDataList: List<PermissionData> =
|
||||
@@ -27,6 +33,7 @@ object PermissionUtils {
|
||||
|
||||
object PermissionKeys {
|
||||
const val BBPS_CONTACT_PERMISSION_KEY = "contact_permission"
|
||||
const val BBPS_LOCATION_PERMISSION_KEY = "location_permission"
|
||||
}
|
||||
|
||||
object PermissionKeyData {
|
||||
@@ -39,4 +46,14 @@ object PermissionKeyData {
|
||||
qualifierList = listOf(Manifest.permission.READ_CONTACTS)
|
||||
)
|
||||
)
|
||||
|
||||
val BBPS_LOCATION_PERMISSION_DATA =
|
||||
listOf(
|
||||
PermissionData(
|
||||
iconId = R.drawable.ic_bbps_location_permission,
|
||||
titleId = R.string.bbps_location,
|
||||
descriptionId = R.string.bbps_location_state_permission_description,
|
||||
qualifierList = listOf(Manifest.permission.ACCESS_FINE_LOCATION)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M12,21C16.971,21 21,20.299 21,19.434C21,18.57 16.971,17.869 12,17.869C7.029,17.869 3,18.57 3,19.434C3,20.299 7.029,21 12,21Z"
|
||||
android:fillColor="#AFECCD"/>
|
||||
<path
|
||||
android:pathData="M11.998,3C13.42,3 14.785,3.566 15.791,4.572C16.797,5.578 17.362,6.943 17.362,8.366C17.362,10.882 13.495,17.119 12.327,18.944C12.292,18.999 12.243,19.045 12.185,19.076C12.128,19.108 12.063,19.124 11.998,19.124C11.932,19.124 11.867,19.108 11.81,19.076C11.752,19.045 11.703,18.999 11.668,18.944C10.5,17.119 6.633,10.883 6.633,8.366C6.633,7.661 6.771,6.963 7.041,6.312C7.311,5.661 7.706,5.07 8.204,4.572C8.702,4.073 9.293,3.678 9.944,3.408C10.595,3.139 11.293,3 11.998,3Z"
|
||||
android:fillColor="#AFECCD"/>
|
||||
<path
|
||||
android:pathData="M11.998,19.122C11.932,19.122 11.867,19.105 11.81,19.073C11.752,19.042 11.703,18.996 11.668,18.941C10.5,17.116 6.633,10.88 6.633,8.362C6.633,6.94 7.199,5.576 8.205,4.57C9.211,3.565 10.575,3 11.998,3V19.122Z"
|
||||
android:fillColor="#E4FFEE"/>
|
||||
<path
|
||||
android:pathData="M12.001,10.826C13.514,10.826 14.74,9.6 14.74,8.087C14.74,6.574 13.514,5.348 12.001,5.348C10.488,5.348 9.262,6.574 9.262,8.087C9.262,9.6 10.488,10.826 12.001,10.826Z"
|
||||
android:fillColor="#E4FFEE"/>
|
||||
<path
|
||||
android:pathData="M12.001,10.826C11.274,10.826 10.578,10.537 10.064,10.024C9.55,9.51 9.262,8.813 9.262,8.087C9.262,7.36 9.55,6.664 10.064,6.15C10.578,5.636 11.274,5.348 12.001,5.348V10.826Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
<path
|
||||
android:pathData="M12.001,10.826C13.514,10.826 14.74,9.6 14.74,8.087C14.74,6.574 13.514,5.348 12.001,5.348C10.488,5.348 9.262,6.574 9.262,8.087C9.262,9.6 10.488,10.826 12.001,10.826Z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="0.6"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#00303E"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M11.998,3C13.42,3 14.785,3.566 15.791,4.572C16.797,5.578 17.362,6.943 17.362,8.366C17.362,10.882 13.495,17.119 12.327,18.944C12.292,18.999 12.243,19.045 12.185,19.076C12.128,19.108 12.063,19.124 11.998,19.124C11.932,19.124 11.867,19.108 11.81,19.076C11.752,19.045 11.703,18.999 11.668,18.944C10.5,17.119 6.633,10.883 6.633,8.366C6.633,7.661 6.771,6.963 7.041,6.312C7.311,5.661 7.706,5.07 8.204,4.572C8.702,4.073 9.293,3.678 9.944,3.408C10.595,3.139 11.293,3 11.998,3V3Z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="0.6"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#00303E"
|
||||
android:strokeLineCap="round"/>
|
||||
<path
|
||||
android:pathData="M15.913,18.025C18.924,18.279 21,18.815 21,19.434C21,20.299 16.971,20.999 12,20.999C7.029,20.999 3,20.299 3,19.434C3,18.816 5.062,18.281 8.054,18.025"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="0.6"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#00303E"
|
||||
android:strokeLineCap="round"/>
|
||||
</vector>
|
||||
@@ -103,9 +103,10 @@
|
||||
<string name="bbps_allow">Allow</string>
|
||||
<string name="bbps_go_to_settings">Go to settings</string>
|
||||
<string name="bbps_permission_settings_path">Phone settings > Apps > Navi > Permissions</string>
|
||||
<string name="bbps_allow_app_permission">Allow contact permission</string>
|
||||
<string name="bbps_allow_contact_permission">Allow contact permission</string>
|
||||
<string name="bbps_allow_location_permission">Allow location permission</string>
|
||||
<string name="bbps_contact_state_permission_description">To allow recharge for your contacts.</string>
|
||||
<string name="bbps_location_state_permission_description">To fetch your location.</string>
|
||||
<string name="bbps_location_state_permission_description">To fetch billers from your state.</string>
|
||||
<string name="bbps_not_available">NA</string>
|
||||
<string name="bbps_view_transaction_details">View transaction details</string>
|
||||
<string name="bbps_hide_transaction_details">Hide transaction details</string>
|
||||
|
||||
Reference in New Issue
Block a user