From af470adfb3c0c77d65a714f06784f89ace026822 Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Thu, 6 Apr 2023 23:50:12 +0300 Subject: [PATCH] Improve notifications permission flow on blogging reminders --- .../BloggingReminderBottomSheetFragment.kt | 7 ++- .../BloggingRemindersViewModel.kt | 48 +++++++++++-------- .../NotificationsPermissionBuilder.kt | 11 +++-- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingReminderBottomSheetFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingReminderBottomSheetFragment.kt index 91eef8eaaff2..7356d5aff0d3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingReminderBottomSheetFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingReminderBottomSheetFragment.kt @@ -126,7 +126,12 @@ class BloggingReminderBottomSheetFragment : BottomSheetDialogFragment() { if (granted) { viewModel.onPermissionGranted() } else { - viewModel.onPermissionDenied() + val isAlwaysDenied = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + WPPermissionUtils.isPermissionAlwaysDenied( + requireActivity(), + Manifest.permission.POST_NOTIFICATIONS + ) + viewModel.onPermissionDenied(isAlwaysDenied) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt index 96ce4d3d0052..3378085a404e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/BloggingRemindersViewModel.kt @@ -65,8 +65,8 @@ class BloggingRemindersViewModel @Inject constructor( private val _bloggingRemindersModel = MutableLiveData() private val _isFirstTimeFlow = MutableLiveData() - private val _hasNotificationsPermission = MutableLiveData() - private val _notificationsPermissionAlwaysDenied = MutableLiveData() + private var hasNotificationsPermissionState = false + private var notificationsPermissionAlwaysDeniedState = false val uiState: LiveData = merge( selectedScreen, @@ -85,7 +85,10 @@ class BloggingRemindersViewModel @Inject constructor( this::showBloggingPromptDialog ) Screen.NOTIFICATIONS_PERMISSION -> { - notificationsPermissionBuilder.buildUiItems(resourceProvider.getString(R.string.app_name)) + notificationsPermissionBuilder.buildUiItems( + appName = resourceProvider.getString(R.string.app_name), + showAppSettingsGuide = notificationsPermissionAlwaysDeniedState + ) } Screen.EPILOGUE -> epilogueBuilder.buildUiItems(bloggingRemindersModel) } @@ -99,7 +102,9 @@ class BloggingRemindersViewModel @Inject constructor( isFirstTimeFlow == true, this::onSelectionButtonClick ) - Screen.NOTIFICATIONS_PERMISSION -> notificationsPermissionBuilder.buildPrimaryButton(showAppSettings) + Screen.NOTIFICATIONS_PERMISSION -> { + notificationsPermissionBuilder.buildPrimaryButton(onPermissionButtonTapped) + } Screen.EPILOGUE -> epilogueBuilder.buildPrimaryButton(finish) } UiState(uiItems, primaryButton) @@ -119,8 +124,12 @@ class BloggingRemindersViewModel @Inject constructor( _isBottomSheetShowing.value = Event(false) } - private val showAppSettings: () -> Unit = { - _showDevicePermissionSettings.value = Event(true) + private val onPermissionButtonTapped: () -> Unit = { + if (notificationsPermissionAlwaysDeniedState) { + _showDevicePermissionSettings.value = Event(true) + } else { + _requestPermission.value = Event(true) + } } private fun onScreenChanged(screen: Screen) { @@ -155,7 +164,7 @@ class BloggingRemindersViewModel @Inject constructor( } } - fun selectDay(day: DayOfWeek) { + private fun selectDay(day: DayOfWeek) { val currentState = _bloggingRemindersModel.value!! val enabledDays = currentState.enabledDays.toMutableSet() if (enabledDays.contains(day)) { @@ -167,11 +176,11 @@ class BloggingRemindersViewModel @Inject constructor( } fun setPermissionState(hasNotificationsPermission: Boolean, notificationsPermissionAlwaysDenied: Boolean) { - _hasNotificationsPermission.value = hasNotificationsPermission - _notificationsPermissionAlwaysDenied.value = notificationsPermissionAlwaysDenied + hasNotificationsPermissionState = hasNotificationsPermission + notificationsPermissionAlwaysDeniedState = notificationsPermissionAlwaysDenied } - fun selectTime() { + private fun selectTime() { _isTimePickerShowing.value = Event(true) } @@ -233,14 +242,12 @@ class BloggingRemindersViewModel @Inject constructor( } private fun checkPermission(): Boolean { - val hasPermission = _hasNotificationsPermission.value == true - val alwaysDenied = _notificationsPermissionAlwaysDenied.value == true return when { - !hasPermission && alwaysDenied -> { + !hasNotificationsPermissionState && notificationsPermissionAlwaysDeniedState -> { _selectedScreen.value = Screen.NOTIFICATIONS_PERMISSION false } - !hasPermission -> { + !hasNotificationsPermissionState -> { _requestPermission.value = Event(true) false } @@ -327,18 +334,21 @@ class BloggingRemindersViewModel @Inject constructor( } fun onPermissionGranted() { - if (_hasNotificationsPermission.value == false) { + if (!hasNotificationsPermissionState) { // Permission state is changed. - _hasNotificationsPermission.value = true - _notificationsPermissionAlwaysDenied.value = false + hasNotificationsPermissionState = true + notificationsPermissionAlwaysDeniedState = false + if (_selectedScreen.value == Screen.NOTIFICATIONS_PERMISSION) { onSelectionButtonClick(_bloggingRemindersModel.value) } } } - fun onPermissionDenied() { - _hasNotificationsPermission.value = false + fun onPermissionDenied(isAlwaysDenied: Boolean) { + hasNotificationsPermissionState = false + notificationsPermissionAlwaysDeniedState = isAlwaysDenied + _selectedScreen.value = Screen.NOTIFICATIONS_PERMISSION } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/NotificationsPermissionBuilder.kt b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/NotificationsPermissionBuilder.kt index e41079f3d228..e008d9447cd7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/NotificationsPermissionBuilder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/bloggingreminders/NotificationsPermissionBuilder.kt @@ -14,7 +14,7 @@ import org.wordpress.android.ui.utils.UiString.UiStringRes import javax.inject.Inject class NotificationsPermissionBuilder @Inject constructor() { - fun buildUiItems(appName: String): List { + fun buildUiItems(appName: String, showAppSettingsGuide: Boolean): List { val title = UiStringRes(string.blogging_reminders_notifications_permission_title) val body = UiString.UiStringResWithParams( @@ -22,12 +22,15 @@ class NotificationsPermissionBuilder @Inject constructor() { UiString.UiStringText(appName) ) - return listOf( + val uiItems = mutableListOf( Illustration(drawable.img_illustration_bell_yellow_96dp), Title(title), - Caption(UiStringRes(string.blogging_reminders_notifications_permission_caption)), - HighEmphasisText(EmphasizedText(body, false)) + Caption(UiStringRes(string.blogging_reminders_notifications_permission_caption)) ) + if (showAppSettingsGuide) { + uiItems.add(HighEmphasisText(EmphasizedText(body, false))) + } + return uiItems } fun buildPrimaryButton(onDone: () -> Unit): PrimaryButton {