Fix notification manager cancellation

pull/820/head
Alex Baker 5 years ago
parent 72efc18009
commit ef62f3851e

@ -9,8 +9,8 @@ import java.util.List;
@Dao @Dao
public interface NotificationDao { public interface NotificationDao {
@Query("SELECT * FROM notification") @Query("SELECT task FROM notification")
List<Notification> getAll(); List<Long> getAll();
@Query("SELECT * FROM notification ORDER BY timestamp DESC") @Query("SELECT * FROM notification ORDER BY timestamp DESC")
List<Notification> getAllOrdered(); List<Notification> getAllOrdered();
@ -22,7 +22,7 @@ public interface NotificationDao {
int delete(long taskId); int delete(long taskId);
@Query("DELETE FROM notification WHERE task IN(:taskIds)") @Query("DELETE FROM notification WHERE task IN(:taskIds)")
int deleteAll(List<Long> taskIds); void deleteAll(List<Long> taskIds);
@Query("SELECT MAX(timestamp) FROM notification") @Query("SELECT MAX(timestamp) FROM notification")
long latestTimestamp(); long latestTimestamp();

@ -9,7 +9,10 @@ import static com.google.common.collect.Lists.transform;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastNougat; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastNougat;
import static com.todoroo.astrid.reminders.ReminderService.TYPE_GEOFENCE_ENTER; import static com.todoroo.astrid.reminders.ReminderService.TYPE_GEOFENCE_ENTER;
import static com.todoroo.astrid.reminders.ReminderService.TYPE_GEOFENCE_EXIT; import static com.todoroo.astrid.reminders.ReminderService.TYPE_GEOFENCE_EXIT;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import android.annotation.SuppressLint;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
@ -26,6 +29,7 @@ import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.ReminderService; import com.todoroo.astrid.reminders.ReminderService;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import java.util.ArrayList; import java.util.ArrayList;
@ -87,40 +91,30 @@ public class NotificationManager {
notificationManagerCompat = NotificationManagerCompat.from(context); notificationManagerCompat = NotificationManagerCompat.from(context);
} }
@SuppressLint("CheckResult")
public void cancel(long id) { public void cancel(long id) {
notificationManagerCompat.cancel((int) id); if (id == SUMMARY_NOTIFICATION_ID) {
queue.remove(id); //noinspection ResultOfMethodCallIgnored
Completable.fromAction( Single.fromCallable(() -> concat(notificationDao.getAll(), singletonList(id)))
() -> { .subscribeOn(Schedulers.io())
if (id == SUMMARY_NOTIFICATION_ID) { .observeOn(AndroidSchedulers.mainThread())
List<Long> tasks = transform(notificationDao.getAll(), n -> n.taskId); .subscribe(this::cancel);
for (Long task : tasks) { } else {
notificationManagerCompat.cancel(task.intValue()); cancel(singletonList(id));
} }
notificationDao.deleteAll(tasks);
} else if (notificationDao.delete(id) > 0) {
notifyTasks(Collections.emptyList(), false, false, false);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe();
} }
public void cancel(List<Long> ids) { @SuppressLint("CheckResult")
public void cancel(Iterable<Long> ids) {
for (Long id : ids) { for (Long id : ids) {
notificationManagerCompat.cancel(id.intValue()); notificationManagerCompat.cancel(id.intValue());
queue.remove(id); queue.remove(id);
} }
Completable.fromAction(
() -> { //noinspection ResultOfMethodCallIgnored
if (notificationDao.deleteAll(ids) > 0) { Completable.fromAction(() -> notificationDao.deleteAll(newArrayList(ids)))
notifyTasks(Collections.emptyList(), false, false, false);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.subscribe(); .subscribe(() -> notifyTasks(emptyList(), false, false, false));
} }
public void restoreNotifications(boolean cancelExisting) { public void restoreNotifications(boolean cancelExisting) {

Loading…
Cancel
Save