Move wake lock properties into factory.

This commit is contained in:
akwizgran
2020-08-04 16:45:08 +01:00
parent adb657a5b6
commit eb6b4aa850
3 changed files with 41 additions and 39 deletions

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}