From 98a0d098993eb4ae917f404d2961d8b81694b815 Mon Sep 17 00:00:00 2001 From: goapunk <noobie@goapunks.net> Date: Wed, 6 Sep 2017 21:44:03 +0200 Subject: [PATCH] Renew the wake lock every 30min Signed-off-by: goapunk <noobie@goapunks.net> --- .../bramble/plugin/tor/TorPlugin.java | 29 +++++++++--- .../ScheduledExecutorServiceWakeLock.java | 47 +++++++++++++++++++ 2 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 bramble-android/src/main/java/org/briarproject/bramble/util/ScheduledExecutorServiceWakeLock.java diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java index 5ce2d82558..4193fbd2a0 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java @@ -36,6 +36,7 @@ import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent; import org.briarproject.bramble.api.system.LocationUtils; import org.briarproject.bramble.util.IoUtils; +import org.briarproject.bramble.util.ScheduledExecutorServiceWakeLock; import org.briarproject.bramble.util.StringUtils; import java.io.Closeable; @@ -119,10 +120,12 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { private final ConnectionStatus connectionStatus; private final File torDirectory, torFile, geoIpFile, configFile; private final File doneFile, cookieFile; - private final PowerManager.WakeLock wakeLock; private final AtomicReference<Future<?>> connectivityCheck = new AtomicReference<>(); private final AtomicBoolean used = new AtomicBoolean(false); + private final ScheduledExecutorServiceWakeLock scheduledExecutorServiceWakeLock; + + private PowerManager.WakeLock wakeLock; private volatile boolean running = false; private volatile ServerSocket socket = null; @@ -155,14 +158,27 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { configFile = new File(torDirectory, "torrc"); doneFile = new File(torDirectory, "done"); cookieFile = new File(torDirectory, ".tor/control_auth_cookie"); - Object o = appContext.getSystemService(POWER_SERVICE); - PowerManager pm = (PowerManager) o; - // This tag will prevent Huawei's powermanager from killing us. - wakeLock = pm.newWakeLock(PARTIAL_WAKE_LOCK, "LocationManagerService"); - wakeLock.setReferenceCounted(false); // Don't execute more than one connection status check at a time connectionStatusExecutor = new PoliteExecutor("TorPlugin", ioExecutor, 1); + scheduledExecutorServiceWakeLock = + new ScheduledExecutorServiceWakeLock(appContext); + scheduledExecutorServiceWakeLock.setRunnable((Runnable) () -> { + LOG.info("Renewing wake lock"); + wakeLock.release(); + aquireWakeLock(); + }); + aquireWakeLock(); + } + + private void aquireWakeLock(){ + LOG.info("Aquiring wake lock"); + PowerManager pm = (PowerManager) + appContext.getSystemService(POWER_SERVICE); + // This tag will prevent Huawei's powermanager from killing us. + wakeLock = pm.newWakeLock(PARTIAL_WAKE_LOCK, "LocationManagerService"); + wakeLock.setReferenceCounted(false); + scheduledExecutorServiceWakeLock.setAlarm(1800000, MILLISECONDS); } @Override @@ -514,6 +530,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { } } wakeLock.release(); + scheduledExecutorServiceWakeLock.cancelAlarm(); } @Override diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/ScheduledExecutorServiceWakeLock.java b/bramble-android/src/main/java/org/briarproject/bramble/util/ScheduledExecutorServiceWakeLock.java new file mode 100644 index 0000000000..4dff3946d0 --- /dev/null +++ b/bramble-android/src/main/java/org/briarproject/bramble/util/ScheduledExecutorServiceWakeLock.java @@ -0,0 +1,47 @@ +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; + } +} -- GitLab