diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index edcf42eea..96d8891ef 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -27,6 +27,9 @@
Use Push Notifications
Push Notifications
+ Enable Notifications
+ System Push Notifications for Habitica are disabled - you won\'t receive push notifications until they are enabled
+ Push Notifications
Set your push notifications settings
You won a Challenge!
Received a Private Message
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 7633dda64..7f1d0ec6e 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
@@ -5,26 +5,20 @@ import android.content.SharedPreferences
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
+import android.provider.Settings
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
+import androidx.core.os.bundleOf
import androidx.lifecycle.lifecycleScope
-import androidx.preference.CheckBoxPreference
-import androidx.preference.ListPreference
-import androidx.preference.Preference
-import androidx.preference.PreferenceCategory
-import androidx.preference.PreferenceScreen
+import androidx.preference.*
import com.habitrpg.android.habitica.BuildConfig
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.extensions.addCancelButton
-import com.habitrpg.android.habitica.helpers.AppConfigManager
-import com.habitrpg.android.habitica.helpers.ExceptionHandler
-import com.habitrpg.android.habitica.helpers.SoundManager
-import com.habitrpg.android.habitica.helpers.TaskAlarmManager
-import com.habitrpg.android.habitica.helpers.launchCatching
+import com.habitrpg.android.habitica.helpers.*
import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.prefs.TimePreference
@@ -39,7 +33,7 @@ import com.habitrpg.common.habitica.helpers.AppTestingLevel
import com.habitrpg.common.habitica.helpers.LanguageHelper
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
-import java.util.Locale
+import java.util.*
import javax.inject.Inject
class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
@@ -195,7 +189,26 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare
private val notificationPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
- ) { granted -> if (granted) { pushNotificationManager.addPushDeviceUsingStoredToken() } }
+ ) { granted ->
+ if (granted) {
+ pushNotificationManager.addPushDeviceUsingStoredToken()
+ } else {
+ //If user denies notification settings originally - they must manually enable it through notification settings.
+ val alert = context?.let { HabiticaAlertDialog(it) }
+ alert?.setTitle(R.string.push_notification_system_settings_title)
+ alert?.setMessage(R.string.push_notification_system_settings_description)
+ alert?.addButton(R.string.settings, true, false) { _, _ ->
+ val notifSettingIntent: Intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(Settings.EXTRA_APP_PACKAGE, context?.applicationContext?.packageName)
+ startActivity(notifSettingIntent)
+ }
+ alert?.addButton(R.string.cancel, false) { _, _ ->
+ alert.dismiss()
+ }
+ alert?.show()
+ }
+ }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
when (key) {
@@ -379,7 +392,11 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare
val usePushNotifications = !(user?.preferences?.pushNotifications?.unsubscribeFromAll ?: false)
pushNotificationsPreference?.isEnabled = usePushNotifications
usePushPreference?.isChecked = usePushNotifications
-
+ if (!pushNotificationManager.notificationPermissionEnabled() && Build.VERSION.SDK_INT >= 33 && !usePushNotifications) {
+ usePushPreference?.summary = getString(R.string.push_notification_system_settings_description)
+ } else {
+ usePushPreference?.summary = ""
+ }
val useEmailPreference = findPreference("useEmails") as? CheckBoxPreference
emailNotificationsPreference = findPreference("emailNotifications") as? PreferenceScreen
val useEmailNotifications = !(user?.preferences?.emailNotifications?.unsubscribeFromAll ?: false)