mirror of https://github.com/tasks/tasks
Convert NotificationQueue to Kotlin
parent
e63f8721e7
commit
e482a881f9
@ -1,117 +0,0 @@
|
||||
package org.tasks.jobs;
|
||||
|
||||
import static com.google.common.base.Predicates.notNull;
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Lists.newArrayList;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Ordering;
|
||||
import com.google.common.collect.TreeMultimap;
|
||||
import com.google.common.primitives.Ints;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import org.tasks.injection.ApplicationScope;
|
||||
import org.tasks.preferences.Preferences;
|
||||
import org.tasks.time.DateTime;
|
||||
|
||||
@ApplicationScope
|
||||
public class NotificationQueue {
|
||||
|
||||
private final TreeMultimap<Long, NotificationQueueEntry> jobs =
|
||||
TreeMultimap.create(Ordering.natural(), (l, r) -> Ints.compare(l.hashCode(), r.hashCode()));
|
||||
private final Preferences preferences;
|
||||
private final WorkManager workManager;
|
||||
|
||||
@Inject
|
||||
public NotificationQueue(Preferences preferences, WorkManager workManager) {
|
||||
this.preferences = preferences;
|
||||
this.workManager = workManager;
|
||||
}
|
||||
|
||||
public synchronized <T extends NotificationQueueEntry> void add(T entry) {
|
||||
add(Collections.singletonList(entry));
|
||||
}
|
||||
|
||||
public synchronized <T extends NotificationQueueEntry> void add(Iterable<T> entries) {
|
||||
long originalFirstTime = firstTime();
|
||||
for (T entry : filter(entries, notNull())) {
|
||||
jobs.put(entry.getTime(), entry);
|
||||
}
|
||||
if (originalFirstTime != firstTime()) {
|
||||
scheduleNext(true);
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void clear() {
|
||||
jobs.clear();
|
||||
workManager.cancelNotifications();
|
||||
}
|
||||
|
||||
public synchronized void cancelAlarm(long alarmId) {
|
||||
cancel(AlarmEntry.class, alarmId);
|
||||
}
|
||||
|
||||
public synchronized void cancelReminder(long taskId) {
|
||||
cancel(ReminderEntry.class, taskId);
|
||||
}
|
||||
|
||||
private void cancel(Class<? extends NotificationQueueEntry> c, long id) {
|
||||
long firstTime = firstTime();
|
||||
|
||||
remove(newArrayList(filter(jobs.values(), r -> r.getClass().equals(c) && r.getId() == id)));
|
||||
|
||||
if (firstTime != firstTime()) {
|
||||
scheduleNext(true);
|
||||
}
|
||||
}
|
||||
|
||||
synchronized List<? extends NotificationQueueEntry> getOverdueJobs() {
|
||||
List<NotificationQueueEntry> result = new ArrayList<>();
|
||||
long cutoff = new DateTime().startOfMinute().plusMinutes(1).getMillis();
|
||||
for (Long key : jobs.keySet().headSet(cutoff)) {
|
||||
result.addAll(jobs.get(key));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
synchronized void scheduleNext() {
|
||||
scheduleNext(false);
|
||||
}
|
||||
|
||||
private void scheduleNext(boolean cancelCurrent) {
|
||||
if (jobs.isEmpty()) {
|
||||
if (cancelCurrent) {
|
||||
workManager.cancelNotifications();
|
||||
}
|
||||
} else {
|
||||
workManager.scheduleNotification(nextScheduledTime());
|
||||
}
|
||||
}
|
||||
|
||||
private long firstTime() {
|
||||
return jobs.isEmpty() ? 0 : jobs.asMap().firstKey();
|
||||
}
|
||||
|
||||
long nextScheduledTime() {
|
||||
long next = firstTime();
|
||||
return next > 0 ? preferences.adjustForQuietHours(next) : 0;
|
||||
}
|
||||
|
||||
int size() {
|
||||
return jobs.size();
|
||||
}
|
||||
|
||||
List<NotificationQueueEntry> getJobs() {
|
||||
return ImmutableList.copyOf(jobs.values());
|
||||
}
|
||||
|
||||
public synchronized boolean remove(List<? extends NotificationQueueEntry> entries) {
|
||||
boolean success = true;
|
||||
for (NotificationQueueEntry entry : entries) {
|
||||
success &= !jobs.containsEntry(entry.getTime(), entry) || jobs.remove(entry.getTime(), entry);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
package org.tasks.jobs
|
||||
|
||||
import com.google.common.collect.Ordering
|
||||
import com.google.common.collect.TreeMultimap
|
||||
import com.google.common.primitives.Ints
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
import org.tasks.injection.ApplicationScope
|
||||
import org.tasks.preferences.Preferences
|
||||
import org.tasks.time.DateTime
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
@ApplicationScope
|
||||
class NotificationQueue @Inject constructor(private val preferences: Preferences, private val workManager: WorkManager) {
|
||||
private val jobs = TreeMultimap.create(Ordering.natural<Long>(), Comparator { l: NotificationQueueEntry, r: NotificationQueueEntry -> Ints.compare(l.hashCode(), r.hashCode()) })
|
||||
|
||||
@Synchronized
|
||||
fun <T : NotificationQueueEntry> add(entry: T) = add(listOf(entry))
|
||||
|
||||
@Synchronized
|
||||
fun <T : NotificationQueueEntry> add(entries: Iterable<T?>) {
|
||||
val originalFirstTime = firstTime()
|
||||
entries.filterNotNull().forEach { jobs.put(it.time, it) }
|
||||
if (originalFirstTime != firstTime()) {
|
||||
scheduleNext(true)
|
||||
}
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun clear() {
|
||||
jobs.clear()
|
||||
workManager.cancelNotifications()
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun cancelAlarm(alarmId: Long) = cancel(AlarmEntry::class.java, alarmId)
|
||||
|
||||
@Synchronized
|
||||
fun cancelReminder(taskId: Long) = cancel(ReminderEntry::class.java, taskId)
|
||||
|
||||
private fun cancel(c: Class<out NotificationQueueEntry>, id: Long) {
|
||||
val firstTime = firstTime()
|
||||
jobs.values()
|
||||
.filter { it.javaClass == c && it.id == id }
|
||||
.forEach { remove(listOf(it)) }
|
||||
if (firstTime != firstTime()) {
|
||||
scheduleNext(true)
|
||||
}
|
||||
}
|
||||
|
||||
@get:Synchronized
|
||||
val overdueJobs: List<NotificationQueueEntry>
|
||||
get() {
|
||||
return jobs.keySet()
|
||||
.headSet(DateTime().startOfMinute().plusMinutes(1).millis)
|
||||
.flatMap { jobs[it] }
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun scheduleNext() = scheduleNext(false)
|
||||
|
||||
private fun scheduleNext(cancelCurrent: Boolean) {
|
||||
if (jobs.isEmpty) {
|
||||
if (cancelCurrent) {
|
||||
workManager.cancelNotifications()
|
||||
}
|
||||
} else {
|
||||
workManager.scheduleNotification(nextScheduledTime())
|
||||
}
|
||||
}
|
||||
|
||||
private fun firstTime() = if (jobs.isEmpty) 0L else jobs.asMap().firstKey()
|
||||
|
||||
fun nextScheduledTime(): Long {
|
||||
val next = firstTime()
|
||||
return if (next > 0) preferences.adjustForQuietHours(next) else 0
|
||||
}
|
||||
|
||||
fun size() = jobs.size()
|
||||
|
||||
fun getJobs() = jobs.values().toImmutableList()
|
||||
|
||||
@Synchronized
|
||||
fun remove(entries: List<NotificationQueueEntry>): Boolean {
|
||||
var success = true
|
||||
for (entry in entries) {
|
||||
success = success and (!jobs.containsEntry(entry.time, entry) || jobs.remove(entry.time, entry))
|
||||
}
|
||||
return success
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue