mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 14:19:53 +01:00
Move wake lock properties into factory.
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
package org.briarproject.bramble.system;
|
package org.briarproject.bramble.system;
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
@@ -12,33 +15,53 @@ import javax.annotation.concurrent.Immutable;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static android.content.Context.POWER_SERVICE;
|
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.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
|
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
|
||||||
import static org.briarproject.bramble.util.AndroidUtils.getWakeLockTag;
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
class AndroidWakeLockFactoryImpl implements AndroidWakeLockFactory {
|
class AndroidWakeLockFactoryImpl implements AndroidWakeLockFactory {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How often to replace the wake lock.
|
||||||
|
*/
|
||||||
private static final long LOCK_DURATION_MS = MINUTES.toMillis(1);
|
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 TaskScheduler scheduler;
|
||||||
private final Application app;
|
|
||||||
private final PowerManager powerManager;
|
private final PowerManager powerManager;
|
||||||
|
private final String tag;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
AndroidWakeLockFactoryImpl(TaskScheduler scheduler, Application app) {
|
AndroidWakeLockFactoryImpl(TaskScheduler scheduler, Application app) {
|
||||||
this.scheduler = scheduler;
|
this.scheduler = scheduler;
|
||||||
this.app = app;
|
|
||||||
powerManager = (PowerManager)
|
powerManager = (PowerManager)
|
||||||
requireNonNull(app.getSystemService(POWER_SERVICE));
|
requireNonNull(app.getSystemService(POWER_SERVICE));
|
||||||
|
tag = getWakeLockTag(app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AndroidWakeLock createWakeLock(int levelAndFlags) {
|
public AndroidWakeLock createWakeLock(int levelAndFlags) {
|
||||||
String tag = getWakeLockTag(app);
|
|
||||||
return new RenewableWakeLock(powerManager, scheduler, levelAndFlags,
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package org.briarproject.bramble.system;
|
package org.briarproject.bramble.system;
|
||||||
|
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
import android.os.PowerManager.WakeLock;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.system.AndroidWakeLock;
|
import org.briarproject.bramble.api.system.AndroidWakeLock;
|
||||||
import org.briarproject.bramble.api.system.TaskScheduler;
|
import org.briarproject.bramble.api.system.TaskScheduler;
|
||||||
|
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@@ -24,33 +24,27 @@ class RenewableWakeLock implements AndroidWakeLock {
|
|||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
getLogger(RenewableWakeLock.class.getName());
|
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 PowerManager powerManager;
|
||||||
private final TaskScheduler scheduler;
|
private final TaskScheduler scheduler;
|
||||||
private final int levelAndFlags;
|
private final int levelAndFlags;
|
||||||
private final String tag;
|
private final String tag;
|
||||||
private final long durationMs;
|
private final long durationMs, safetyMarginMs;
|
||||||
private final Runnable renewTask;
|
|
||||||
|
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
@Nullable
|
@Nullable
|
||||||
private PowerManager.WakeLock wakeLock; // Locking: lock
|
private WakeLock wakeLock; // Locking: lock
|
||||||
@Nullable
|
@Nullable
|
||||||
private Future<?> future; // Locking: lock
|
private Future<?> future; // Locking: lock
|
||||||
|
|
||||||
RenewableWakeLock(PowerManager powerManager, TaskScheduler scheduler,
|
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.powerManager = powerManager;
|
||||||
this.scheduler = scheduler;
|
this.scheduler = scheduler;
|
||||||
this.levelAndFlags = levelAndFlags;
|
this.levelAndFlags = levelAndFlags;
|
||||||
this.tag = tag;
|
this.tag = tag;
|
||||||
durationMs = MILLISECONDS.convert(duration, timeUnit);
|
this.durationMs = durationMs;
|
||||||
renewTask = this::renew;
|
this.safetyMarginMs = safetyMarginMs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -63,8 +57,8 @@ class RenewableWakeLock implements AndroidWakeLock {
|
|||||||
}
|
}
|
||||||
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
|
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
|
||||||
wakeLock.setReferenceCounted(false);
|
wakeLock.setReferenceCounted(false);
|
||||||
wakeLock.acquire(durationMs + SAFETY_MARGIN_MS);
|
wakeLock.acquire(durationMs + safetyMarginMs);
|
||||||
future = scheduler.schedule(renewTask, durationMs, MILLISECONDS);
|
future = scheduler.schedule(this::renew, durationMs, MILLISECONDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,12 +69,12 @@ class RenewableWakeLock implements AndroidWakeLock {
|
|||||||
LOG.info("Already released");
|
LOG.info("Already released");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PowerManager.WakeLock oldWakeLock = wakeLock;
|
WakeLock oldWakeLock = wakeLock;
|
||||||
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
|
wakeLock = powerManager.newWakeLock(levelAndFlags, tag);
|
||||||
wakeLock.setReferenceCounted(false);
|
wakeLock.setReferenceCounted(false);
|
||||||
wakeLock.acquire(durationMs + SAFETY_MARGIN_MS);
|
wakeLock.acquire(durationMs + safetyMarginMs);
|
||||||
oldWakeLock.release();
|
oldWakeLock.release();
|
||||||
future = scheduler.schedule(renewTask, durationMs, MILLISECONDS);
|
future = scheduler.schedule(this::renew, durationMs, MILLISECONDS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package org.briarproject.bramble.util;
|
|||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageInfo;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
@@ -119,17 +117,4 @@ public class AndroidUtils {
|
|||||||
if (SDK_INT < 24) return new String[] {"image/jpeg", "image/png"};
|
if (SDK_INT < 24) return new String[] {"image/jpeg", "image/png"};
|
||||||
else return new String[] {"image/jpeg", "image/png", "image/gif"};
|
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user