From 390265a9df5c8a385a9e715271d412cd7dbf4556 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 14 Oct 2022 11:28:52 -0500 Subject: [PATCH] Schedule notifications after permissions granted --- .../com/todoroo/andlib/utility/AndroidUtilities.java | 4 ++++ .../java/com/todoroo/astrid/ui/ReminderControlSet.kt | 8 +++++++- app/src/main/java/org/tasks/Tasks.kt | 2 +- .../java/org/tasks/notifications/NotificationManager.kt | 9 ++++++++- .../java/org/tasks/preferences/PermissionChecker.java | 6 +++++- .../scheduling/NotificationSchedulerIntentService.kt | 2 +- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java b/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java index 75e4e504f..e8d7386bd 100644 --- a/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java +++ b/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java @@ -143,6 +143,10 @@ public class AndroidUtilities { return !atLeastOreo(); } + public static boolean preTiramisu() { + return VERSION.SDK_INT < VERSION_CODES.TIRAMISU; + } + public static boolean atLeastNougatMR1() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1; } diff --git a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt index 4b15dab04..8050c6394 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt @@ -29,6 +29,7 @@ import org.tasks.data.Alarm.Companion.TYPE_DATE_TIME import org.tasks.date.DateTimeUtils import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.MyTimePickerDialog +import org.tasks.scheduling.NotificationSchedulerIntentService import org.tasks.ui.TaskEditControlFragment import java.util.* import javax.inject.Inject @@ -79,7 +80,12 @@ class ReminderControlSet : TaskEditControlFragment() { val ringMode by remember { this@ReminderControlSet.ringMode } val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) { rememberPermissionState( - Manifest.permission.POST_NOTIFICATIONS + Manifest.permission.POST_NOTIFICATIONS, + onPermissionResult = { success -> + if (success) { + NotificationSchedulerIntentService.enqueueWork(context) + } + } ) } else { null diff --git a/app/src/main/java/org/tasks/Tasks.kt b/app/src/main/java/org/tasks/Tasks.kt index 8e9afdb65..7d4c16798 100644 --- a/app/src/main/java/org/tasks/Tasks.kt +++ b/app/src/main/java/org/tasks/Tasks.kt @@ -72,7 +72,7 @@ class Tasks : Application(), Configuration.Provider { private fun backgroundWork() = CoroutineScope(Dispatchers.Default).launch { inventory.updateTasksAccount() - NotificationSchedulerIntentService.enqueueWork(context, false) + NotificationSchedulerIntentService.enqueueWork(context) CalendarNotificationIntentService.enqueueWork(context) refreshScheduler.get().scheduleAll() workManager.get().apply { diff --git a/app/src/main/java/org/tasks/notifications/NotificationManager.kt b/app/src/main/java/org/tasks/notifications/NotificationManager.kt index c42b96d21..4165ac12a 100644 --- a/app/src/main/java/org/tasks/notifications/NotificationManager.kt +++ b/app/src/main/java/org/tasks/notifications/NotificationManager.kt @@ -16,6 +16,7 @@ import org.tasks.data.TaskDao import org.tasks.filters.NotificationsFilter import org.tasks.intents.TaskIntents import org.tasks.markdown.MarkdownProvider +import org.tasks.preferences.PermissionChecker import org.tasks.preferences.Preferences import org.tasks.receivers.CompleteTaskReceiver import org.tasks.reminders.NotificationActivity @@ -38,6 +39,7 @@ class NotificationManager @Inject constructor( private val localBroadcastManager: LocalBroadcastManager, private val notificationManager: ThrottledNotificationManager, private val markdownProvider: MarkdownProvider, + private val permissionChecker: PermissionChecker, ) { private val colorProvider = ColorProvider(context, preferences) private val queue = NotificationLimiter(MAX_NOTIFICATIONS) @@ -142,7 +144,12 @@ class NotificationManager @Inject constructor( alert: Boolean, nonstop: Boolean, fiveTimes: Boolean, - useGroupKey: Boolean) { + useGroupKey: Boolean + ) { + if (!permissionChecker.canNotify()) { + Timber.w("Notifications disabled") + return + } var alert = alert for (notification in notifications) { val builder = getTaskNotification(notification) diff --git a/app/src/main/java/org/tasks/preferences/PermissionChecker.java b/app/src/main/java/org/tasks/preferences/PermissionChecker.java index ce738427c..d21d386a9 100644 --- a/app/src/main/java/org/tasks/preferences/PermissionChecker.java +++ b/app/src/main/java/org/tasks/preferences/PermissionChecker.java @@ -2,7 +2,7 @@ package org.tasks.preferences; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastQ; - +import static com.todoroo.andlib.utility.AndroidUtilities.preTiramisu; import static java.util.Arrays.asList; import android.Manifest.permission; @@ -42,6 +42,10 @@ public class PermissionChecker { return checkPermissions(backgroundPermissions().toArray(new String[0])); } + public boolean canNotify() { + return preTiramisu() || checkPermissions(permission.POST_NOTIFICATIONS); + } + private boolean checkPermissions(String... permissions) { for (String permission : permissions) { if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { diff --git a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt index c3661087a..a9ce22cd2 100644 --- a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt +++ b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt @@ -63,7 +63,7 @@ class NotificationSchedulerIntentService : InjectingJobIntentService() { companion object { private const val EXTRA_CANCEL_EXISTING_NOTIFICATIONS = "extra_cancel_existing_notifications" - fun enqueueWork(context: Context?, cancelNotifications: Boolean) { + fun enqueueWork(context: Context?, cancelNotifications: Boolean = false) { val intent = Intent(context, NotificationSchedulerIntentService::class.java) intent.putExtra(EXTRA_CANCEL_EXISTING_NOTIFICATIONS, cancelNotifications) enqueueWork(