From d79f1b667a3b81bd4ebd85d938c1b198749635e7 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 6 Aug 2018 18:14:34 -0300 Subject: [PATCH] Move app locking logic into dedicatd LockManager --- .../bramble/api/account/AccountManager.java | 4 - .../bramble/account/AccountManagerImpl.java | 13 -- .../bramble/account/BriarAccountManager.java | 12 +- .../briar/android/AndroidComponent.java | 3 + .../AndroidNotificationManagerImpl.java | 3 +- .../briarproject/briar/android/AppModule.java | 10 ++ .../android/account/LockManagerImpl.java | 124 ++++++++++++++++++ .../briar/android/activity/BriarActivity.java | 11 +- .../android/controller/BriarController.java | 2 - .../controller/BriarControllerImpl.java | 5 - .../briar/android/login/UnlockActivity.java | 7 +- .../android/navdrawer/NavDrawerActivity.java | 17 +-- .../navdrawer/NavDrawerController.java | 4 - .../navdrawer/NavDrawerControllerImpl.java | 26 +--- .../android/settings/SettingsFragment.java | 4 + .../android/splash/SplashScreenActivity.java | 5 +- .../briar/android/util/UiUtils.java | 3 +- .../briar/api/android/LockManager.java | 17 +++ 18 files changed, 184 insertions(+), 86 deletions(-) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/api/android/LockManager.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java index 45fd48c14..2e1b5a951 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/account/AccountManager.java @@ -67,8 +67,4 @@ public interface AccountManager { * and stored. */ boolean changePassword(String oldPassword, String newPassword); - - boolean isLocked(); - - void setLocked(boolean locked); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java index 2ebc34e19..7eda4688b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/account/AccountManagerImpl.java @@ -45,7 +45,6 @@ class AccountManagerImpl implements AccountManager { @Nullable private volatile SecretKey databaseKey = null; - private volatile boolean locked = false; @Inject AccountManagerImpl(DatabaseConfig databaseConfig, CryptoComponent crypto, @@ -219,16 +218,4 @@ class AccountManagerImpl implements AccountManager { return key != null && encryptAndStoreDatabaseKey(key, newPassword); } } - - @Override - public boolean isLocked() { - return locked; - } - - @Override - public void setLocked(boolean locked) { - synchronized (stateChangeLock) { - this.locked = locked; - } - } } diff --git a/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java b/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java index 00bc97430..eb1e2faaa 100644 --- a/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java +++ b/briar-android/src/main/java/org/briarproject/bramble/account/BriarAccountManager.java @@ -9,26 +9,16 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.briar.R; import org.briarproject.briar.android.Localizer; import org.briarproject.briar.android.util.UiUtils; -import org.briarproject.briar.api.android.AndroidNotificationManager; import javax.inject.Inject; class BriarAccountManager extends AndroidAccountManager { - private final AndroidNotificationManager notificationManager; - @Inject BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto, IdentityManager identityManager, SharedPreferences prefs, - Application app, AndroidNotificationManager notificationManager) { + Application app) { super(databaseConfig, crypto, identityManager, prefs, app); - this.notificationManager = notificationManager; - } - - @Override - public void setLocked(boolean locked) { - super.setLocked(locked); - notificationManager.updateForegroundNotification(true, locked); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java index 75b25b099..e531f295c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java @@ -28,6 +28,7 @@ import org.briarproject.briar.android.login.SignInReminderReceiver; import org.briarproject.briar.android.reporting.BriarReportSender; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.DozeWatchdog; +import org.briarproject.briar.api.android.LockManager; import org.briarproject.briar.api.android.ScreenFilterMonitor; import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.blog.BlogPostFactory; @@ -146,6 +147,8 @@ public interface AndroidComponent AccountManager accountManager(); + LockManager lockManager(); + void inject(SignInReminderReceiver briarService); void inject(BriarService briarService); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java index 8bedb0173..1ec11455d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java @@ -177,8 +177,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, nc.setLockscreenVisibility(VISIBILITY_SECRET); nc.enableVibration(true); nc.enableLights(true); - nc.setLightColor( - getColor(appContext, R.color.briar_green_light)); + nc.setLightColor(getColor(appContext, R.color.briar_green_light)); notificationManager.createNotificationChannel(nc); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index 9f4ba2d14..c738b42e0 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -29,8 +29,10 @@ import org.briarproject.bramble.plugin.tor.AndroidTorPluginFactory; import org.briarproject.bramble.plugin.tor.CircumventionProvider; import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.bramble.util.StringUtils; +import org.briarproject.briar.android.account.LockManagerImpl; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.DozeWatchdog; +import org.briarproject.briar.api.android.LockManager; import org.briarproject.briar.api.android.ScreenFilterMonitor; import java.io.File; @@ -200,4 +202,12 @@ public class AppModule { return dozeWatchdog; } + @Provides + @Singleton + LockManager provideLockManager(LifecycleManager lifecycleManager, + LockManagerImpl lockManager) { + lifecycleManager.registerService(lockManager); + return lockManager; + } + } 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 new file mode 100644 index 000000000..82981e9c5 --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/LockManagerImpl.java @@ -0,0 +1,124 @@ +package org.briarproject.briar.android.account; + +import android.app.Application; +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.MutableLiveData; +import android.content.Context; + +import org.briarproject.bramble.api.db.DatabaseExecutor; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.lifecycle.Service; +import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; +import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; +import org.briarproject.bramble.api.settings.Settings; +import org.briarproject.bramble.api.settings.SettingsManager; +import org.briarproject.briar.api.android.AndroidNotificationManager; +import org.briarproject.briar.api.android.LockManager; + +import java.util.concurrent.Executor; +import java.util.logging.Logger; + +import javax.annotation.concurrent.ThreadSafe; +import javax.inject.Inject; + +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.SETTINGS_NAMESPACE; +import static org.briarproject.briar.android.util.UiUtils.hasScreenLock; + +@ThreadSafe +@MethodsNotNullByDefault +@ParametersNotNullByDefault +public class LockManagerImpl implements LockManager, Service { + + private static final Logger LOG = + Logger.getLogger(LockManagerImpl.class.getSimpleName()); + + private final Context appContext; + private final SettingsManager settingsManager; + private final AndroidNotificationManager notificationManager; + @DatabaseExecutor + private final Executor dbExecutor; + + private final MutableLiveData locked = new MutableLiveData<>(); + private final MutableLiveData lockable = new MutableLiveData<>(); + + @Inject + public LockManagerImpl(Application app, SettingsManager settingsManager, + AndroidNotificationManager notificationManager, + @DatabaseExecutor Executor dbExecutor) { + this.appContext = app.getApplicationContext(); + this.settingsManager = settingsManager; + this.notificationManager = notificationManager; + this.dbExecutor = dbExecutor; + + this.locked.setValue(false); + this.lockable.setValue(false); + } + + @Override + public void startService() { + lockable.observeForever(this::onLockableChanged); + if (hasScreenLock(appContext)) { + dbExecutor.execute(() -> { + try { + Settings settings = + settingsManager.getSettings(SETTINGS_NAMESPACE); + boolean lockable = + settings.getBoolean(PREF_SCREEN_LOCK, false); + this.lockable.postValue(lockable); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + } else { + lockable.postValue(false); + } + } + + @Override + public void stopService() { + lockable.removeObserver(this::onLockableChanged); + } + + private void onLockableChanged(boolean lockable) { + notificationManager + .updateForegroundNotification(lockable, locked.getValue()); + } + + @Override + public LiveData isLockable() { + return lockable; + } + + @Override + public void recheckLockable() { + boolean oldValue = this.lockable.getValue(); + boolean newValue = hasScreenLock(appContext) && lockable.getValue(); + if (oldValue != newValue) { + this.lockable.setValue(newValue); + } + } + + @Override + public void updateLockableSetting(boolean lockable) { + boolean oldValue = this.lockable.getValue(); + boolean newValue = hasScreenLock(appContext) && lockable; + if (oldValue != newValue) { + this.lockable.setValue(newValue); + } + } + + @Override + public LiveData isLocked() { + return locked; + } + + @Override + public void setLocked(boolean locked) { + this.locked.setValue(locked); + notificationManager + .updateForegroundNotification(lockable.getValue(), locked); + } +} 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 018803d0b..8bb7302f2 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 @@ -18,6 +18,7 @@ import org.briarproject.briar.android.controller.handler.UiResultHandler; import org.briarproject.briar.android.login.PasswordActivity; import org.briarproject.briar.android.login.UnlockActivity; import org.briarproject.briar.android.logout.ExitActivity; +import org.briarproject.briar.api.android.LockManager; import java.util.logging.Logger; @@ -46,10 +47,11 @@ public abstract class BriarActivity extends BaseActivity { @Inject BriarController briarController; - @Deprecated @Inject DbController dbController; + @Inject + protected LockManager lockManager; @Override protected void onActivityResult(int request, int result, Intent data) { @@ -68,7 +70,7 @@ public abstract class BriarActivity extends BaseActivity { if (!briarController.accountSignedIn() && !isFinishing()) { Intent i = new Intent(this, PasswordActivity.class); startActivityForResult(i, REQUEST_PASSWORD); - } else if(briarController.isLocked()) { + } else if(lockManager.isLocked().getValue()) { Intent i = new Intent(this, UnlockActivity.class); startActivityForResult(i, REQUEST_UNLOCK); } else if (SDK_INT >= 23) { @@ -82,6 +84,7 @@ public abstract class BriarActivity extends BaseActivity { } }); } + lockManager.recheckLockable(); } public void setSceneTransitionAnimation() { @@ -122,6 +125,10 @@ public abstract class BriarActivity extends BaseActivity { return toolbar; } + protected void onLockableChanged(boolean lockable) { + + } + protected void showDozeDialog(String message) { AlertDialog.Builder b = new AlertDialog.Builder(this, R.style.BriarDialogTheme); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java index 78c824b43..e4e60c692 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarController.java @@ -8,8 +8,6 @@ public interface BriarController extends ActivityLifecycleController { boolean accountSignedIn(); - boolean isLocked(); - /** * Returns true via the handler when the app has dozed * without being white-listed. diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java index f858bf05a..1271f4d21 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/BriarControllerImpl.java @@ -87,11 +87,6 @@ public class BriarControllerImpl implements BriarController { return accountManager.hasDatabaseKey(); } - @Override - public boolean isLocked() { - return accountManager.isLocked(); - } - @Override public void hasDozed(ResultHandler handler) { if (!dozeWatchdog.getAndResetDozeFlag() diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/UnlockActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/login/UnlockActivity.java index 16ff7d1fa..337a9598b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/login/UnlockActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/login/UnlockActivity.java @@ -15,6 +15,7 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BaseActivity; +import org.briarproject.briar.api.android.LockManager; import java.util.logging.Logger; @@ -33,6 +34,8 @@ public class UnlockActivity extends BaseActivity { @Inject AccountManager accountManager; + @Inject + LockManager lockManager; @Override public void injectActivity(ActivityComponent component) { @@ -48,7 +51,7 @@ public class UnlockActivity extends BaseActivity { Intent intent = getIntent(); if (intent != null && ACTION_LOCK.equals(intent.getAction())) { - accountManager.setLocked(true); + lockManager.setLocked(true); } else { requestKeyguardUnlock(); } @@ -80,7 +83,7 @@ public class UnlockActivity extends BaseActivity { } private void unlock() { - accountManager.setLocked(false); + lockManager.setLocked(false); setResult(RESULT_OK); ActivityCompat.finishAfterTransition(this); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java index 6750cba71..b23bee3af 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java @@ -42,7 +42,6 @@ import org.briarproject.briar.android.logout.SignOutFragment; import org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning; import org.briarproject.briar.android.privategroup.list.GroupListFragment; import org.briarproject.briar.android.settings.SettingsActivity; -import org.briarproject.briar.api.android.AndroidNotificationManager; import java.util.ArrayList; import java.util.List; @@ -61,7 +60,6 @@ import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSW import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.NO; import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.UPDATE; import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry; -import static org.briarproject.briar.android.util.UiUtils.hasScreenLock; public class NavDrawerActivity extends BriarActivity implements BaseFragmentListener, TransportStateListener, @@ -82,8 +80,6 @@ public class NavDrawerActivity extends BriarActivity implements NavDrawerController controller; @Inject LifecycleManager lifecycleManager; - @Inject - AndroidNotificationManager notificationManager; private DrawerLayout drawerLayout; private NavigationView navigation; @@ -141,6 +137,8 @@ public class NavDrawerActivity extends BriarActivity implements initializeTransports(getLayoutInflater()); transportsView.setAdapter(transportsAdapter); + lockManager.isLockable().observe(this, this::setLockVisible); + if (lifecycleManager.getLifecycleState().isAfter(RUNNING)) { showSignOutFragment(); } else if (state == null) { @@ -157,14 +155,6 @@ public class NavDrawerActivity extends BriarActivity implements public void onStart() { super.onStart(); updateTransports(); - if (hasScreenLock(this)) { - controller.isLockable(new UiResultHandler(this) { - @Override - public void onResultUi(@NonNull Boolean lockable) { - setLockVisible(lockable); - } - }); - } else setLockVisible(false); controller.showExpiryWarning(new UiResultHandler(this) { @Override public void onResultUi(ExpiryWarning expiry) { @@ -227,7 +217,7 @@ public class NavDrawerActivity extends BriarActivity implements drawerLayout.closeDrawer(START); clearBackStack(); if (item.getItemId() == R.id.nav_btn_lock) { - controller.lock(); + lockManager.setLocked(true); ActivityCompat.finishAfterTransition(this); return false; } else { @@ -323,7 +313,6 @@ public class NavDrawerActivity extends BriarActivity implements private void setLockVisible(boolean visible) { MenuItem item = navigation.getMenu().findItem(R.id.nav_btn_lock); if (item != null) item.setVisible(visible); - notificationManager.updateForegroundNotification(visible, false); } @SuppressWarnings("ConstantConditions") diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java index b1810c21b..d2d883e90 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerController.java @@ -14,10 +14,6 @@ public interface NavDrawerController extends ActivityLifecycleController { boolean isTransportRunning(TransportId transportId); - void isLockable(ResultHandler handler); - - void lock(); - void showExpiryWarning(ResultHandler handler); void expiryWarningDismissed(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java index cc35db491..2f851569c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerControllerImpl.java @@ -3,7 +3,6 @@ package org.briarproject.briar.android.navdrawer; import android.app.Activity; import android.content.Context; -import org.briarproject.bramble.api.account.AccountManager; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.event.Event; @@ -37,7 +36,6 @@ import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.NO; import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.SHOW; import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.UPDATE; -import static org.briarproject.briar.android.settings.SettingsFragment.PREF_SCREEN_LOCK; import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE; import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting; @@ -53,7 +51,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl private final PluginManager pluginManager; private final SettingsManager settingsManager; - private final AccountManager accountManager; private final EventBus eventBus; private volatile TransportStateListener listener; @@ -61,12 +58,10 @@ public class NavDrawerControllerImpl extends DbControllerImpl @Inject NavDrawerControllerImpl(@DatabaseExecutor Executor dbExecutor, LifecycleManager lifecycleManager, PluginManager pluginManager, - SettingsManager settingsManager, AccountManager accountManager, - EventBus eventBus) { + SettingsManager settingsManager, EventBus eventBus) { super(dbExecutor, lifecycleManager); this.pluginManager = pluginManager; this.settingsManager = settingsManager; - this.accountManager = accountManager; this.eventBus = eventBus; } @@ -112,25 +107,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl () -> listener.stateUpdate(id, enabled)); } - @Override - public void isLockable(ResultHandler handler) { - runOnDbThread(() -> { - try { - Settings settings = - settingsManager.getSettings(SETTINGS_NAMESPACE); - boolean ask = settings.getBoolean(PREF_SCREEN_LOCK, false); - handler.onResult(ask); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); - } - - @Override - public void lock() { - accountManager.setLocked(true); - } - @Override public void showExpiryWarning(ResultHandler handler) { if (!IS_DEBUG_BUILD && !IS_BETA_BUILD) { 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 21c73da14..94a032ba1 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 @@ -41,6 +41,7 @@ import org.briarproject.briar.android.Localizer; import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.util.UserFeedback; +import org.briarproject.briar.api.android.LockManager; import java.util.ArrayList; import java.util.Collections; @@ -140,6 +141,8 @@ public class SettingsFragment extends PreferenceFragmentCompat @Inject volatile EventBus eventBus; + @Inject + LockManager lockManager; @Inject AndroidExecutor androidExecutor; @@ -495,6 +498,7 @@ public class SettingsFragment extends PreferenceFragmentCompat boolean torBlockedSetting = (Boolean) newValue; storeTorBlockedSetting(torBlockedSetting); } else if (preference == screenLock) { + lockManager.updateLockableSetting((Boolean) newValue); Settings s = new Settings(); s.putBoolean(PREF_SCREEN_LOCK, (Boolean) newValue); storeSettings(s); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java index 4a6f56485..7abd6f512 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java @@ -15,6 +15,7 @@ import org.briarproject.briar.android.activity.BaseActivity; import org.briarproject.briar.android.login.OpenDatabaseActivity; import org.briarproject.briar.android.login.SetupActivity; import org.briarproject.briar.android.navdrawer.NavDrawerActivity; +import org.briarproject.briar.api.android.LockManager; import java.util.logging.Logger; @@ -30,6 +31,8 @@ public class SplashScreenActivity extends BaseActivity { @Inject protected AccountManager accountManager; @Inject + protected LockManager lockManager; + @Inject protected AndroidExecutor androidExecutor; @Override @@ -46,7 +49,7 @@ public class SplashScreenActivity extends BaseActivity { if (accountManager.hasDatabaseKey()) { Intent i; - if (accountManager.isLocked()) { + if (lockManager.isLocked().getValue()) { // The database is already open, so start main activity which // will open the activity to unlock, then brings main to front. i = new Intent(this, NavDrawerActivity.class); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java index 0daf3a8ae..c922aebfb 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java @@ -231,9 +231,10 @@ public class UiUtils { } public static boolean hasScreenLock(Context ctx) { + if (SDK_INT < 21) return false; KeyguardManager keyguardManager = (KeyguardManager) ctx .getSystemService(Context.KEYGUARD_SERVICE); - if (keyguardManager == null || SDK_INT < 21) return false; + if (keyguardManager == null) return false; // check if there's a lock mechanism we can use, try to ignore SIM return (SDK_INT < 23 && keyguardManager.isKeyguardSecure()) || (SDK_INT >= 23 && keyguardManager.isDeviceSecure()); 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 new file mode 100644 index 000000000..d5ccddabd --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/api/android/LockManager.java @@ -0,0 +1,17 @@ +package org.briarproject.briar.api.android; + +import android.arch.lifecycle.LiveData; + +public interface LockManager { + + LiveData isLockable(); + + void recheckLockable(); + + void updateLockableSetting(boolean lockable); + + LiveData isLocked(); + + void setLocked(boolean locked); + +}