NTP-20910 | PN permission to be asked if user clicks on notify me and hasn't given PN permissions (#14280)

This commit is contained in:
Aparna Vadlamani
2024-12-20 19:28:14 +05:30
committed by GitHub
parent c2ed56fd3f
commit 6c0862178d
5 changed files with 93 additions and 11 deletions

View File

@@ -9,7 +9,9 @@ package com.navi.moneymanager.entry.ui.activity
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
@@ -127,6 +129,14 @@ class MMActivity : MMBaseActivity(), Auth {
return mmSharedVM
}
fun openAppSettings() {
Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null)
)
.also(::startActivity)
}
override suspend fun token() = finarkeinAccessToken
override val screenName: String

View File

@@ -20,6 +20,8 @@ sealed class DashboardScreenUiEffect : UiEffect {
data object Help : Navigation()
data object OpenSettings : Navigation()
data object FetchFinarkeinData : Navigation()
data object DismissFinarkeinBottomSheet : Navigation()

View File

@@ -7,6 +7,7 @@
package com.navi.moneymanager.postonboard.dashboard.ui
import android.os.Build
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.core.animateFloatAsState
@@ -22,6 +23,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.ProgressIndicatorDefaults
import androidx.compose.runtime.Composable
@@ -34,10 +36,13 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow.Companion.Ellipsis
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.MultiplePermissionsState
import com.navi.base.utils.EMPTY
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.utils.onClickWithDebounce
@@ -59,11 +64,13 @@ import com.navi.moneymanager.postonboard.dashboard.model.DashboardScreenUiEvent
import com.navi.moneymanager.postonboard.dashboard.model.OnboardingStatus
import kotlinx.coroutines.delay
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun DashboardOnboardingBottomSheetContent(
onBoardingBottomSheetType: OnboardingStatus,
onEvent: (DashboardScreenUiEvent) -> Unit,
onEffect: (DashboardScreenUiEffect) -> Unit
onEffect: (DashboardScreenUiEffect) -> Unit,
pushNotificationPermission: MultiplePermissionsState
) {
var currentProgress by remember { mutableFloatStateOf(0f) }
var progressIndicatorVisibility by remember { mutableStateOf(true) }
@@ -100,7 +107,10 @@ fun DashboardOnboardingBottomSheetContent(
DashboardLoadingBottomSheetContent()
}
is OnboardingStatus.TakingLonger -> {
DashboardTakingLongerBottomSheetContent(onEffect = onEffect)
DashboardTakingLongerBottomSheetContent(
onEffect = onEffect,
pushNotificationPermission = pushNotificationPermission
)
}
is OnboardingStatus.Success -> {
DashboardSuccessBottomSheetContent()
@@ -173,9 +183,12 @@ fun DashboardLoadingBottomSheetContent() {
}
}
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun DashboardTakingLongerBottomSheetContent(onEffect: (DashboardScreenUiEffect) -> Unit) {
fun DashboardTakingLongerBottomSheetContent(
onEffect: (DashboardScreenUiEffect) -> Unit,
pushNotificationPermission: MultiplePermissionsState
) {
LaunchedEffect(Unit) {
DashboardEventTrackerImpl.onDashboardOnboardingTakingLongBottomSheetAppeared()
}
@@ -221,15 +234,42 @@ fun DashboardTakingLongerBottomSheetContent(onEffect: (DashboardScreenUiEffect)
lineHeight = 22.sp
)
Spacer(modifier = Modifier.height(24.dp))
if (
pushNotificationPermission.allPermissionsGranted.not() &&
pushNotificationPermission.shouldShowRationale.not()
) {
MMText(
text = stringResource(R.string.notification_permission_settings_text),
color = MMColor.textPrimary,
fontSize = 14.sp,
fontWeight = FontWeightEnum.NAVI_HEADLINE_REGULAR,
lineHeight = 22.sp
)
Spacer(modifier = Modifier.height(24.dp))
}
Box(
modifier =
Modifier.fillMaxWidth().background(MMColor.ctaSecondary).onClickWithDebounce {
onEffect(DashboardScreenUiEffect.Navigation.Back)
},
Modifier.fillMaxWidth()
.clip(RoundedCornerShape(4.dp))
.background(MMColor.ctaSecondary)
.onClickWithDebounce {
if (pushNotificationPermission.allPermissionsGranted.not()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
pushNotificationPermission.launchMultiplePermissionRequest()
} else {
onEffect(DashboardScreenUiEffect.Navigation.OpenSettings)
}
} else {
onEffect(DashboardScreenUiEffect.Navigation.Back)
}
},
contentAlignment = Alignment.Center
) {
MMText(
text = stringResource(R.string.mm_notify_me),
text =
if (pushNotificationPermission.allPermissionsGranted)
stringResource(R.string.mm_notify_me)
else stringResource(R.string.mm_turn_on_notification),
modifier = Modifier.padding(vertical = 16.dp, horizontal = 16.dp),
color = MMColor.ctaPrimary,
fontSize = 14.sp,

View File

@@ -7,6 +7,7 @@
package com.navi.moneymanager.postonboard.dashboard.ui
import android.Manifest
import android.os.Bundle
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
@@ -19,12 +20,16 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.MultiplePermissionsState
import com.navi.base.model.CtaData
import com.navi.base.model.LineItem
import com.navi.base.utils.orZero
import com.navi.common.constants.MONTH
import com.navi.common.constants.YEAR
import com.navi.common.navigation.NavigationAction
import com.navi.common.permission.PermissionResult
import com.navi.common.permission.rememberMultiplePermissions
import com.navi.common.utils.Constants.WEB_URL
import com.navi.moneymanager.common.analytics.DashboardEventTrackerImpl
import com.navi.moneymanager.common.dataprovider.data.datastore.DataStoreInfoProvider
@@ -66,6 +71,7 @@ import com.ramcosta.composedestinations.annotation.Destination
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onEach
@OptIn(ExperimentalPermissionsApi::class)
@Destination
@Composable
fun DashboardScreen(
@@ -73,6 +79,21 @@ fun DashboardScreen(
bundle: Bundle? = null,
viewModel: DashboardViewModel = hiltViewModel()
) {
val pushNotificationPermission =
rememberMultiplePermissions(permissions = listOf(Manifest.permission.POST_NOTIFICATIONS)) {
when (it) {
PermissionResult.AllGranted -> {
viewModel.setEffect { DashboardScreenUiEffect.Navigation.Back }
}
PermissionResult.HardDenied -> {
viewModel.setEffect { DashboardScreenUiEffect.Navigation.OpenSettings }
}
PermissionResult.ShowRationale -> {
viewModel.setEffect { DashboardScreenUiEffect.Navigation.Back }
}
PermissionResult.None -> {}
}
}
val state by viewModel.state.collectAsStateWithLifecycle()
val sharedVM = activity.getSharedVM()
@@ -109,6 +130,9 @@ fun DashboardScreen(
)
)
}
DashboardScreenUiEffect.Navigation.OpenSettings -> {
activity.openAppSettings()
}
DashboardScreenUiEffect.Navigation.FetchFinarkeinData -> {
viewModel.fetchFinarkeinData {
when (it) {
@@ -224,7 +248,8 @@ fun DashboardScreen(
onEffect = { viewModel.setEffect { it } },
onMonthSelected = { month ->
viewModel.updateSpendCategorizationSectionData(month.first, month.second)
}
},
pushNotificationPermission = pushNotificationPermission
)
}
@@ -262,13 +287,15 @@ fun DashboardScreen(
}
}
@OptIn(ExperimentalPermissionsApi::class)
@Composable
private fun DashboardBottomSheetContentHandler(
bottomSheet: DashboardScreenBottomSheets,
dataStoreInfoProvider: DataStoreInfoProvider,
onEvent: (DashboardScreenUiEvent) -> Unit,
onEffect: (DashboardScreenUiEffect) -> Unit,
onMonthSelected: (Pair<String, Int>) -> Unit = {}
onMonthSelected: (Pair<String, Int>) -> Unit = {},
pushNotificationPermission: MultiplePermissionsState
) {
if (bottomSheet.sheetData == null) return
val onDismissAction = bottomSheet.createDismissAction(onEvent)
@@ -299,7 +326,8 @@ private fun DashboardBottomSheetContentHandler(
DashboardOnboardingBottomSheetContent(
onBoardingBottomSheetType = bottomSheet.state,
onEvent = onEvent,
onEffect = onEffect
onEffect = onEffect,
pushNotificationPermission = pushNotificationPermission
)
}
is DashboardScreenBottomSheets.PastMonthDataLoading -> {

View File

@@ -50,6 +50,7 @@
<string name="taking_longer_than_usual">Its taking longer than usual</string>
<string name="bank_taking_longer">The bank is taking longer than expected to share the data.\n\nYou can either wait or come later. Well notify you whenever your data gets fetched.</string>
<string name="mm_notify_me">Notify me</string>
<string name="mm_turn_on_notification">Turn on notification</string>
<string name="done">Done</string>
<string name="do_not_press_back">Please do not press back or close the app. This usually takes a few minutes.</string>
<string name="connecting_with_your_banks">Connecting with your banks</string>
@@ -122,5 +123,6 @@
<string name="add_account_loading_bottomsheet_description">Please wait a moment while we finish syncing your current bank accounts. This usually takes a few minutes. Once done, youll be able to add more banks.</string>
<string name="less_than_one_percent">&lt; 1%</string>
<string name="choose_a_category">Choose a category</string>
<string name="notification_permission_settings_text">Phone settings > Apps > Navi > Permissions > Notifications</string>
</resources>