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:
@@ -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
|
||||
|
||||
@@ -20,6 +20,8 @@ sealed class DashboardScreenUiEffect : UiEffect {
|
||||
|
||||
data object Help : Navigation()
|
||||
|
||||
data object OpenSettings : Navigation()
|
||||
|
||||
data object FetchFinarkeinData : Navigation()
|
||||
|
||||
data object DismissFinarkeinBottomSheet : Navigation()
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 -> {
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
<string name="taking_longer_than_usual">It’s 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. We’ll 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, you’ll be able to add more banks.</string>
|
||||
<string name="less_than_one_percent">< 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>
|
||||
|
||||
Reference in New Issue
Block a user