Add method for executing a task on an executor wakefully.

This commit is contained in:
akwizgran
2020-08-06 15:25:37 +01:00
parent 942bb28701
commit b2840c1b00
3 changed files with 24 additions and 17 deletions

View File

@@ -2,10 +2,14 @@ package org.briarproject.bramble.api.system;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import java.util.concurrent.Executor;
@NotNullByDefault
public interface AndroidWakeLockManager {
AndroidWakeLock createWakeLock();
void runWakefully(Runnable r);
void executeWakefully(Runnable r, Executor executor);
}

View File

@@ -11,7 +11,6 @@ import android.os.SystemClock;
import org.briarproject.bramble.api.lifecycle.Service;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.system.AlarmListener;
import org.briarproject.bramble.api.system.AndroidWakeLock;
import org.briarproject.bramble.api.system.AndroidWakeLockManager;
import org.briarproject.bramble.api.system.TaskScheduler;
@@ -89,7 +88,8 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
TimeUnit unit) {
long now = SystemClock.elapsedRealtime();
long dueMillis = now + MILLISECONDS.convert(delay, unit);
Runnable wakeful = createWakefulTask(task, executor);
Runnable wakeful = () ->
wakeLockManager.executeWakefully(task, executor);
ScheduledTask s = new ScheduledTask(wakeful, dueMillis);
if (dueMillis <= now) {
scheduledExecutorService.execute(s);
@@ -127,21 +127,6 @@ class AndroidTaskScheduler implements TaskScheduler, Service, AlarmListener {
});
}
private Runnable createWakefulTask(Runnable task, Executor executor) {
// Hold a wake lock from before we submit the task until after it runs
AndroidWakeLock wakeLock = wakeLockManager.createWakeLock();
return () -> {
wakeLock.acquire();
executor.execute(() -> {
try {
task.run();
} finally {
wakeLock.release();
}
});
};
}
private void runDueTasks() {
long now = SystemClock.elapsedRealtime();
List<ScheduledTask> due = new ArrayList<>();

View File

@@ -68,6 +68,24 @@ class AndroidWakeLockManagerImpl implements AndroidWakeLockManager {
}
}
@Override
public void executeWakefully(Runnable r, Executor executor) {
AndroidWakeLock wakeLock = createWakeLock();
wakeLock.acquire();
try {
executor.execute(() -> {
try {
r.run();
} finally {
wakeLock.release();
}
});
} catch (Exception e) {
wakeLock.release();
throw e;
}
}
private String getWakeLockTag(Context ctx) {
PackageManager pm = ctx.getPackageManager();
for (PackageInfo info : pm.getInstalledPackages(0)) {