diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/common/NaviBbpsAnalytics.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/common/NaviBbpsAnalytics.kt index 7f9d10d6f9..aa6138920a 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/common/NaviBbpsAnalytics.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/common/NaviBbpsAnalytics.kt @@ -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, diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/BillerListViewModel.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/BillerListViewModel.kt index cd770b9a73..d059170655 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/BillerListViewModel.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/BillerListViewModel.kt @@ -103,6 +103,9 @@ constructor( private val _navigateToNextScreen = MutableSharedFlow() 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 } } diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/ui/BillerListScreen.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/ui/BillerListScreen.kt index 74984fb581..caea628974 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/ui/BillerListScreen.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/billerlist/ui/BillerListScreen.kt @@ -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, 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( diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/contactlist/ui/ContactListScreen.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/contactlist/ui/ContactListScreen.kt index 55cd197ec3..2c354045e3 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/contactlist/ui/ContactListScreen.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/contactlist/ui/ContactListScreen.kt @@ -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 diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/ui/PermissionScreen.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/ui/PermissionScreen.kt index 78ff34585b..e49fd2ba31 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/ui/PermissionScreen.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/ui/PermissionScreen.kt @@ -77,7 +77,7 @@ fun NaviBbpsPermissionScreen( naviBbpsActivity: Activity, resultNavigator: ResultBackNavigator, 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, diff --git a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/utils/PermissionUtils.kt b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/utils/PermissionUtils.kt index 28c4f9a07d..73b174fb03 100644 --- a/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/utils/PermissionUtils.kt +++ b/android/navi-bbps/src/main/kotlin/com/navi/bbps/feature/permission/utils/PermissionUtils.kt @@ -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 { val permissionDataList: List = @@ -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) + ) + ) } diff --git a/android/navi-bbps/src/main/res/drawable/ic_bbps_location_permission.xml b/android/navi-bbps/src/main/res/drawable/ic_bbps_location_permission.xml new file mode 100644 index 0000000000..49cbc3b981 --- /dev/null +++ b/android/navi-bbps/src/main/res/drawable/ic_bbps_location_permission.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/android/navi-bbps/src/main/res/values/strings.xml b/android/navi-bbps/src/main/res/values/strings.xml index 7d1fec7530..a30e21cef9 100644 --- a/android/navi-bbps/src/main/res/values/strings.xml +++ b/android/navi-bbps/src/main/res/values/strings.xml @@ -103,9 +103,10 @@ Allow Go to settings Phone settings > Apps > Navi > Permissions - Allow contact permission + Allow contact permission + Allow location permission To allow recharge for your contacts. - To fetch your location. + To fetch billers from your state. NA View transaction details Hide transaction details