From eb6b4aa85056ea99c80332eed2360f377d17747f Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 4 Aug 2020 16:45:08 +0100 Subject: [PATCH] Move wake lock properties into factory. --- .../system/AndroidWakeLockFactoryImpl.java | 35 +++++++++++++++---- .../bramble/system/RenewableWakeLock.java | 30 +++++++--------- .../bramble/util/AndroidUtils.java | 15 -------- 3 files changed, 41 insertions(+), 39 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidWakeLockFactoryImpl.java b/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidWakeLockFactoryImpl.java index 15fff8844..0ddb3ed90 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidWakeLockFactoryImpl.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/system/AndroidWakeLockFactoryImpl.java @@ -1,6 +1,9 @@ package org.briarproject.bramble.system; import android.app.Application; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.os.PowerManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -12,33 +15,53 @@ import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import static android.content.Context.POWER_SERVICE; -import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; -import static org.briarproject.bramble.util.AndroidUtils.getWakeLockTag; @Immutable @NotNullByDefault class AndroidWakeLockFactoryImpl implements AndroidWakeLockFactory { + /** + * How often to replace the wake lock. + */ private static final long LOCK_DURATION_MS = MINUTES.toMillis(1); + /** + * Automatically release the lock this many milliseconds after it's due + * to have been replaced and released. + */ + private static final long SAFETY_MARGIN_MS = SECONDS.toMillis(10); + private final TaskScheduler scheduler; - private final Application app; private final PowerManager powerManager; + private final String tag; @Inject AndroidWakeLockFactoryImpl(TaskScheduler scheduler, Application app) { this.scheduler = scheduler; - this.app = app; powerManager = (PowerManager) requireNonNull(app.getSystemService(POWER_SERVICE)); + tag = getWakeLockTag(app); } @Override public AndroidWakeLock createWakeLock(int levelAndFlags) { - String tag = getWakeLockTag(app); return new RenewableWakeLock(powerManager, scheduler, levelAndFlags, - tag, LOCK_DURATION_MS, MILLISECONDS); + tag, LOCK_DURATION_MS, SAFETY_MARGIN_MS); + } + + private String getWakeLockTag(Context ctx) { + PackageManager pm = ctx.getPackageManager(); + for (PackageInfo info : pm.getInstalledPackages(0)) { + String name = info.packageName.toLowerCase(); + if (name.startsWith("com.huawei.powergenie")) { + return "LocationManagerService"; + } else if (name.startsWith("com.evenwell.powermonitor")) { + return "AudioIn"; + } + } + return ctx.getPackageName(); } } diff --git a/bramble-android/src/main/java/org/briarproject/bramble/system/RenewableWakeLock.java b/bramble-android/src/main/java/org/briarproject/bramble/system/RenewableWakeLock.java index d145a587e..a4cc520f2 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/system/RenewableWakeLock.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/system/RenewableWakeLock.java @@ -1,13 +1,13 @@ package org.briarproject.bramble.system; import android.os.PowerManager; +import android.os.PowerManager.WakeLock; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.system.AndroidWakeLock; import org.briarproject.bramble.api.system.TaskScheduler; import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -24,33 +24,27 @@ class RenewableWakeLock implements AndroidWakeLock { private static final Logger LOG = getLogger(RenewableWakeLock.class.getName()); - /** - * Automatically release the lock this many milliseconds after it's due - * to have been replaced and released. - */ - private static final int SAFETY_MARGIN_MS = 10_000; - private final PowerManager powerManager; private final TaskScheduler scheduler; private final int levelAndFlags; private final String tag; - private final long durationMs; - private final Runnable renewTask; + private final long durationMs, safetyMarginMs; private final Object lock = new Object(); @Nullable - private PowerManager.WakeLock wakeLock; // Locking: lock + private WakeLock wakeLock; // Locking: lock @Nullable private Future future; // Locking: lock RenewableWakeLock(PowerManager powerManager, TaskScheduler scheduler, - int levelAndFlags, String tag, long duration, TimeUnit timeUnit) { + int levelAndFlags, String tag, long durationMs, + long safetyMarginMs) { this.powerManager = powerManager; this.scheduler = scheduler; this.levelAndFlags = levelAndFlags; this.tag = tag; - durationMs = MILLISECONDS.convert(duration, timeUnit); - renewTask = this::renew; + this.durationMs = durationMs; + this.safetyMarginMs = safetyMarginMs; } @Override @@ -63,8 +57,8 @@ class RenewableWakeLock implements AndroidWakeLock { } wakeLock = powerManager.newWakeLock(levelAndFlags, tag); wakeLock.setReferenceCounted(false); - wakeLock.acquire(durationMs + SAFETY_MARGIN_MS); - future = scheduler.schedule(renewTask, durationMs, MILLISECONDS); + wakeLock.acquire(durationMs + safetyMarginMs); + future = scheduler.schedule(this::renew, durationMs, MILLISECONDS); } } @@ -75,12 +69,12 @@ class RenewableWakeLock implements AndroidWakeLock { LOG.info("Already released"); return; } - PowerManager.WakeLock oldWakeLock = wakeLock; + WakeLock oldWakeLock = wakeLock; wakeLock = powerManager.newWakeLock(levelAndFlags, tag); wakeLock.setReferenceCounted(false); - wakeLock.acquire(durationMs + SAFETY_MARGIN_MS); + wakeLock.acquire(durationMs + safetyMarginMs); oldWakeLock.release(); - future = scheduler.schedule(renewTask, durationMs, MILLISECONDS); + future = scheduler.schedule(this::renew, durationMs, MILLISECONDS); } } diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java index 00ee3ea19..4d5c8ea13 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java @@ -3,8 +3,6 @@ package org.briarproject.bramble.util; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.os.Build; import android.provider.Settings; @@ -119,17 +117,4 @@ public class AndroidUtils { if (SDK_INT < 24) return new String[] {"image/jpeg", "image/png"}; else return new String[] {"image/jpeg", "image/png", "image/gif"}; } - - public static String getWakeLockTag(Context ctx) { - PackageManager pm = ctx.getPackageManager(); - for (PackageInfo info : pm.getInstalledPackages(0)) { - String name = info.packageName.toLowerCase(); - if (name.startsWith("com.huawei.powergenie")) { - return "LocationManagerService"; - } else if (name.startsWith("com.evenwell.powermonitor")) { - return "AudioIn"; - } - } - return ctx.getPackageName(); - } }