From 04ffff0953f84154964191ea89a12ae8e52b9b25 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 9 Aug 2018 12:46:53 -0300 Subject: [PATCH 1/4] Screen Lock: Lock after customizable inactivity timeout --- .../briar/android/BriarService.java | 7 +++ .../android/account/LockManagerImpl.java | 50 +++++++++++++++++++ .../briar/android/activity/BriarActivity.java | 12 +++++ .../android/settings/SettingsFragment.java | 22 +++++++- .../briar/api/android/LockManager.java | 17 +++++++ briar-android/src/main/res/values/arrays.xml | 19 +++++++ briar-android/src/main/res/values/strings.xml | 9 ++++ briar-android/src/main/res/xml/settings.xml | 13 ++++- 8 files changed, 146 insertions(+), 3 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java index 7aa0371fe..05d9a5012 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java @@ -26,6 +26,7 @@ import org.briarproject.briar.R; import org.briarproject.briar.android.logout.HideUiActivity; import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.briarproject.briar.api.android.AndroidNotificationManager; +import org.briarproject.briar.api.android.LockManager; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; @@ -54,6 +55,7 @@ import static org.briarproject.briar.api.android.AndroidNotificationManager.FAIL import static org.briarproject.briar.api.android.AndroidNotificationManager.FAILURE_NOTIFICATION_ID; import static org.briarproject.briar.api.android.AndroidNotificationManager.ONGOING_CHANNEL_ID; import static org.briarproject.briar.api.android.AndroidNotificationManager.ONGOING_NOTIFICATION_ID; +import static org.briarproject.briar.api.android.LockManager.ACTION_LOCK; public class BriarService extends Service { @@ -77,6 +79,8 @@ public class BriarService extends Service { AndroidNotificationManager notificationManager; @Inject AccountManager accountManager; + @Inject + LockManager lockManager; // Fields that are accessed from background threads must be volatile @Inject @@ -189,6 +193,9 @@ public class BriarService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { + if (ACTION_LOCK.equals(intent.getAction())) { + lockManager.setLocked(true); + } return START_NOT_STICKY; // Don't restart automatically if killed } 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 562ea9588..5b9ae87f8 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 @@ -1,9 +1,12 @@ package org.briarproject.briar.android.account; +import android.app.AlarmManager; import android.app.Application; +import android.app.PendingIntent; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.MutableLiveData; import android.content.Context; +import android.content.Intent; import android.support.annotation.UiThread; import org.briarproject.bramble.api.db.DatabaseExecutor; @@ -16,6 +19,8 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.SettingsManager; import org.briarproject.bramble.api.settings.event.SettingsUpdatedEvent; +import org.briarproject.briar.R; +import org.briarproject.briar.android.BriarService; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.LockManager; @@ -25,9 +30,15 @@ import java.util.logging.Logger; import javax.annotation.concurrent.ThreadSafe; import javax.inject.Inject; +import static android.app.AlarmManager.ELAPSED_REALTIME; +import static android.app.PendingIntent.getService; +import static android.content.Context.ALARM_SERVICE; +import static android.os.SystemClock.elapsedRealtime; +import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.briar.android.settings.SettingsFragment.PREF_SCREEN_LOCK; +import static org.briarproject.briar.android.settings.SettingsFragment.PREF_SCREEN_LOCK_TIMEOUT; import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; import static org.briarproject.briar.android.util.UiUtils.hasScreenLock; @@ -44,9 +55,14 @@ public class LockManagerImpl implements LockManager, Service, EventListener { private final AndroidNotificationManager notificationManager; @DatabaseExecutor private final Executor dbExecutor; + private final AlarmManager alarmManager; + private final PendingIntent lockIntent; + private final int timeoutNever, timeoutDefault; private volatile boolean locked = false; private volatile boolean lockableSetting = false; + private volatile int timeoutMinutes; + private int activitiesRunning = 0; private final MutableLiveData lockable = new MutableLiveData<>(); @Inject @@ -57,6 +73,16 @@ public class LockManagerImpl implements LockManager, Service, EventListener { this.settingsManager = settingsManager; this.notificationManager = notificationManager; this.dbExecutor = dbExecutor; + this.alarmManager = + (AlarmManager) appContext.getSystemService(ALARM_SERVICE); + Intent i = + new Intent(ACTION_LOCK, null, appContext, BriarService.class); + this.lockIntent = getService(appContext, 0, i, 0); + this.timeoutNever = Integer.valueOf( + appContext.getString(R.string.pref_lock_timeout_value_never)); + this.timeoutDefault = Integer.valueOf( + appContext.getString(R.string.pref_lock_timeout_value_default)); + this.timeoutMinutes = timeoutNever; // setting this in the constructor makes #getValue() @NonNull this.lockable.setValue(false); @@ -72,6 +98,26 @@ public class LockManagerImpl implements LockManager, Service, EventListener { public void stopService() { } + @UiThread + @Override + public void onActivityStart() { + activitiesRunning++; + alarmManager.cancel(lockIntent); + } + + @UiThread + @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); + } + } + @Override public LiveData isLockable() { return lockable; @@ -118,9 +164,13 @@ public class LockManagerImpl implements LockManager, Service, EventListener { try { Settings settings = settingsManager.getSettings(SETTINGS_NAMESPACE); + // is the app lockable? lockableSetting = settings.getBoolean(PREF_SCREEN_LOCK, false); boolean newValue = hasScreenLock(appContext) && lockableSetting; lockable.postValue(newValue); + // what is the timeout in minutes? + timeoutMinutes = settings.getInt(PREF_SCREEN_LOCK_TIMEOUT, + timeoutDefault); } catch (DbException e) { logException(LOG, WARNING, e); lockableSetting = false; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java index 77c6b4132..292325ae8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java @@ -53,6 +53,12 @@ public abstract class BriarActivity extends BaseActivity { @Inject protected LockManager lockManager; + @Override + public void onStart() { + super.onStart(); + lockManager.onActivityStart(); + } + @Override protected void onActivityResult(int request, int result, Intent data) { super.onActivityResult(request, result, data); @@ -97,6 +103,12 @@ public abstract class BriarActivity extends BaseActivity { } } + @Override + protected void onStop() { + super.onStop(); + lockManager.onActivityStop(); + } + public void setSceneTransitionAnimation() { if (SDK_INT < 21) return; // workaround for #1007 diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java index 1f52854f3..5a7efc830 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java @@ -15,6 +15,7 @@ import android.support.v4.content.ContextCompat; import android.support.v4.text.TextUtilsCompat; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; +import android.support.v7.preference.Preference.OnPreferenceChangeListener; import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.preference.PreferenceGroup; import android.view.LayoutInflater; @@ -105,13 +106,15 @@ import static org.briarproject.briar.api.android.AndroidNotificationManager.PREF @MethodsNotNullByDefault @ParametersNotNullByDefault public class SettingsFragment extends PreferenceFragmentCompat - implements EventListener, Preference.OnPreferenceChangeListener { + implements EventListener, OnPreferenceChangeListener { public static final String SETTINGS_NAMESPACE = "android-ui"; public static final String BT_NAMESPACE = BluetoothConstants.ID.getString(); public static final String TOR_NAMESPACE = TorConstants.ID.getString(); public static final String LANGUAGE = "pref_key_language"; public static final String PREF_SCREEN_LOCK = "pref_key_lock"; + public static final String PREF_SCREEN_LOCK_TIMEOUT = + "pref_key_lock_timeout"; public static final String NOTIFY_SIGN_IN = "pref_key_notify_sign_in"; public static final String TOR_LOCATION = "pref_key_tor_location"; @@ -124,6 +127,7 @@ public class SettingsFragment extends PreferenceFragmentCompat private ListPreference torNetwork; private SwitchPreference torBlocked; private SwitchPreference screenLock; + private ListPreference screenLockTimeout; private SwitchPreference notifyPrivateMessages; private SwitchPreference notifyGroupMessages; private SwitchPreference notifyForumPosts; @@ -166,6 +170,8 @@ public class SettingsFragment extends PreferenceFragmentCompat SwitchPreference notifySignIn = (SwitchPreference) findPreference(NOTIFY_SIGN_IN); screenLock = (SwitchPreference) findPreference(PREF_SCREEN_LOCK); + screenLockTimeout = + (ListPreference) findPreference(PREF_SCREEN_LOCK_TIMEOUT); notifyPrivateMessages = (SwitchPreference) findPreference( "pref_key_notify_private_messages"); notifyGroupMessages = (SwitchPreference) findPreference( @@ -203,6 +209,7 @@ public class SettingsFragment extends PreferenceFragmentCompat torNetwork.setOnPreferenceChangeListener(this); torBlocked.setOnPreferenceChangeListener(this); screenLock.setOnPreferenceChangeListener(this); + screenLockTimeout.setOnPreferenceChangeListener(this); if (SDK_INT >= 21) { notifyLockscreen.setVisible(true); notifyLockscreen.setOnPreferenceChangeListener(this); @@ -224,6 +231,7 @@ public class SettingsFragment extends PreferenceFragmentCompat theme.setVisible(FEATURE_FLAG_DARK_THEME); notifySignIn.setVisible(FEATURE_FLAG_SIGN_IN_REMINDER); screenLock.setVisible(FEATURE_FLAG_PIN_LOCK); + screenLockTimeout.setVisible(FEATURE_FLAG_PIN_LOCK); findPreference("pref_key_explode").setVisible(false); findPreference("pref_key_test_data").setVisible(false); @@ -419,6 +427,7 @@ public class SettingsFragment extends PreferenceFragmentCompat // - pref_key_notify_sign_in // preferences partly needed here, because they have their own logic // - pref_key_lock (screenLock -> displayScreenLockSetting()) + // - pref_key_lock_timeout (screenLockTimeout) enableBluetooth.setEnabled(enabled); torNetwork.setEnabled(enabled); torBlocked.setEnabled(enabled); @@ -435,6 +444,7 @@ public class SettingsFragment extends PreferenceFragmentCompat private void displayScreenLockSetting() { if (SDK_INT < 21) { screenLock.setVisible(false); + screenLockTimeout.setVisible(false); } else { if (getActivity() != null && hasScreenLock(getActivity())) { screenLock.setEnabled(true); @@ -446,6 +456,11 @@ public class SettingsFragment extends PreferenceFragmentCompat screenLock.setChecked(false); screenLock.setSummary(R.string.pref_lock_disabled_summary); } + // timeout depends on screenLock and gets disabled automatically + int timeout = settings.getInt(PREF_SCREEN_LOCK_TIMEOUT, + Integer.valueOf(getString( + R.string.pref_lock_timeout_value_default))); + screenLockTimeout.setValue(String.valueOf(timeout)); } } @@ -508,6 +523,11 @@ public class SettingsFragment extends PreferenceFragmentCompat Settings s = new Settings(); s.putBoolean(PREF_SCREEN_LOCK, (Boolean) newValue); storeSettings(s); + } else if (preference == screenLockTimeout) { + Settings s = new Settings(); + s.putInt(PREF_SCREEN_LOCK_TIMEOUT, + Integer.valueOf((String) newValue)); + storeSettings(s); } else if (preference == notifyPrivateMessages) { Settings s = new Settings(); s.putBoolean(PREF_NOTIFY_PRIVATE, (Boolean) newValue); diff --git a/briar-android/src/main/java/org/briarproject/briar/api/android/LockManager.java b/briar-android/src/main/java/org/briarproject/briar/api/android/LockManager.java index 968d4e522..d4255abb7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/api/android/LockManager.java +++ b/briar-android/src/main/java/org/briarproject/briar/api/android/LockManager.java @@ -1,10 +1,27 @@ package org.briarproject.briar.api.android; +import android.app.Activity; import android.arch.lifecycle.LiveData; import android.support.annotation.UiThread; public interface LockManager { + String ACTION_LOCK = "lock"; + + /** + * Stops the inactivity timer when the user interacts with the app. + * Should typically be called by {@link Activity#onStart()} + */ + @UiThread + void onActivityStart(); + + /** + * Starts the inactivity timer which will lock the app. + * Should typically be called by {@link Activity#onStop()} + */ + @UiThread + void onActivityStop(); + /** * Returns an observable LiveData to indicate whether the app can be locked. */ diff --git a/briar-android/src/main/res/values/arrays.xml b/briar-android/src/main/res/values/arrays.xml index d4001a3c9..5c0a98fab 100644 --- a/briar-android/src/main/res/values/arrays.xml +++ b/briar-android/src/main/res/values/arrays.xml @@ -67,4 +67,23 @@ @string/pref_theme_auto_value @string/pref_theme_system_value + + + @string/pref_lock_timeout_never + @string/pref_lock_timeout_1 + @string/pref_lock_timeout_5 + @string/pref_lock_timeout_15 + @string/pref_lock_timeout_30 + @string/pref_lock_timeout_60 + + 5 + -1 + + @string/pref_lock_timeout_value_never + 1 + 5 + 15 + 30 + 60 + diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 45c9ce6e7..fecb77032 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -360,6 +360,15 @@ Screen Lock Use the device\'s screen lock to protect Briar while signed in Set up a screen lock for your device to protect Briar while signed in + Screen Lock Inactivity Timeout + When not using Briar, automatically lock it %s + never + after 1 Minute + after 5 Minutes + after 15 Minutes + after 30 Minutes + after 1 Hour + Change password Current password New password diff --git a/briar-android/src/main/res/xml/settings.xml b/briar-android/src/main/res/xml/settings.xml index 1238f65e9..5faaebbd2 100644 --- a/briar-android/src/main/res/xml/settings.xml +++ b/briar-android/src/main/res/xml/settings.xml @@ -60,8 +60,17 @@ android:key="pref_key_lock" android:persistent="false" android:summary="@string/pref_lock_summary" - android:title="@string/pref_lock_title" - android:enabled="false"/> + android:title="@string/pref_lock_title"/> + + Date: Tue, 14 Aug 2018 17:06:41 -0300 Subject: [PATCH 2/4] Use a dedicated summary for 'never lock Briar' for proper English --- .../android/settings/SettingsFragment.java | 20 ++++++++++++++++--- briar-android/src/main/res/values/strings.xml | 4 +++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java index 5a7efc830..220d131e2 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java @@ -460,7 +460,20 @@ public class SettingsFragment extends PreferenceFragmentCompat int timeout = settings.getInt(PREF_SCREEN_LOCK_TIMEOUT, Integer.valueOf(getString( R.string.pref_lock_timeout_value_default))); - screenLockTimeout.setValue(String.valueOf(timeout)); + String newValue = String.valueOf(timeout); + screenLockTimeout.setValue(newValue); + setScreenLockTimeoutSummary(newValue); + } + } + + private void setScreenLockTimeoutSummary(String timeout) { + String never = getString(R.string.pref_lock_timeout_value_never); + if (timeout.equals(never)) { + screenLockTimeout + .setSummary(R.string.pref_lock_timeout_never_summary); + } else { + screenLockTimeout + .setSummary(R.string.pref_lock_timeout_summary); } } @@ -525,9 +538,10 @@ public class SettingsFragment extends PreferenceFragmentCompat storeSettings(s); } else if (preference == screenLockTimeout) { Settings s = new Settings(); - s.putInt(PREF_SCREEN_LOCK_TIMEOUT, - Integer.valueOf((String) newValue)); + String value = (String) newValue; + s.putInt(PREF_SCREEN_LOCK_TIMEOUT, Integer.valueOf(value)); storeSettings(s); + setScreenLockTimeoutSummary(value); } else if (preference == notifyPrivateMessages) { Settings s = new Settings(); s.putBoolean(PREF_NOTIFY_PRIVATE, (Boolean) newValue); diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index fecb77032..2ab8490c5 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -361,13 +361,15 @@ Use the device\'s screen lock to protect Briar while signed in Set up a screen lock for your device to protect Briar while signed in Screen Lock Inactivity Timeout + When not using Briar, automatically lock it %s - never after 1 Minute after 5 Minutes after 15 Minutes after 30 Minutes after 1 Hour + never + Never lock Briar automatically Change password Current password From 825ed451a3d0c157b9b9524f442b881d3f0af3ca Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 14 Aug 2018 17:50:51 -0300 Subject: [PATCH 3/4] Screen lock: Add a fallback in case alarm manager didn't run during sleep --- .../android/account/LockManagerImpl.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) 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); + } + } From d64252aaf3d38d799843ba976b3720cc377afc78 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 15 Aug 2018 10:15:31 -0300 Subject: [PATCH 4/4] Screen Lock Timeout: Address review comments --- .../android/account/LockManagerImpl.java | 17 ++++++++--- briar-android/src/main/res/values/strings.xml | 28 +++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) 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 e0e7ebc15..494c0033b 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,11 +63,15 @@ public class LockManagerImpl implements LockManager, Service, EventListener { private volatile boolean lockableSetting = false; private volatile int timeoutMinutes; private int activitiesRunning = 0; + private boolean alarmSet = false; + // This is to ensure that we don't start unlocked after a timeout and thus + // is set to the elapsed real time when no more activities are running. + // Its value is only relevant as long as no activity is running. private long idleTime; private final MutableLiveData lockable = new MutableLiveData<>(); @Inject - public LockManagerImpl(Application app, SettingsManager settingsManager, + LockManagerImpl(Application app, SettingsManager settingsManager, AndroidNotificationManager notificationManager, @DatabaseExecutor Executor dbExecutor) { this.appContext = app.getApplicationContext(); @@ -108,7 +112,10 @@ public class LockManagerImpl implements LockManager, Service, EventListener { setLocked(true); } activitiesRunning++; - alarmManager.cancel(lockIntent); + if (alarmSet) { + alarmManager.cancel(lockIntent); + alarmSet = false; + } } @UiThread @@ -118,10 +125,11 @@ public class LockManagerImpl implements LockManager, Service, EventListener { if (activitiesRunning == 0) { idleTime = elapsedRealtime(); if (!locked && timeoutEnabled()) { - alarmManager.cancel(lockIntent); + if (alarmSet) alarmManager.cancel(lockIntent); long triggerAt = elapsedRealtime() + MINUTES.toMillis(timeoutMinutes); alarmManager.set(ELAPSED_REALTIME, triggerAt, lockIntent); + alarmSet = true; } } } @@ -146,7 +154,8 @@ public class LockManagerImpl implements LockManager, Service, EventListener { if (locked && !hasScreenLock(appContext)) { lockable.postValue(false); locked = false; - } else if (!locked && activitiesRunning == 0 && timeoutEnabled()) { + } else if (!locked && activitiesRunning == 0 && timeoutEnabled() && + timedOut()) { setLocked(true); } return locked; diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 2ab8490c5..33536126b 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -62,6 +62,7 @@ Private Groups Forums Blogs + Lock App Settings Sign Out @@ -357,18 +358,23 @@ Security - Screen Lock + Screen lock Use the device\'s screen lock to protect Briar while signed in - Set up a screen lock for your device to protect Briar while signed in - Screen Lock Inactivity Timeout - - When not using Briar, automatically lock it %s - after 1 Minute - after 5 Minutes - after 15 Minutes - after 30 Minutes - after 1 Hour - never + To use this feature, set up a screen lock for your device + Screen lock inactivity timeout + + When not using Briar, automatically lock it after %s + + 1 minute + + 5 minutes + + 15 minutes + + 30 minutes + + 1 hour + Never Never lock Briar automatically Change password