TP-65017 | Location permission on biller list screen (#10906)

Co-authored-by: Shaurya Rehan <shaurya.rehan@navi.com>
This commit is contained in:
Mehul Garg
2024-05-20 17:12:10 +05:30
committed by GitHub
parent 00673a56b6
commit 6e4b5aca6e
8 changed files with 161 additions and 5 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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