From 40378e5823d70bca05cdd161d8806e6d47ab9404 Mon Sep 17 00:00:00 2001 From: Hafiz Date: Fri, 4 Nov 2022 00:50:32 -0400 Subject: [PATCH 1/2] Request permission on startup and when enabling push notifications --- Habitica/AndroidManifest.xml | 1 + .../notifications/PushNotificationManager.kt | 16 ++++++++++++++++ .../habitica/ui/activities/MainActivity.kt | 12 ++++++++++++ .../fragments/preferences/PreferencesFragment.kt | 11 ++++++++++- .../ui/viewmodels/MainActivityViewModel.kt | 9 ++++++++- 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 447f79bdd..56a41f43a 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -11,6 +11,7 @@ + if (granted) { viewModel.pushNotificationManager.addPushDeviceUsingStoredToken() } } + val isAppBarExpanded: Boolean get() = binding.content.appbar.height - binding.content.appbar.bottom == 0 @@ -305,6 +310,13 @@ open class MainActivity : BaseActivity(), SnackbarActivity { MainNavigationController.setup(navigationController) navigationController.addOnDestinationChangedListener { _, destination, arguments -> updateToolbarTitle(destination, arguments) } + viewModel.requestNotificationPermission.observe(this) { requestNotificationPermission -> + if (requestNotificationPermission && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)) { + notificationPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) + viewModel.requestNotificationPermission.value = false + } + } + if (launchScreen == "/party") { viewModel.user.observeOnce(this) { if (viewModel.userViewModel.isUserInParty) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt index 035b054f5..d4896e42e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.fragments.preferences import android.content.Intent import android.content.SharedPreferences import android.content.res.Configuration +import android.os.Build import android.os.Bundle import android.view.View import androidx.activity.result.contract.ActivityResultContracts @@ -189,6 +190,10 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare } } + private val notificationPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { granted -> if (granted) { pushNotificationManager.addPushDeviceUsingStoredToken() } } + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { when (key) { "use_reminder" -> { @@ -209,7 +214,11 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare pushNotificationsPreference?.isEnabled = usePushNotifications userRepository.updateUser("preferences.pushNotifications.unsubscribeFromAll", !usePushNotifications).subscribe() if (usePushNotifications) { - pushNotificationManager.addPushDeviceUsingStoredToken() + if (!pushNotificationManager.notificationPermissionEnabled() && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)) { + notificationPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) + } else { + pushNotificationManager.addPushDeviceUsingStoredToken() + } } else { pushNotificationManager.removePushDeviceUsingStoredToken() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt index d1110e573..b1bb3bbe2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt @@ -1,7 +1,9 @@ package com.habitrpg.android.habitica.ui.viewmodels import android.content.SharedPreferences +import android.os.Build import androidx.core.content.edit +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.api.MaintenanceApiService @@ -61,6 +63,7 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { putString("language", value) } } + var requestNotificationPermission = MutableLiveData(false) override fun onCleared() { taskRepository.close() @@ -97,7 +100,11 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { analyticsManager.setUserProperty("checkin_count", user.loginIncentives.toString()) analyticsManager.setUserProperty("level", user.stats?.lvl?.toString() ?: "") pushNotificationManager.setUser(user) - pushNotificationManager.addPushDeviceUsingStoredToken() + if (!pushNotificationManager.notificationPermissionEnabled() && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)) { + requestNotificationPermission.value = true + } else { + pushNotificationManager.addPushDeviceUsingStoredToken() + } } contentRepository.retrieveContent() } From 7ddfb56c23ca6bd774d4add9d529710f62a911f5 Mon Sep 17 00:00:00 2001 From: Hafiz Date: Mon, 14 Nov 2022 23:30:20 -0500 Subject: [PATCH 2/2] Update SharedPreferences usePushNotifications if user denies permission --- .../android/habitica/ui/activities/MainActivity.kt | 8 +++++++- .../habitica/ui/viewmodels/MainActivityViewModel.kt | 11 ++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 57744037b..89ae806c1 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -115,7 +115,13 @@ open class MainActivity : BaseActivity(), SnackbarActivity { private val notificationPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission() - ) { granted -> if (granted) { viewModel.pushNotificationManager.addPushDeviceUsingStoredToken() } } + ) { granted -> + if (granted) { + viewModel.pushNotificationManager.addPushDeviceUsingStoredToken() + } else { + viewModel.updateAllowPushNotifications(false) + } + } val isAppBarExpanded: Boolean get() = binding.content.appbar.height - binding.content.appbar.bottom == 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt index b1bb3bbe2..7f299ebff 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt @@ -101,7 +101,9 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { analyticsManager.setUserProperty("level", user.stats?.lvl?.toString() ?: "") pushNotificationManager.setUser(user) if (!pushNotificationManager.notificationPermissionEnabled() && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)) { - requestNotificationPermission.value = true + if (sharedPreferences.getBoolean("usePushNotifications", true)) { + requestNotificationPermission.value = true + } } else { pushNotificationManager.addPushDeviceUsingStoredToken() } @@ -115,6 +117,13 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { } } + fun updateAllowPushNotifications(allowPushNotifications: Boolean) { + sharedPreferences.getBoolean("usePushNotifications", true) + sharedPreferences.edit { + putBoolean("usePushNotifications", allowPushNotifications) + } + } + override fun onTutorialCompleted(step: TutorialStep) { updateUser("flags.tutorial." + step.tutorialGroup + "." + step.identifier, true) logTutorialStatus(step, true)