mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-24 14:45:46 +00:00
Request permission on startup and when enabling push notifications
This commit is contained in:
parent
e3f66e57df
commit
40378e5823
5 changed files with 47 additions and 2 deletions
|
|
@ -11,6 +11,7 @@
|
|||
<uses-permission android:name="com.android.vending.BILLING" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||
|
||||
<application
|
||||
android:name=".HabiticaApplication"
|
||||
|
|
|
|||
|
|
@ -2,6 +2,10 @@ package com.habitrpg.android.habitica.helpers.notifications
|
|||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Build
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import androidx.core.content.edit
|
||||
import com.google.firebase.messaging.FirebaseMessaging
|
||||
import com.google.firebase.messaging.RemoteMessage
|
||||
|
|
@ -33,6 +37,18 @@ class PushNotificationManager(
|
|||
this.user = user
|
||||
}
|
||||
|
||||
/**
|
||||
* New installs on Android 13 require
|
||||
* Notification permissions be approved.
|
||||
* Devices on Android 12L or lower with previously
|
||||
* allowed notification permissions that update to 13
|
||||
* will have notification permissions enabled by default.
|
||||
*/
|
||||
fun notificationPermissionEnabled(): Boolean {
|
||||
val notificationManager = NotificationManagerCompat.from(context)
|
||||
return notificationManager.areNotificationsEnabled()
|
||||
}
|
||||
|
||||
fun addPushDeviceUsingStoredToken() {
|
||||
if (refreshedToken.isNotBlank()) {
|
||||
addRefreshToken()
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import android.view.KeyEvent
|
|||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.activity.viewModels
|
||||
import androidx.appcompat.app.ActionBarDrawerToggle
|
||||
import androidx.core.view.children
|
||||
|
|
@ -112,6 +113,10 @@ open class MainActivity : BaseActivity(), SnackbarActivity {
|
|||
private var userQuestStatus = UserQuestStatus.NO_QUEST
|
||||
private var lastNotificationOpen: Long? = null
|
||||
|
||||
private val notificationPermissionLauncher = registerForActivityResult(
|
||||
ActivityResultContracts.RequestPermission()
|
||||
) { granted -> 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) {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue