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)