mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 03:39:05 +01:00
Refactor wake lock to use existing ScheduledExecutorService.
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
package org.briarproject.bramble.util;
|
||||
|
||||
import android.os.PowerManager;
|
||||
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static java.util.logging.Level.INFO;
|
||||
|
||||
public class RenewableWakeLock {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(RenewableWakeLock.class.getName());
|
||||
|
||||
private final PowerManager powerManager;
|
||||
private final ScheduledExecutorService scheduler;
|
||||
private final int levelAndFlags;
|
||||
private final String tag;
|
||||
private final long duration;
|
||||
private final TimeUnit timeUnit;
|
||||
private final Runnable renewTask;
|
||||
|
||||
private final Object lock = new Object();
|
||||
private PowerManager.WakeLock wakeLock; // Locking: lock
|
||||
private ScheduledFuture future; // Locking: lock
|
||||
|
||||
public RenewableWakeLock(PowerManager powerManager,
|
||||
ScheduledExecutorService scheduler, int levelAndFlags, String tag,
|
||||
long duration, TimeUnit timeUnit) {
|
||||
this.powerManager = powerManager;
|
||||
this.scheduler = scheduler;
|
||||
this.levelAndFlags = levelAndFlags;
|
||||
this.tag = tag;
|
||||
this.duration = duration;
|
||||
this.timeUnit = timeUnit;
|
||||
renewTask = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
renew();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void acquire() {
|
||||
if (LOG.isLoggable(INFO)) LOG.info("Acquiring wake lock " + tag );
|
||||
synchronized (lock) {
|
||||
if (wakeLock != null) {
|
||||
LOG.info("Already acquired");
|
||||
return;
|
||||
}
|
||||
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
|
||||
wakeLock.setReferenceCounted(false);
|
||||
wakeLock.acquire();
|
||||
future = scheduler.schedule(renewTask, duration, timeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
private void renew() {
|
||||
if (LOG.isLoggable(INFO)) LOG.info("Renewing wake lock " + tag );
|
||||
synchronized (lock) {
|
||||
if (wakeLock == null) {
|
||||
LOG.info("Already released");
|
||||
return;
|
||||
}
|
||||
PowerManager.WakeLock oldWakeLock = wakeLock;
|
||||
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
|
||||
wakeLock.setReferenceCounted(false);
|
||||
wakeLock.acquire();
|
||||
oldWakeLock.release();
|
||||
future = scheduler.schedule(renewTask, duration, timeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
public void release() {
|
||||
if (LOG.isLoggable(INFO)) LOG.info("Releasing wake lock " + tag );
|
||||
synchronized (lock) {
|
||||
if (wakeLock == null) {
|
||||
LOG.info("Already released");
|
||||
return;
|
||||
}
|
||||
future.cancel(false);
|
||||
future = null;
|
||||
wakeLock.release();
|
||||
wakeLock = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
package org.briarproject.bramble.util;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class ScheduledExecutorServiceWakeLock {
|
||||
|
||||
final Context appContext;
|
||||
|
||||
private static final ThreadFactory THREAD_FACTORY = new ThreadFactory() {
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(r);
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
};
|
||||
|
||||
private ScheduledExecutorService scheduledExecutorService = null; // Locking: this
|
||||
private Runnable runnable;
|
||||
|
||||
public ScheduledExecutorServiceWakeLock(Context appContext) {
|
||||
this.appContext = appContext;
|
||||
}
|
||||
|
||||
public void setRunnable(Runnable r){
|
||||
runnable = r;
|
||||
}
|
||||
|
||||
public synchronized void setAlarm(long delay, TimeUnit unit) {
|
||||
if(runnable == null)
|
||||
return;
|
||||
if (scheduledExecutorService == null)
|
||||
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(THREAD_FACTORY);
|
||||
scheduledExecutorService.schedule(runnable, delay, unit);
|
||||
}
|
||||
|
||||
public synchronized void cancelAlarm() {
|
||||
if (scheduledExecutorService == null) throw new IllegalStateException();
|
||||
scheduledExecutorService.shutdownNow();
|
||||
scheduledExecutorService = null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user