Move app locking logic into dedicatd LockManager

This commit is contained in:
Torsten Grote
2018-08-06 18:14:34 -03:00
parent 633f5a8bd7
commit d79f1b667a
18 changed files with 184 additions and 86 deletions

View File

@@ -67,8 +67,4 @@ public interface AccountManager {
* and stored. * and stored.
*/ */
boolean changePassword(String oldPassword, String newPassword); boolean changePassword(String oldPassword, String newPassword);
boolean isLocked();
void setLocked(boolean locked);
} }

View File

@@ -45,7 +45,6 @@ class AccountManagerImpl implements AccountManager {
@Nullable @Nullable
private volatile SecretKey databaseKey = null; private volatile SecretKey databaseKey = null;
private volatile boolean locked = false;
@Inject @Inject
AccountManagerImpl(DatabaseConfig databaseConfig, CryptoComponent crypto, AccountManagerImpl(DatabaseConfig databaseConfig, CryptoComponent crypto,
@@ -219,16 +218,4 @@ class AccountManagerImpl implements AccountManager {
return key != null && encryptAndStoreDatabaseKey(key, newPassword); return key != null && encryptAndStoreDatabaseKey(key, newPassword);
} }
} }
@Override
public boolean isLocked() {
return locked;
}
@Override
public void setLocked(boolean locked) {
synchronized (stateChangeLock) {
this.locked = locked;
}
}
} }

View File

@@ -9,26 +9,16 @@ import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.Localizer; import org.briarproject.briar.android.Localizer;
import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.util.UiUtils;
import org.briarproject.briar.api.android.AndroidNotificationManager;
import javax.inject.Inject; import javax.inject.Inject;
class BriarAccountManager extends AndroidAccountManager { class BriarAccountManager extends AndroidAccountManager {
private final AndroidNotificationManager notificationManager;
@Inject @Inject
BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto, BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto,
IdentityManager identityManager, SharedPreferences prefs, IdentityManager identityManager, SharedPreferences prefs,
Application app, AndroidNotificationManager notificationManager) { Application app) {
super(databaseConfig, crypto, identityManager, prefs, app); super(databaseConfig, crypto, identityManager, prefs, app);
this.notificationManager = notificationManager;
}
@Override
public void setLocked(boolean locked) {
super.setLocked(locked);
notificationManager.updateForegroundNotification(true, locked);
} }
@Override @Override

View File

@@ -28,6 +28,7 @@ import org.briarproject.briar.android.login.SignInReminderReceiver;
import org.briarproject.briar.android.reporting.BriarReportSender; import org.briarproject.briar.android.reporting.BriarReportSender;
import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.AndroidNotificationManager;
import org.briarproject.briar.api.android.DozeWatchdog; 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.android.ScreenFilterMonitor;
import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.blog.BlogManager;
import org.briarproject.briar.api.blog.BlogPostFactory; import org.briarproject.briar.api.blog.BlogPostFactory;
@@ -146,6 +147,8 @@ public interface AndroidComponent
AccountManager accountManager(); AccountManager accountManager();
LockManager lockManager();
void inject(SignInReminderReceiver briarService); void inject(SignInReminderReceiver briarService);
void inject(BriarService briarService); void inject(BriarService briarService);

View File

@@ -177,8 +177,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
nc.setLockscreenVisibility(VISIBILITY_SECRET); nc.setLockscreenVisibility(VISIBILITY_SECRET);
nc.enableVibration(true); nc.enableVibration(true);
nc.enableLights(true); nc.enableLights(true);
nc.setLightColor( nc.setLightColor(getColor(appContext, R.color.briar_green_light));
getColor(appContext, R.color.briar_green_light));
notificationManager.createNotificationChannel(nc); notificationManager.createNotificationChannel(nc);
} }

View File

@@ -29,8 +29,10 @@ import org.briarproject.bramble.plugin.tor.AndroidTorPluginFactory;
import org.briarproject.bramble.plugin.tor.CircumventionProvider; import org.briarproject.bramble.plugin.tor.CircumventionProvider;
import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.bramble.util.AndroidUtils;
import org.briarproject.bramble.util.StringUtils; 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.AndroidNotificationManager;
import org.briarproject.briar.api.android.DozeWatchdog; 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.android.ScreenFilterMonitor;
import java.io.File; import java.io.File;
@@ -200,4 +202,12 @@ public class AppModule {
return dozeWatchdog; return dozeWatchdog;
} }
@Provides
@Singleton
LockManager provideLockManager(LifecycleManager lifecycleManager,
LockManagerImpl lockManager) {
lifecycleManager.registerService(lockManager);
return lockManager;
}
} }

View File

@@ -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<Boolean> locked = new MutableLiveData<>();
private final MutableLiveData<Boolean> 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<Boolean> 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<Boolean> isLocked() {
return locked;
}
@Override
public void setLocked(boolean locked) {
this.locked.setValue(locked);
notificationManager
.updateForegroundNotification(lockable.getValue(), locked);
}
}

View File

@@ -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.PasswordActivity;
import org.briarproject.briar.android.login.UnlockActivity; import org.briarproject.briar.android.login.UnlockActivity;
import org.briarproject.briar.android.logout.ExitActivity; import org.briarproject.briar.android.logout.ExitActivity;
import org.briarproject.briar.api.android.LockManager;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -46,10 +47,11 @@ public abstract class BriarActivity extends BaseActivity {
@Inject @Inject
BriarController briarController; BriarController briarController;
@Deprecated @Deprecated
@Inject @Inject
DbController dbController; DbController dbController;
@Inject
protected LockManager lockManager;
@Override @Override
protected void onActivityResult(int request, int result, Intent data) { protected void onActivityResult(int request, int result, Intent data) {
@@ -68,7 +70,7 @@ public abstract class BriarActivity extends BaseActivity {
if (!briarController.accountSignedIn() && !isFinishing()) { if (!briarController.accountSignedIn() && !isFinishing()) {
Intent i = new Intent(this, PasswordActivity.class); Intent i = new Intent(this, PasswordActivity.class);
startActivityForResult(i, REQUEST_PASSWORD); startActivityForResult(i, REQUEST_PASSWORD);
} else if(briarController.isLocked()) { } else if(lockManager.isLocked().getValue()) {
Intent i = new Intent(this, UnlockActivity.class); Intent i = new Intent(this, UnlockActivity.class);
startActivityForResult(i, REQUEST_UNLOCK); startActivityForResult(i, REQUEST_UNLOCK);
} else if (SDK_INT >= 23) { } else if (SDK_INT >= 23) {
@@ -82,6 +84,7 @@ public abstract class BriarActivity extends BaseActivity {
} }
}); });
} }
lockManager.recheckLockable();
} }
public void setSceneTransitionAnimation() { public void setSceneTransitionAnimation() {
@@ -122,6 +125,10 @@ public abstract class BriarActivity extends BaseActivity {
return toolbar; return toolbar;
} }
protected void onLockableChanged(boolean lockable) {
}
protected void showDozeDialog(String message) { protected void showDozeDialog(String message) {
AlertDialog.Builder b = AlertDialog.Builder b =
new AlertDialog.Builder(this, R.style.BriarDialogTheme); new AlertDialog.Builder(this, R.style.BriarDialogTheme);

View File

@@ -8,8 +8,6 @@ public interface BriarController extends ActivityLifecycleController {
boolean accountSignedIn(); boolean accountSignedIn();
boolean isLocked();
/** /**
* Returns true via the handler when the app has dozed * Returns true via the handler when the app has dozed
* without being white-listed. * without being white-listed.

View File

@@ -87,11 +87,6 @@ public class BriarControllerImpl implements BriarController {
return accountManager.hasDatabaseKey(); return accountManager.hasDatabaseKey();
} }
@Override
public boolean isLocked() {
return accountManager.isLocked();
}
@Override @Override
public void hasDozed(ResultHandler<Boolean> handler) { public void hasDozed(ResultHandler<Boolean> handler) {
if (!dozeWatchdog.getAndResetDozeFlag() if (!dozeWatchdog.getAndResetDozeFlag()

View File

@@ -15,6 +15,7 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BaseActivity; import org.briarproject.briar.android.activity.BaseActivity;
import org.briarproject.briar.api.android.LockManager;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -33,6 +34,8 @@ public class UnlockActivity extends BaseActivity {
@Inject @Inject
AccountManager accountManager; AccountManager accountManager;
@Inject
LockManager lockManager;
@Override @Override
public void injectActivity(ActivityComponent component) { public void injectActivity(ActivityComponent component) {
@@ -48,7 +51,7 @@ public class UnlockActivity extends BaseActivity {
Intent intent = getIntent(); Intent intent = getIntent();
if (intent != null && ACTION_LOCK.equals(intent.getAction())) { if (intent != null && ACTION_LOCK.equals(intent.getAction())) {
accountManager.setLocked(true); lockManager.setLocked(true);
} else { } else {
requestKeyguardUnlock(); requestKeyguardUnlock();
} }
@@ -80,7 +83,7 @@ public class UnlockActivity extends BaseActivity {
} }
private void unlock() { private void unlock() {
accountManager.setLocked(false); lockManager.setLocked(false);
setResult(RESULT_OK); setResult(RESULT_OK);
ActivityCompat.finishAfterTransition(this); ActivityCompat.finishAfterTransition(this);
} }

View File

@@ -42,7 +42,6 @@ import org.briarproject.briar.android.logout.SignOutFragment;
import org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning; import org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning;
import org.briarproject.briar.android.privategroup.list.GroupListFragment; import org.briarproject.briar.android.privategroup.list.GroupListFragment;
import org.briarproject.briar.android.settings.SettingsActivity; import org.briarproject.briar.android.settings.SettingsActivity;
import org.briarproject.briar.api.android.AndroidNotificationManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.NO;
import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.UPDATE; 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.getDaysUntilExpiry;
import static org.briarproject.briar.android.util.UiUtils.hasScreenLock;
public class NavDrawerActivity extends BriarActivity implements public class NavDrawerActivity extends BriarActivity implements
BaseFragmentListener, TransportStateListener, BaseFragmentListener, TransportStateListener,
@@ -82,8 +80,6 @@ public class NavDrawerActivity extends BriarActivity implements
NavDrawerController controller; NavDrawerController controller;
@Inject @Inject
LifecycleManager lifecycleManager; LifecycleManager lifecycleManager;
@Inject
AndroidNotificationManager notificationManager;
private DrawerLayout drawerLayout; private DrawerLayout drawerLayout;
private NavigationView navigation; private NavigationView navigation;
@@ -141,6 +137,8 @@ public class NavDrawerActivity extends BriarActivity implements
initializeTransports(getLayoutInflater()); initializeTransports(getLayoutInflater());
transportsView.setAdapter(transportsAdapter); transportsView.setAdapter(transportsAdapter);
lockManager.isLockable().observe(this, this::setLockVisible);
if (lifecycleManager.getLifecycleState().isAfter(RUNNING)) { if (lifecycleManager.getLifecycleState().isAfter(RUNNING)) {
showSignOutFragment(); showSignOutFragment();
} else if (state == null) { } else if (state == null) {
@@ -157,14 +155,6 @@ public class NavDrawerActivity extends BriarActivity implements
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
updateTransports(); updateTransports();
if (hasScreenLock(this)) {
controller.isLockable(new UiResultHandler<Boolean>(this) {
@Override
public void onResultUi(@NonNull Boolean lockable) {
setLockVisible(lockable);
}
});
} else setLockVisible(false);
controller.showExpiryWarning(new UiResultHandler<ExpiryWarning>(this) { controller.showExpiryWarning(new UiResultHandler<ExpiryWarning>(this) {
@Override @Override
public void onResultUi(ExpiryWarning expiry) { public void onResultUi(ExpiryWarning expiry) {
@@ -227,7 +217,7 @@ public class NavDrawerActivity extends BriarActivity implements
drawerLayout.closeDrawer(START); drawerLayout.closeDrawer(START);
clearBackStack(); clearBackStack();
if (item.getItemId() == R.id.nav_btn_lock) { if (item.getItemId() == R.id.nav_btn_lock) {
controller.lock(); lockManager.setLocked(true);
ActivityCompat.finishAfterTransition(this); ActivityCompat.finishAfterTransition(this);
return false; return false;
} else { } else {
@@ -323,7 +313,6 @@ public class NavDrawerActivity extends BriarActivity implements
private void setLockVisible(boolean visible) { private void setLockVisible(boolean visible) {
MenuItem item = navigation.getMenu().findItem(R.id.nav_btn_lock); MenuItem item = navigation.getMenu().findItem(R.id.nav_btn_lock);
if (item != null) item.setVisible(visible); if (item != null) item.setVisible(visible);
notificationManager.updateForegroundNotification(visible, false);
} }
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")

View File

@@ -14,10 +14,6 @@ public interface NavDrawerController extends ActivityLifecycleController {
boolean isTransportRunning(TransportId transportId); boolean isTransportRunning(TransportId transportId);
void isLockable(ResultHandler<Boolean> handler);
void lock();
void showExpiryWarning(ResultHandler<ExpiryWarning> handler); void showExpiryWarning(ResultHandler<ExpiryWarning> handler);
void expiryWarningDismissed(); void expiryWarningDismissed();

View File

@@ -3,7 +3,6 @@ package org.briarproject.briar.android.navdrawer;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import org.briarproject.bramble.api.account.AccountManager;
import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DatabaseExecutor;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.Event; 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.NO;
import static org.briarproject.briar.android.navdrawer.NavDrawerController.ExpiryWarning.SHOW; 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.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.settings.SettingsFragment.SETTINGS_NAMESPACE;
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting; import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
@@ -53,7 +51,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl
private final PluginManager pluginManager; private final PluginManager pluginManager;
private final SettingsManager settingsManager; private final SettingsManager settingsManager;
private final AccountManager accountManager;
private final EventBus eventBus; private final EventBus eventBus;
private volatile TransportStateListener listener; private volatile TransportStateListener listener;
@@ -61,12 +58,10 @@ public class NavDrawerControllerImpl extends DbControllerImpl
@Inject @Inject
NavDrawerControllerImpl(@DatabaseExecutor Executor dbExecutor, NavDrawerControllerImpl(@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager, PluginManager pluginManager, LifecycleManager lifecycleManager, PluginManager pluginManager,
SettingsManager settingsManager, AccountManager accountManager, SettingsManager settingsManager, EventBus eventBus) {
EventBus eventBus) {
super(dbExecutor, lifecycleManager); super(dbExecutor, lifecycleManager);
this.pluginManager = pluginManager; this.pluginManager = pluginManager;
this.settingsManager = settingsManager; this.settingsManager = settingsManager;
this.accountManager = accountManager;
this.eventBus = eventBus; this.eventBus = eventBus;
} }
@@ -112,25 +107,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl
() -> listener.stateUpdate(id, enabled)); () -> listener.stateUpdate(id, enabled));
} }
@Override
public void isLockable(ResultHandler<Boolean> 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 @Override
public void showExpiryWarning(ResultHandler<ExpiryWarning> handler) { public void showExpiryWarning(ResultHandler<ExpiryWarning> handler) {
if (!IS_DEBUG_BUILD && !IS_BETA_BUILD) { if (!IS_DEBUG_BUILD && !IS_BETA_BUILD) {

View File

@@ -41,6 +41,7 @@ import org.briarproject.briar.android.Localizer;
import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.android.util.UiUtils;
import org.briarproject.briar.android.util.UserFeedback; import org.briarproject.briar.android.util.UserFeedback;
import org.briarproject.briar.api.android.LockManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -140,6 +141,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
@Inject @Inject
volatile EventBus eventBus; volatile EventBus eventBus;
@Inject
LockManager lockManager;
@Inject @Inject
AndroidExecutor androidExecutor; AndroidExecutor androidExecutor;
@@ -495,6 +498,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
boolean torBlockedSetting = (Boolean) newValue; boolean torBlockedSetting = (Boolean) newValue;
storeTorBlockedSetting(torBlockedSetting); storeTorBlockedSetting(torBlockedSetting);
} else if (preference == screenLock) { } else if (preference == screenLock) {
lockManager.updateLockableSetting((Boolean) newValue);
Settings s = new Settings(); Settings s = new Settings();
s.putBoolean(PREF_SCREEN_LOCK, (Boolean) newValue); s.putBoolean(PREF_SCREEN_LOCK, (Boolean) newValue);
storeSettings(s); storeSettings(s);

View File

@@ -15,6 +15,7 @@ import org.briarproject.briar.android.activity.BaseActivity;
import org.briarproject.briar.android.login.OpenDatabaseActivity; import org.briarproject.briar.android.login.OpenDatabaseActivity;
import org.briarproject.briar.android.login.SetupActivity; import org.briarproject.briar.android.login.SetupActivity;
import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
import org.briarproject.briar.api.android.LockManager;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -30,6 +31,8 @@ public class SplashScreenActivity extends BaseActivity {
@Inject @Inject
protected AccountManager accountManager; protected AccountManager accountManager;
@Inject @Inject
protected LockManager lockManager;
@Inject
protected AndroidExecutor androidExecutor; protected AndroidExecutor androidExecutor;
@Override @Override
@@ -46,7 +49,7 @@ public class SplashScreenActivity extends BaseActivity {
if (accountManager.hasDatabaseKey()) { if (accountManager.hasDatabaseKey()) {
Intent i; Intent i;
if (accountManager.isLocked()) { if (lockManager.isLocked().getValue()) {
// The database is already open, so start main activity which // The database is already open, so start main activity which
// will open the activity to unlock, then brings main to front. // will open the activity to unlock, then brings main to front.
i = new Intent(this, NavDrawerActivity.class); i = new Intent(this, NavDrawerActivity.class);

View File

@@ -231,9 +231,10 @@ public class UiUtils {
} }
public static boolean hasScreenLock(Context ctx) { public static boolean hasScreenLock(Context ctx) {
if (SDK_INT < 21) return false;
KeyguardManager keyguardManager = (KeyguardManager) ctx KeyguardManager keyguardManager = (KeyguardManager) ctx
.getSystemService(Context.KEYGUARD_SERVICE); .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 // check if there's a lock mechanism we can use, try to ignore SIM
return (SDK_INT < 23 && keyguardManager.isKeyguardSecure()) || return (SDK_INT < 23 && keyguardManager.isKeyguardSecure()) ||
(SDK_INT >= 23 && keyguardManager.isDeviceSecure()); (SDK_INT >= 23 && keyguardManager.isDeviceSecure());

View File

@@ -0,0 +1,17 @@
package org.briarproject.briar.api.android;
import android.arch.lifecycle.LiveData;
public interface LockManager {
LiveData<Boolean> isLockable();
void recheckLockable();
void updateLockableSetting(boolean lockable);
LiveData<Boolean> isLocked();
void setLocked(boolean locked);
}