From 7bc3703a1ef70d8b22c1e501f18d235001d0144d Mon Sep 17 00:00:00 2001 From: Hafiz Date: Thu, 12 Jan 2023 13:29:59 -0500 Subject: [PATCH] Request notification permission after user creates reminder --- .../ui/activities/TaskFormActivity.kt | 35 +++++++++++++++++-- .../ui/views/tasks/form/ReminderContainer.kt | 4 +++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt index 0946bf7fe..3357d43f0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt @@ -9,7 +9,7 @@ import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle import android.os.Handler -import android.text.method.LinkMovementMethod +import android.provider.Settings import android.view.Menu import android.view.MenuItem import android.view.MotionEvent @@ -70,8 +70,7 @@ import com.habitrpg.shared.habitica.models.tasks.HabitResetOption import com.habitrpg.shared.habitica.models.tasks.TaskDifficulty import com.habitrpg.shared.habitica.models.tasks.TaskType import io.realm.RealmList -import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import java.util.Date import javax.inject.Inject @@ -110,6 +109,29 @@ class TaskFormActivity : BaseActivity() { private var challenge: Challenge? = null + private val notificationPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { granted -> + if (granted) { + pushNotificationManager.addPushDeviceUsingStoredToken() + } else { + //If user denies notification settings originally - they must manually enable it through notification settings. + val alert = HabiticaAlertDialog(this) + 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, applicationContext?.packageName) + startActivity(notifSettingIntent) + } + alert.addButton(R.string.cancel, false) { _, _ -> + alert.dismiss() + } + alert.show() + } + } + private var isCreating = true private var isChallengeTask = false private var usesTaskAttributeStats = false @@ -750,7 +772,14 @@ class TaskFormActivity : BaseActivity() { private fun checkIfShowNotifLayout() { if (!pushNotificationManager.notificationPermissionEnabled() && Build.VERSION.SDK_INT >= 33) { binding.notificationsDisabledLayout.visibility = View.VISIBLE + binding.remindersContainer.shouldShowNotifPermission = true + binding.remindersContainer.showNotifPermission = { show -> + if (show) { + notificationPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) + } + } } else { + binding.remindersContainer.shouldShowNotifPermission = false binding.notificationsDisabledLayout.visibility = View.GONE } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderContainer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderContainer.kt index f15b71d67..c0ac2fdc2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderContainer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/ReminderContainer.kt @@ -62,6 +62,9 @@ class ReminderContainer @JvmOverloads constructor( field = value } + var showNotifPermission: ((Boolean) -> Unit)? = null + var shouldShowNotifPermission = false + init { orientation = VERTICAL @@ -81,6 +84,7 @@ class ReminderContainer @JvmOverloads constructor( addReminderViewAt(-1) view.animDuration = 300 view.isAddButton = false + if (shouldShowNotifPermission) { showNotifPermission?.invoke(true) } } } val indexToUse = if (index < 0) {