Cancel notifications in TaskCompleter

pull/2906/head
Alex Baker 1 month ago
parent 09ffbdd036
commit 07a2eda5ea

@ -8,14 +8,14 @@ package com.todoroo.astrid.dao
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.timers.TimerPlugin import com.todoroo.astrid.timers.TimerPlugin
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.entity.Task
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao
import org.tasks.data.db.SuspendDbUtils.eachChunk
import org.tasks.data.entity.Task
import org.tasks.data.fetchFiltered import org.tasks.data.fetchFiltered
import org.tasks.data.fetchTasks import org.tasks.data.fetchTasks
import org.tasks.data.setCollapsed import org.tasks.data.setCollapsed
import org.tasks.date.DateTimeUtils.isAfterNow import org.tasks.date.DateTimeUtils.isAfterNow
import org.tasks.data.db.SuspendDbUtils.eachChunk
import org.tasks.jobs.WorkManager import org.tasks.jobs.WorkManager
import org.tasks.location.GeofenceApi import org.tasks.location.GeofenceApi
import org.tasks.notifications.NotificationManager import org.tasks.notifications.NotificationManager
@ -108,12 +108,10 @@ class TaskDao @Inject constructor(
val completionDateModified = task.completionDate != (original?.completionDate ?: 0) val completionDateModified = task.completionDate != (original?.completionDate ?: 0)
val deletionDateModified = task.deletionDate != (original?.deletionDate ?: 0) val deletionDateModified = task.deletionDate != (original?.deletionDate ?: 0)
val justCompleted = completionDateModified && task.isCompleted val justCompleted = completionDateModified && task.isCompleted
val justDeleted = deletionDateModified && task.isDeleted
if (task.calendarURI?.isNotBlank() == true) { if (task.calendarURI?.isNotBlank() == true) {
workManager.updateCalendar(task) workManager.updateCalendar(task)
} }
if (justCompleted || justDeleted) { if (justCompleted) {
notificationManager.cancel(task.id)
if (task.timerStart > 0) { if (task.timerStart > 0) {
timerPlugin.stopTimer(task) timerPlugin.stopTimer(task)
} }

@ -1,20 +1,20 @@
package com.todoroo.astrid.service package com.todoroo.astrid.service
import android.app.NotificationManager
import android.app.NotificationManager.INTERRUPTION_FILTER_ALL import android.app.NotificationManager.INTERRUPTION_FILTER_ALL
import android.content.Context import android.content.Context
import android.media.AudioAttributes import android.media.AudioAttributes
import android.media.AudioAttributes.USAGE_NOTIFICATION_EVENT import android.media.AudioAttributes.USAGE_NOTIFICATION_EVENT
import android.media.RingtoneManager import android.media.RingtoneManager
import androidx.room.withTransaction import androidx.room.withTransaction
import org.tasks.data.db.Database
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import org.tasks.data.entity.Task
import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.gcal.GCalHelper
import com.todoroo.astrid.repeats.RepeatTaskHelper import com.todoroo.astrid.repeats.RepeatTaskHelper
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.CaldavDao
import org.tasks.data.db.Database
import org.tasks.data.entity.Task
import org.tasks.notifications.NotificationManager
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.time.DateTimeUtils2.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import timber.log.Timber import timber.log.Timber
@ -64,6 +64,7 @@ class TaskCompleter @Inject internal constructor(
if (tasks.isEmpty()) { if (tasks.isEmpty()) {
return return
} }
tasks.forEach { notificationManager.cancel(it.id) }
val completed = completionDate > 0 val completed = completionDate > 0
val modified = currentTimeMillis() val modified = currentTimeMillis()
database.withTransaction { database.withTransaction {

@ -2,22 +2,21 @@ package com.todoroo.astrid.service
import android.content.Context import android.content.Context
import androidx.room.withTransaction import androidx.room.withTransaction
import org.tasks.data.db.Database
import org.tasks.data.entity.Task
import com.todoroo.astrid.timers.TimerPlugin
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.caldav.VtodoCache import org.tasks.caldav.VtodoCache
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.dao.DeletionDao import org.tasks.data.dao.DeletionDao
import org.tasks.data.dao.LocationDao import org.tasks.data.dao.LocationDao
import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao
import org.tasks.data.dao.UserActivityDao import org.tasks.data.dao.UserActivityDao
import org.tasks.data.db.Database
import org.tasks.data.db.SuspendDbUtils.chunkedMap import org.tasks.data.db.SuspendDbUtils.chunkedMap
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.Task
import org.tasks.files.FileHelper import org.tasks.files.FileHelper
import org.tasks.location.GeofenceApi import org.tasks.location.GeofenceApi
import org.tasks.notifications.NotificationManager import org.tasks.notifications.NotificationManager
@ -34,7 +33,6 @@ class TaskDeleter @Inject constructor(
private val vtodoCache: VtodoCache, private val vtodoCache: VtodoCache,
private val notificationManager: NotificationManager, private val notificationManager: NotificationManager,
private val geofenceApi: GeofenceApi, private val geofenceApi: GeofenceApi,
private val timerPlugin: TimerPlugin,
private val userActivityDao: UserActivityDao, private val userActivityDao: UserActivityDao,
private val locationDao: LocationDao, private val locationDao: LocationDao,
) { ) {

@ -5,8 +5,8 @@
*/ */
package com.todoroo.astrid.timers package com.todoroo.astrid.timers
import org.tasks.data.entity.Task
import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao
import org.tasks.data.entity.Task
import org.tasks.notifications.NotificationManager import org.tasks.notifications.NotificationManager
import org.tasks.time.DateTimeUtils2.currentTimeMillis import org.tasks.time.DateTimeUtils2.currentTimeMillis
import javax.inject.Inject import javax.inject.Inject

@ -5,6 +5,7 @@ import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat.InterruptionFilter
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.AndroidUtilities.preUpsideDownCake import com.todoroo.andlib.utility.AndroidUtilities.preUpsideDownCake
import com.todoroo.astrid.core.BuiltInFilterExposer import com.todoroo.astrid.core.BuiltInFilterExposer
@ -12,11 +13,11 @@ import com.todoroo.astrid.utility.Constants
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.data.entity.Alarm
import org.tasks.data.dao.LocationDao import org.tasks.data.dao.LocationDao
import org.tasks.data.entity.Notification
import org.tasks.data.dao.NotificationDao import org.tasks.data.dao.NotificationDao
import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao
import org.tasks.data.entity.Alarm
import org.tasks.data.entity.Notification
import org.tasks.intents.TaskIntents import org.tasks.intents.TaskIntents
import org.tasks.markdown.MarkdownProvider import org.tasks.markdown.MarkdownProvider
import org.tasks.preferences.PermissionChecker import org.tasks.preferences.PermissionChecker
@ -45,6 +46,10 @@ class NotificationManager @Inject constructor(
private val markdownProvider: MarkdownProvider, private val markdownProvider: MarkdownProvider,
private val permissionChecker: PermissionChecker, private val permissionChecker: PermissionChecker,
) { ) {
@InterruptionFilter
val currentInterruptionFilter: Int
get() = notificationManager.currentInterruptionFilter
private val colorProvider = ColorProvider(context, preferences) private val colorProvider = ColorProvider(context, preferences)
private val queue = NotificationLimiter(MAX_NOTIFICATIONS) private val queue = NotificationLimiter(MAX_NOTIFICATIONS)

@ -3,6 +3,7 @@ package org.tasks.notifications
import android.app.Notification import android.app.Notification
import android.content.Context import android.content.Context
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.app.NotificationManagerCompat.InterruptionFilter
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import java.util.concurrent.Executors.newSingleThreadExecutor import java.util.concurrent.Executors.newSingleThreadExecutor
import javax.inject.Inject import javax.inject.Inject
@ -14,6 +15,10 @@ class ThrottledNotificationManager @Inject constructor(
private val executor = newSingleThreadExecutor() private val executor = newSingleThreadExecutor()
private val throttle = Throttle(NOTIFICATIONS_PER_SECOND, executor = executor, tag = "NOTIFY") private val throttle = Throttle(NOTIFICATIONS_PER_SECOND, executor = executor, tag = "NOTIFY")
@InterruptionFilter
val currentInterruptionFilter: Int
get() = notificationManagerCompat.currentInterruptionFilter
fun cancel(id: Int) { fun cancel(id: Int) {
executor.execute { executor.execute {
notificationManagerCompat.cancel(id) notificationManagerCompat.cancel(id)

Loading…
Cancel
Save