diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index 798548e15..70e512272 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -11,6 +11,7 @@
+
+ if (granted) {
+ viewModel.pushNotificationManager.addPushDeviceUsingStoredToken()
+ } else {
+ viewModel.updateAllowPushNotifications(false)
+ }
+ }
+
val isAppBarExpanded: Boolean
get() = binding.content.appbar.height - binding.content.appbar.bottom == 0
@@ -304,6 +315,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 5ff94f39d..33e3fd37f 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
@@ -192,6 +193,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" -> {
@@ -214,7 +219,11 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare
userRepository.updateUser("preferences.pushNotifications.unsubscribeFromAll", !usePushNotifications)
}
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 9c6c215d4..9528b5bda 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,13 @@ 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)) {
+ if (sharedPreferences.getBoolean("usePushNotifications", true)) {
+ requestNotificationPermission.value = true
+ }
+ } else {
+ pushNotificationManager.addPushDeviceUsingStoredToken()
+ }
}
contentRepository.retrieveContent()
}
@@ -107,6 +116,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)