Simplified wakelock handling

This commit is contained in:
M66B 2022-10-22 08:19:29 +02:00
parent 7cf2194df5
commit bbb0480512
7 changed files with 129 additions and 163 deletions

View File

@ -262,7 +262,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
"use_modseq", "uid_command", "perform_expunge", "uid_expunge",
"auth_plain", "auth_login", "auth_ntlm", "auth_sasl", "auth_apop", "use_top",
"keep_alive_poll", "empty_pool", "idle_done", "logarithmic_backoff",
"exact_alarms", "op_wakelock", "infra", "dkim_verify", "dup_msgids", "global_keywords", "test_iab"
"exact_alarms", "infra", "dkim_verify", "dup_msgids", "global_keywords", "test_iab"
};
private final static String[] RESET_QUESTIONS = new String[]{
@ -417,7 +417,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swIdleDone = view.findViewById(R.id.swIdleDone);
swLogarithmicBackoff = view.findViewById(R.id.swLogarithmicBackoff);
swExactAlarms = view.findViewById(R.id.swExactAlarms);
swOpWakelock = view.findViewById(R.id.swOpWakelock);
swInfra = view.findViewById(R.id.swInfra);
swDupMsgId = view.findViewById(R.id.swDupMsgId);
etKeywords = view.findViewById(R.id.etKeywords);
@ -1428,13 +1427,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
}
});
swOpWakelock.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("op_wakelock", checked).apply();
}
});
swInfra.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@ -2135,7 +2127,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swIdleDone.setChecked(prefs.getBoolean("idle_done", true));
swLogarithmicBackoff.setChecked(prefs.getBoolean("logarithmic_backoff", true));
swExactAlarms.setChecked(prefs.getBoolean("exact_alarms", true));
swOpWakelock.setChecked(prefs.getBoolean("op_wakelock", false));
swInfra.setChecked(prefs.getBoolean("infra", false));
swDupMsgId.setChecked(prefs.getBoolean("dup_msgids", false));
etKeywords.setText(prefs.getString("global_keywords", null));

View File

@ -178,6 +178,7 @@ public class Helper {
static final float LOW_LIGHT = 0.6f;
static final int WAKELOCK_MAX = 30 * 60 * 1000; // milliseconds
static final int BUFFER_SIZE = 8192; // Same as in Files class
static final long MIN_REQUIRED_SPACE = 100 * 1000L * 1000L;
static final int AUTOLOCK_GRACE = 15; // seconds

View File

@ -84,9 +84,6 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar
private static final int CONNECTIVITY_DELAY = 5000; // milliseconds
private static final int PROGRESS_UPDATE_INTERVAL = 1000; // milliseconds
// 10 min @ 128 kbit/s = 7.5 MiB
private static final long WAKELOCK_MAX = 10 * 60 * 1000L; // milliseconds
static final int PI_SEND = 1;
@Override
@ -355,8 +352,9 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar
};
private void processOperations(List<EntityOperation> ops) {
long start = new Date().getTime();
try {
wlOutbox.acquire(WAKELOCK_MAX * ops.size());
wlOutbox.acquire(Helper.WAKELOCK_MAX);
DB db = DB.getInstance(this);
EntityFolder outbox = db.folder().getOutbox();
@ -467,7 +465,10 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar
db.folder().setFolderSyncState(outbox.id, null);
}
} finally {
wlOutbox.release();
if (wlOutbox.isHeld())
wlOutbox.release();
else
Log.i("send release elapse=" + (new Date().getTime() - start));
}
}

View File

@ -149,10 +149,6 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
private static final int FAST_FAIL_COUNT = 3;
private static final int FETCH_YIELD_DURATION = 50; // milliseconds
private static final long WATCHDOG_INTERVAL = 60 * 60 * 1000L; // milliseconds
private static final long WAKELOCK_ACCOUNT_MAX = 3 * 60 * 1000L; // milliseconds
private static final long WAKELOCK_CONTENT_MAX = 10 * 60 * 1000L; // milliseconds
private static final long WAKELOCK_OPERATION_MAX = 10 * 1000L; // milliseconds
private static final int MESSAGES_HOUR_AVG = 10;
private static final String ACTION_NEW_MESSAGE_COUNT = BuildConfig.APPLICATION_ID + ".NEW_MESSAGE_COUNT";
@ -471,8 +467,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
queue.submit(new RunnableEx("state#init") {
@Override
public void delegate() {
long start = new Date().getTime();
try {
wl.acquire(WAKELOCK_ACCOUNT_MAX);
wl.acquire(Helper.WAKELOCK_MAX);
EntityLog.log(ServiceSynchronize.this, EntityLog.Type.Scheduling,
"### init " + accountNetworkState);
@ -500,9 +497,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
db.endTransaction();
}
} finally {
if (!wl.isHeld())
Log.e("state#init released");
wl.release();
if (wl.isHeld())
wl.release();
else
Log.e("state#init released elapse=" + (new Date().getTime() - start));
}
}
});
@ -528,8 +526,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
queue.submit(new RunnableEx("state#start") {
@Override
public void delegate() {
long start = new Date().getTime();
try {
wl.acquire(WAKELOCK_ACCOUNT_MAX);
wl.acquire(Helper.WAKELOCK_MAX);
Map<String, String> crumb = new HashMap<>();
crumb.put("account", accountNetworkState.accountState.id.toString());
@ -547,9 +546,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
} catch (Throwable ex) {
Log.e(ex);
} finally {
if (!wl.isHeld())
Log.e("state#start released");
wl.release();
if (wl.isHeld())
wl.release();
else
Log.e("state#start released elapse=" + (new Date().getTime() - start));
}
}
});
@ -567,8 +567,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
queue.submit(new RunnableEx("state#stop") {
@Override
public void delegate() {
long start = new Date().getTime();
try {
wl.acquire(WAKELOCK_ACCOUNT_MAX);
wl.acquire(Helper.WAKELOCK_MAX);
Map<String, String> crumb = new HashMap<>();
crumb.put("account", accountNetworkState.accountState.id.toString());
@ -588,9 +589,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
} catch (Throwable ex) {
Log.e(ex);
} finally {
if (!wl.isHeld())
Log.e("state#stop released");
wl.release();
if (wl.isHeld())
wl.release();
else
Log.e("state#stop released elapse=" + (new Date().getTime() - start));
}
}
});
@ -603,8 +605,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
queue.submit(new RunnableEx("state#delete") {
@Override
public void delegate() {
long start = new Date().getTime();
try {
wl.acquire(WAKELOCK_ACCOUNT_MAX);
wl.acquire(Helper.WAKELOCK_MAX);
DB db = DB.getInstance(ServiceSynchronize.this);
db.account().deleteAccount(accountNetworkState.accountState.id);
@ -616,9 +619,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
} catch (Throwable ex) {
Log.e(ex);
} finally {
if (!wl.isHeld())
Log.e("state#delete released");
wl.release();
if (wl.isHeld())
wl.release();
else
Log.e("state#delete released elapse=" + (new Date().getTime() - start));
}
}
});
@ -628,8 +632,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
queue.submit(new RunnableEx("state#quit") {
@Override
public void delegate() {
long start = new Date().getTime();
try {
wl.acquire(WAKELOCK_ACCOUNT_MAX);
wl.acquire(Helper.WAKELOCK_MAX);
EntityLog.log(ServiceSynchronize.this, EntityLog.Type.Scheduling,
"### quit eventId=" + eventId);
@ -671,9 +676,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
} catch (Throwable ex) {
Log.e(ex);
} finally {
if (!wl.isHeld())
Log.e("state#quit released");
wl.release();
if (wl.isHeld())
wl.release();
else
Log.e("state#quit released elapse=" + (new Date().getTime() - start));
}
}
});
@ -685,16 +691,18 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
queue.submit(new RunnableEx("state#backup#exec") {
@Override
public void delegate() {
long start = new Date().getTime();
try {
wl.acquire(WAKELOCK_ACCOUNT_MAX);
wl.acquire(Helper.WAKELOCK_MAX);
MessageClassifier.save(ServiceSynchronize.this);
} catch (Throwable ex) {
Log.e(ex);
} finally {
if (!wl.isHeld())
Log.e("state#backup released");
wl.release();
if (wl.isHeld())
wl.release();
else
Log.e("state#backup released elapse=" + (new Date().getTime() - start));
}
}
});
@ -1490,8 +1498,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
final PowerManager.WakeLock wlMessage = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID + ":account." + account.id + ".message");
long start = new Date().getTime();
try {
wlAccount.acquire(WAKELOCK_ACCOUNT_MAX);
wlAccount.acquire(Helper.WAKELOCK_MAX);
boolean forced = false;
final DB db = DB.getInstance(this);
@ -1564,9 +1573,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
}
lastStillHere.setTime(now);
}
} else
} else {
long start = new Date().getTime();
try {
wlFolder.acquire(WAKELOCK_OPERATION_MAX);
wlFolder.acquire(Helper.WAKELOCK_MAX);
EntityLog.log(ServiceSynchronize.this, EntityLog.Type.Account, account,
account.name + " alert: " + message);
@ -1583,10 +1593,12 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
Log.w(ex);
}
} finally {
if (!wlFolder.isHeld())
Log.e("folder notice released");
wlFolder.release();
if (wlFolder.isHeld())
wlFolder.release();
else
Log.e("folder notice released elapse=" + (new Date().getTime() - start));
}
}
}
});
@ -1596,8 +1608,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
executor.submit(new RunnableEx("purge#exec") {
@Override
public void delegate() {
long start = new Date().getTime();
try {
wlAccount.acquire(WAKELOCK_ACCOUNT_MAX);
wlAccount.acquire(Helper.WAKELOCK_MAX);
// Close cached connections
Log.i(account.name + " Empty connection pool");
@ -1605,9 +1618,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
} catch (Throwable ex) {
Log.e(ex);
} finally {
if (!wlAccount.isHeld())
Log.e("purge released");
wlAccount.release();
if (wlAccount.isHeld())
wlAccount.release();
else
Log.e("purge released elapse=" + (new Date().getTime() - start));
}
}
});
@ -1697,24 +1711,27 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
iservice.getStore().addFolderListener(new FolderAdapter() {
@Override
public void folderCreated(FolderEvent e) {
long start = new Date().getTime();
try {
wlFolder.acquire(WAKELOCK_OPERATION_MAX);
wlFolder.acquire(Helper.WAKELOCK_MAX);
String name = e.getFolder().getFullName();
Log.i("Folder created=" + name);
if (db.folder().getFolderByName(account.id, name) == null)
reload(ServiceSynchronize.this, account.id, false, "folder created");
} finally {
if (!wlFolder.isHeld())
Log.e("folder created released");
wlFolder.release();
if (wlFolder.isHeld())
wlFolder.release();
else
Log.e("folder created released elapse=" + (new Date().getTime() - start));
}
}
@Override
public void folderRenamed(FolderEvent e) {
long start = new Date().getTime();
try {
wlFolder.acquire(WAKELOCK_OPERATION_MAX);
wlFolder.acquire(Helper.WAKELOCK_MAX);
String old = e.getFolder().getFullName();
String name = e.getNewFolder().getFullName();
@ -1725,32 +1742,36 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
if (count != 0)
reload(ServiceSynchronize.this, account.id, false, "folder renamed");
} finally {
if (!wlFolder.isHeld())
Log.e("folder renamed released");
wlFolder.release();
if (wlFolder.isHeld())
wlFolder.release();
else
Log.e("folder renamed released elapse=" + (new Date().getTime() - start));
}
}
@Override
public void folderDeleted(FolderEvent e) {
long start = new Date().getTime();
try {
wlFolder.acquire(WAKELOCK_OPERATION_MAX);
wlFolder.acquire(Helper.WAKELOCK_MAX);
String name = e.getFolder().getFullName();
Log.i("Folder deleted=" + name);
if (db.folder().getFolderByName(account.id, name) != null)
reload(ServiceSynchronize.this, account.id, false, "folder deleted");
} finally {
if (!wlFolder.isHeld())
Log.e("folder deleted released");
wlFolder.release();
if (wlFolder.isHeld())
wlFolder.release();
else
Log.e("folder deleted released elapse=" + (new Date().getTime() - start));
}
}
@Override
public void folderChanged(FolderEvent e) {
long start = new Date().getTime();
try {
wlFolder.acquire(WAKELOCK_OPERATION_MAX);
wlFolder.acquire(Helper.WAKELOCK_MAX);
String name = e.getFolder().getFullName();
EntityLog.log(ServiceSynchronize.this, EntityLog.Type.Account, account,
@ -1759,9 +1780,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
if (folder != null && folder.selectable)
EntityOperation.sync(ServiceSynchronize.this, folder.id, false);
} finally {
if (!wlFolder.isHeld())
Log.e("folder changed released");
wlFolder.release();
if (wlFolder.isHeld())
wlFolder.release();
else
Log.e("folder changed released elapse=" + (new Date().getTime() - start));
}
}
});
@ -1870,8 +1892,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
ifolder.addMessageCountListener(new MessageCountAdapter() {
@Override
public void messagesAdded(MessageCountEvent e) {
long start = new Date().getTime();
try {
wlMessage.acquire(WAKELOCK_OPERATION_MAX * e.getMessages().length);
wlMessage.acquire(Helper.WAKELOCK_MAX);
fetch(folder, ifolder, e.getMessages(), false, false, "added");
Thread.sleep(FETCH_YIELD_DURATION);
} catch (Throwable ex) {
@ -1880,16 +1903,18 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
account.name + "/" + folder.name + " added " + Log.formatThrowable(ex, false));
EntityOperation.sync(ServiceSynchronize.this, folder.id, false);
} finally {
if (!wlMessage.isHeld())
Log.e("message added released");
wlMessage.release();
if (wlMessage.isHeld())
wlMessage.release();
else
Log.e("message added released elapse=" + (new Date().getTime() - start));
}
}
@Override
public void messagesRemoved(MessageCountEvent e) {
long start = new Date().getTime();
try {
wlMessage.acquire(WAKELOCK_OPERATION_MAX * e.getMessages().length);
wlMessage.acquire(Helper.WAKELOCK_MAX);
fetch(folder, ifolder, e.getMessages(), false, true, "removed");
Thread.sleep(FETCH_YIELD_DURATION);
} catch (Throwable ex) {
@ -1898,9 +1923,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
account.name + "/" + folder.name + " removed " + Log.formatThrowable(ex, false));
EntityOperation.sync(ServiceSynchronize.this, folder.id, false);
} finally {
if (!wlMessage.isHeld())
Log.e("message removed released");
wlMessage.release();
if (wlMessage.isHeld())
wlMessage.release();
else
Log.e("message removed released elapse=" + (new Date().getTime() - start));
}
}
});
@ -1911,8 +1937,9 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
ifolder.addMessageChangedListener(new MessageChangedListener() {
@Override
public void messageChanged(MessageChangedEvent e) {
long start = new Date().getTime();
try {
wlMessage.acquire(WAKELOCK_OPERATION_MAX);
wlMessage.acquire(Helper.WAKELOCK_MAX);
Message imessage = e.getMessage();
fetch(folder, ifolder, new Message[]{imessage}, true, false, "changed");
Thread.sleep(FETCH_YIELD_DURATION);
@ -1922,9 +1949,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
account.name + "/" + folder.name + " changed " + Log.formatThrowable(ex, false));
EntityOperation.sync(ServiceSynchronize.this, folder.id, false);
} finally {
if (!wlMessage.isHeld())
Log.e("message changed released");
wlMessage.release();
if (wlMessage.isHeld())
wlMessage.release();
else
Log.e("message changed released elapse=" + (new Date().getTime() - start));
}
}
});
@ -2113,58 +2141,16 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
public void run() {
super.run();
long timeout = 0;
boolean op_wakelock = prefs.getBoolean("op_wakelock", false);
long start = new Date().getTime();
try {
wlOperations.acquire(Helper.WAKELOCK_MAX);
List<TupleOperationEx> partition;
synchronized (partitions) {
partition = partitions.get(key);
partitions.remove(key);
}
// Estimate maximum execution duration
if (mapFolders.get(folder) == null) {
// Connect, sync folder list -> 3 minutes
timeout += WAKELOCK_ACCOUNT_MAX;
}
for (TupleOperationEx op : partition)
if (EntityOperation.SYNC.equals(op.name))
if (folder.last_sync == null ||
(folder.initialize != 0 &&
account.protocol == EntityAccount.TYPE_IMAP)) {
// 30 days -> 20 hours
int hours = (folder.initialize == 0 ? 30 : folder.initialize) * 24;
timeout += WAKELOCK_OPERATION_MAX * hours * MESSAGES_HOUR_AVG;
} else {
long hours = (start - folder.last_sync) / (3600 * 1000L) + 1;
// 10 messages/hour -> 100 seconds
timeout += WAKELOCK_OPERATION_MAX * hours * MESSAGES_HOUR_AVG;
}
else if (EntityOperation.ADD.equals(op.name) ||
EntityOperation.BODY.equals(op.name) ||
EntityOperation.ATTACHMENT.equals(op.name) ||
EntityOperation.RAW.equals(op.name) ||
(EntityOperation.FETCH.equals(op.name) && folder.download))
timeout += WAKELOCK_CONTENT_MAX; // -> 10 minutes
else if (EntityOperation.MOVE.equals(op.name) ||
EntityOperation.COPY.equals(op.name))
timeout += WAKELOCK_OPERATION_MAX * 2; // -> 20 seconds
else
timeout += WAKELOCK_OPERATION_MAX; // -> 10 seconds
if (op_wakelock)
wlOperations.acquire(timeout);
else
wlOperations.acquire();
Log.i(account.name + "/" + folder.name +
" executing partition=" + key +
" serial=" + serial +
" operations=" + partition.size() +
" wakelock=" + (timeout / 1000) + "s");
Map<String, String> crumb = new HashMap<>();
crumb.put("account", folder.account == null ? null : Long.toString(folder.account));
crumb.put("folder", folder.name + "/" + folder.type + ":" + folder.id);
@ -2291,17 +2277,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
Log.e(ex);
} finally {
long elapsed = new Date().getTime() - start;
if (!wlOperations.isHeld() || elapsed > timeout) {
String msg = key + " released" +
" elapsed=" + elapsed +
" timeout=" + timeout +
" enforced=" + op_wakelock +
" held=" + wlOperations.isHeld() +
" host=" + account.host;
Log.e(msg);
EntityLog.log(ServiceSynchronize.this, EntityLog.Type.Debug, msg);
}
wlOperations.release();
if (wlOperations.isHeld())
wlOperations.release();
else
Log.e(key + " released elapse=" + (new Date().getTime() - start));
}
}
});
@ -2483,16 +2462,18 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
AlarmManagerCompatEx.setAndAllowWhileIdle(ServiceSynchronize.this, am, AlarmManager.RTC_WAKEUP, trigger, pi);
try {
if (!wlAccount.isHeld())
Log.e("keeping alive released");
wlAccount.release();
if (wlAccount.isHeld())
wlAccount.release();
else
Log.e("keeping alive released elapse=" + (new Date().getTime() - start));
state.acquire(2 * duration, false);
Log.i("### " + account.name + " keeping alive");
} catch (InterruptedException ex) {
EntityLog.log(this, EntityLog.Type.Account, account,
account.name + " waited state=" + state);
} finally {
wlAccount.acquire(WAKELOCK_ACCOUNT_MAX);
start = new Date().getTime();
wlAccount.acquire(Helper.WAKELOCK_MAX);
}
} finally {
am.cancel(pi);
@ -2737,15 +2718,17 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
try {
db.account().setAccountBackoff(account.id, trigger);
if (!wlAccount.isHeld())
Log.e("backoff released");
wlAccount.release();
if (wlAccount.isHeld())
wlAccount.release();
else
Log.e("backoff released elapse=" + (new Date().getTime() - start));
state.acquire(2 * backoff * 1000L, true);
Log.i("### " + account.name + " backoff done");
} catch (InterruptedException ex) {
Log.w(account.name + " backoff " + ex.toString());
} finally {
wlAccount.acquire(WAKELOCK_ACCOUNT_MAX);
start = new Date().getTime();
wlAccount.acquire(Helper.WAKELOCK_MAX);
db.account().setAccountBackoff(account.id, null);
}
} finally {
@ -2762,9 +2745,10 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
} finally {
EntityLog.log(this, EntityLog.Type.Account, account,
account.name + " stopped running=" + state.isRunning());
if (!wlAccount.isHeld())
Log.e("account released");
wlAccount.release();
if (wlAccount.isHeld())
wlAccount.release();
else
Log.e("account released elapse=" + (new Date().getTime() - start));
}
}

View File

@ -70,7 +70,6 @@ public abstract class SimpleTask<T> implements LifecycleObserver {
private static Context themedContext = null;
private static final List<SimpleTask> tasks = new ArrayList<>();
private static final int MAX_WAKELOCK = 30 * 60 * 1000; // milliseconds
private static final int REPORT_AFTER = 15 * 60 * 1000; // milliseconds
static final String ACTION_TASK_COUNT = BuildConfig.APPLICATION_ID + ".ACTION_TASK_COUNT";
@ -198,15 +197,15 @@ public abstract class SimpleTask<T> implements LifecycleObserver {
@Override
public void run() {
// Run in background thread
long start = new Date().getTime();
try {
if (keepawake)
wl.acquire();
else
wl.acquire(MAX_WAKELOCK);
wl.acquire(Helper.WAKELOCK_MAX);
if (log)
Log.i("Executing task=" + name);
long start = new Date().getTime();
data = onExecute(tcontext, args);
elapsed = new Date().getTime() - start;
if (log)
@ -220,6 +219,8 @@ public abstract class SimpleTask<T> implements LifecycleObserver {
} finally {
if (wl.isHeld())
wl.release();
else if (!keepawake)
Log.e(name + " released elapse=" + (new Date().getTime() - start));
}
// Run on UI thread

View File

@ -1497,17 +1497,6 @@
app:layout_constraintTop_toBottomOf="@id/tvLogarithmicBackoffHint"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swOpWakelock"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_advanced_op_wakelock"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swExactAlarms"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swInfra"
android:layout_width="0dp"
@ -1516,7 +1505,7 @@
android:text="@string/title_advanced_infra"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swOpWakelock"
app:layout_constraintTop_toBottomOf="@id/swExactAlarms"
app:switchPadding="12dp" />
<androidx.constraintlayout.helper.widget.Flow

View File

@ -814,7 +814,6 @@
<string name="title_advanced_keep_alive_poll" translatable="false">Poll on keep-alive</string>
<string name="title_advanced_empty_pool" translatable="false">Empty connection pool</string>
<string name="title_advanced_exact_alarms" translatable="false">Use exact timers</string>
<string name="title_advanced_op_wakelock" translatable="false">Operation wakelock timeout</string>
<string name="title_advanced_infra" translatable="false">Show infrastructure</string>
<string name="title_advanced_dup_msgid" translatable="false">Duplicates by message ID</string>
<string name="title_advanced_global_keywords" translatable="false">Global keywords</string>