diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java index 5b9ae87f8..e0e7ebc15 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java @@ -63,6 +63,7 @@ public class LockManagerImpl implements LockManager, Service, EventListener { private volatile boolean lockableSetting = false; private volatile int timeoutMinutes; private int activitiesRunning = 0; + private long idleTime; private final MutableLiveData lockable = new MutableLiveData<>(); @Inject @@ -101,6 +102,11 @@ public class LockManagerImpl implements LockManager, Service, EventListener { @UiThread @Override public void onActivityStart() { + if (!locked && activitiesRunning == 0 && timeoutEnabled() && + timedOut()) { + // lock the app in case the alarm wasn't run during sleep + setLocked(true); + } activitiesRunning++; alarmManager.cancel(lockIntent); } @@ -109,12 +115,14 @@ public class LockManagerImpl implements LockManager, Service, EventListener { @Override public void onActivityStop() { activitiesRunning--; - if (activitiesRunning == 0 && !locked && - timeoutMinutes != timeoutNever && lockable.getValue()) { - alarmManager.cancel(lockIntent); - long triggerAt = - elapsedRealtime() + MINUTES.toMillis(timeoutMinutes); - alarmManager.set(ELAPSED_REALTIME, triggerAt, lockIntent); + if (activitiesRunning == 0) { + idleTime = elapsedRealtime(); + if (!locked && timeoutEnabled()) { + alarmManager.cancel(lockIntent); + long triggerAt = + elapsedRealtime() + MINUTES.toMillis(timeoutMinutes); + alarmManager.set(ELAPSED_REALTIME, triggerAt, lockIntent); + } } } @@ -138,6 +146,8 @@ public class LockManagerImpl implements LockManager, Service, EventListener { if (locked && !hasScreenLock(appContext)) { lockable.postValue(false); locked = false; + } else if (!locked && activitiesRunning == 0 && timeoutEnabled()) { + setLocked(true); } return locked; } @@ -179,4 +189,12 @@ public class LockManagerImpl implements LockManager, Service, EventListener { }); } + private boolean timeoutEnabled() { + return timeoutMinutes != timeoutNever && lockable.getValue(); + } + + private boolean timedOut() { + return elapsedRealtime() - idleTime > MINUTES.toMillis(timeoutMinutes); + } + }