mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 18:59:06 +01:00
Merge branch 'master' into 'preference-switches'
# Conflicts: # briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
This commit is contained in:
@@ -40,9 +40,9 @@ dependencies {
|
||||
|
||||
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
|
||||
testImplementation 'org.robolectric:robolectric:3.5.1'
|
||||
testImplementation 'org.robolectric:shadows-support-v4:3.0'
|
||||
testImplementation 'org.mockito:mockito-core:2.8.9'
|
||||
testImplementation 'org.robolectric:robolectric:3.8'
|
||||
testImplementation 'org.robolectric:shadows-support-v4:3.3.2'
|
||||
testImplementation 'org.mockito:mockito-core:2.13.0'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation "org.jmock:jmock:2.8.2"
|
||||
testImplementation "org.jmock:jmock-junit4:2.8.2"
|
||||
@@ -165,8 +165,8 @@ dependencyVerification {
|
||||
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
|
||||
'nekohtml:nekohtml:1.9.6.2:nekohtml-1.9.6.2.jar:fdff6cfa9ed9cc911c842a5d2395f209ec621ef1239d46810e9e495809d3ae09',
|
||||
'nekohtml:xercesMinimal:1.9.6.2:xercesMinimal-1.9.6.2.jar:95b8b357d19f63797dd7d67622fd3f18374d64acbc6584faba1c7759a31e8438',
|
||||
'net.bytebuddy:byte-buddy-agent:1.6.14:byte-buddy-agent-1.6.14.jar:c141a2d6809c3eeff4a43d25992826abccebdd4b793af3e7a5f346e88ae73a33',
|
||||
'net.bytebuddy:byte-buddy:1.6.14:byte-buddy-1.6.14.jar:917758b3c651e278a15a029ba1d42dbf802d8b0e1fe2aa4b81c5750c64f461c1',
|
||||
'net.bytebuddy:byte-buddy-agent:1.7.9:byte-buddy-agent-1.7.9.jar:ac1a993befb528c3271a83a9ad9c42d363d399e9deb26e0470e3c4962066c550',
|
||||
'net.bytebuddy:byte-buddy:1.7.9:byte-buddy-1.7.9.jar:2ea2ada12b790d16ac7f6e6c065cb55cbcdb6ba519355f5958851159cad3b16a',
|
||||
'net.sf.jopt-simple:jopt-simple:4.9:jopt-simple-4.9.jar:26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5',
|
||||
'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2',
|
||||
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d',
|
||||
@@ -215,8 +215,8 @@ dependencyVerification {
|
||||
'org.jmock:jmock-testjar:2.8.2:jmock-testjar-2.8.2.jar:8900860f72c474e027cf97fe78dcbf154a1aa7fc62b6845c5fb4e4f3c7bc8760',
|
||||
'org.jmock:jmock:2.8.2:jmock-2.8.2.jar:6c73cb4a2e6dbfb61fd99c9a768539c170ab6568e57846bd60dbf19596b65b16',
|
||||
'org.jvnet.staxex:stax-ex:1.7.7:stax-ex-1.7.7.jar:a31ff7d77163c0deb09e7fee59ad35ae44c2cee2cc8552a116ccd1583d813fb4',
|
||||
'org.mockito:mockito-core:2.8.9:mockito-core-2.8.9.jar:a2bb9b8b40d81bb02ccb84259524c0f4911f73c6577bfc7ddd940b8fc729b6e6',
|
||||
'org.objenesis:objenesis:2.5:objenesis-2.5.jar:293328e1b0d31ed30bb89fca542b6c52fac00989bb0e62eb9d98d630c4dd6b7c',
|
||||
'org.mockito:mockito-core:2.13.0:mockito-core-2.13.0.jar:92a746b37cf8c5730a5e7b35fd7d8cd72700089435ff92ee03ed8384d4eb3377',
|
||||
'org.objenesis:objenesis:2.6:objenesis-2.6.jar:5e168368fbc250af3c79aa5fef0c3467a2d64e5a7bd74005f25d8399aeb0708d',
|
||||
'org.ow2.asm:asm-analysis:5.1:asm-analysis-5.1.jar:a34658f5c5de4b573eef21131cc32cc25f7b66407944f312b28ec2e56abb1fa9',
|
||||
'org.ow2.asm:asm-commons:5.0.1:asm-commons-5.0.1.jar:fb1cb7fa27d892712ced8fbf8d027eb5052ecd3999dba1ba47824357accb40e7',
|
||||
'org.ow2.asm:asm-commons:5.1:asm-commons-5.1.jar:97b3786e1f55e74bddf8ad102bf50e33bbcbc1f6b7fd7b36f0bbbb25cd4981be',
|
||||
@@ -225,15 +225,15 @@ dependencyVerification {
|
||||
'org.ow2.asm:asm-util:5.1:asm-util-5.1.jar:ee032c39ae5e3cd099148fbba9a2124f9ed613e5cb93e03ee0fa8808ce364040',
|
||||
'org.ow2.asm:asm:5.0.4:asm-5.0.4.jar:896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220',
|
||||
'org.ow2.asm:asm:5.1:asm-5.1.jar:d2da399a9967c69f0a21739256fa79d284222c223082cacadc17372244764b54',
|
||||
'org.robolectric:annotations:3.5.1:annotations-3.5.1.jar:14db0f7d2299c5400ff7764bb37b4fa80306582d8965fdf6999091723e2384ce',
|
||||
'org.robolectric:junit:3.5.1:junit-3.5.1.jar:b2e81b7d5a22755f2ea76aa9bbbd4359d61c4cb9577193ccfbb8f97378ed293b',
|
||||
'org.robolectric:resources:3.5.1:resources-3.5.1.jar:22a5564590c8bfd8df7efb2b0c7d9942b46a0beb59ba38899d59c1270f293b1c',
|
||||
'org.robolectric:robolectric:3.5.1:robolectric-3.5.1.jar:603cf898f93b854f18021fab452aca3fe482368eeb2e720988ae82212ebcf4b6',
|
||||
'org.robolectric:sandbox:3.5.1:sandbox-3.5.1.jar:beff8c3c1e840e0f7f78aadef170f347bae349f098babfc176765f499a4bcbb5',
|
||||
'org.robolectric:shadowapi:3.5.1:shadowapi-3.5.1.jar:6d574f9ae0922791eb8f06979f0010997d4b862c7aec96d485ae797ddfc13278',
|
||||
'org.robolectric:shadows-framework:3.5.1:shadows-framework-3.5.1.jar:597b54cc1a494799d783921c6ac04352f33e94fca8e00f299d4ca192db79e3fc',
|
||||
'org.robolectric:shadows-support-v4:3.0:shadows-support-v4-3.0.jar:66bcc3257b037d72998e860d67b1bc58215b7eeac8ad860fcc3e613332d88619',
|
||||
'org.robolectric:utils:3.5.1:utils-3.5.1.jar:d7d77326867e6d903156ebb18c244819b26aebe3aa82a1c57081081a0b6c4f63',
|
||||
'org.robolectric:annotations:3.8:annotations-3.8.jar:8eab08facfe2a8cd22f6a09f4378f012a5985c0d4f4ad4e203e00f75b5568458',
|
||||
'org.robolectric:junit:3.8:junit-3.8.jar:042575dbc95dc82ec046d13438ccda578917ce786d2f464cba0eb18da1f412cb',
|
||||
'org.robolectric:resources:3.8:resources-3.8.jar:6d11e6d39df8eda837c52319cf8d6bef424df45be6f29b3a731707832eb6ffc1',
|
||||
'org.robolectric:robolectric:3.8:robolectric-3.8.jar:34908fc858e6e4113be2cf97fe55d3ffa4462bf7183d466542582ca1898ce60a',
|
||||
'org.robolectric:sandbox:3.8:sandbox-3.8.jar:cc257dc75c5af9e62a43572ac89dff4d8520427307cf973e6b663c88fb000720',
|
||||
'org.robolectric:shadowapi:3.8:shadowapi-3.8.jar:28bc24cb5c4b4030852cebebfd5f12536d03088892cb3c8b1d1379297087aca8',
|
||||
'org.robolectric:shadows-framework:3.8:shadows-framework-3.8.jar:83548db7249edf1af87e1a1f4d8f4eec3e85d6220161da601e6f6398476911b2',
|
||||
'org.robolectric:shadows-support-v4:3.3.2:shadows-support-v4-3.3.2.jar:6f689264738266e70fe08db7c04b7b5a75155994f4e3f7f311960d90486bf005',
|
||||
'org.robolectric:utils:3.8:utils-3.8.jar:e945d04d40e37554e02d4be1bc3abf9bede45375c843aa36d10ccb6b63edbf34',
|
||||
'tools.fastlane:screengrab:1.1.0:screengrab-1.1.0.aar:03ce3868ee8a0082d14e7a1de0999f91531c0cc794392688beb08ee9bc4495fd',
|
||||
'uk.co.samuelwall:material-tap-target-prompt:2.8.0:material-tap-target-prompt-2.8.0.aar:ac70770c05bbc4675a1d5712c0e53d46ee4fa961b74947589fce50d8003065ec',
|
||||
'xmlpull:xmlpull:1.1.3.1:xmlpull-1.1.3.1.jar:34e08ee62116071cbb69c0ed70d15a7a5b208d62798c59f2120bb8929324cb63',
|
||||
|
||||
@@ -402,5 +402,11 @@
|
||||
android:theme="@android:style/Theme.NoDisplay">
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".android.login.UnlockActivity"
|
||||
android:label="@string/lock_unlock"
|
||||
android:launchMode="singleTask"
|
||||
android:theme="@style/BriarTheme.NoActionBar"/>
|
||||
|
||||
</application>
|
||||
</manifest>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.briarproject.briar.android;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Application;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
@@ -12,7 +13,6 @@ import android.support.annotation.StringRes;
|
||||
import android.support.annotation.UiThread;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.app.TaskStackBuilder;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
|
||||
import org.briarproject.bramble.api.Multiset;
|
||||
import org.briarproject.bramble.api.contact.ContactId;
|
||||
@@ -65,7 +65,6 @@ import javax.inject.Inject;
|
||||
import static android.app.Notification.DEFAULT_LIGHTS;
|
||||
import static android.app.Notification.DEFAULT_SOUND;
|
||||
import static android.app.Notification.DEFAULT_VIBRATE;
|
||||
import static android.app.Notification.VISIBILITY_SECRET;
|
||||
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
|
||||
import static android.app.NotificationManager.IMPORTANCE_LOW;
|
||||
import static android.content.Context.NOTIFICATION_SERVICE;
|
||||
@@ -73,8 +72,12 @@ import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static android.support.v4.app.NotificationCompat.CATEGORY_MESSAGE;
|
||||
import static android.support.v4.app.NotificationCompat.CATEGORY_SERVICE;
|
||||
import static android.support.v4.app.NotificationCompat.CATEGORY_SOCIAL;
|
||||
import static android.support.v4.app.NotificationCompat.PRIORITY_LOW;
|
||||
import static android.support.v4.app.NotificationCompat.PRIORITY_MIN;
|
||||
import static android.support.v4.app.NotificationCompat.VISIBILITY_SECRET;
|
||||
import static android.support.v4.content.ContextCompat.getColor;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
||||
@@ -173,8 +176,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
||||
nc.setLockscreenVisibility(VISIBILITY_SECRET);
|
||||
nc.enableVibration(true);
|
||||
nc.enableLights(true);
|
||||
nc.setLightColor(
|
||||
ContextCompat.getColor(appContext, R.color.briar_green_light));
|
||||
nc.setLightColor(getColor(appContext, R.color.briar_green_light));
|
||||
notificationManager.createNotificationChannel(nc);
|
||||
}
|
||||
|
||||
@@ -271,6 +273,47 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
||||
});
|
||||
}
|
||||
|
||||
@UiThread
|
||||
@Override
|
||||
public Notification getForegroundNotification() {
|
||||
return getForegroundNotification(false);
|
||||
}
|
||||
|
||||
@UiThread
|
||||
private Notification getForegroundNotification(boolean locked) {
|
||||
int title = locked ? R.string.lock_is_locked :
|
||||
R.string.ongoing_notification_title;
|
||||
int text = locked ? R.string.lock_tap_to_unlock :
|
||||
R.string.ongoing_notification_text;
|
||||
int icon = locked ? R.drawable.startup_lock :
|
||||
R.drawable.notification_ongoing;
|
||||
// Ongoing foreground notification that shows BriarService is running
|
||||
NotificationCompat.Builder b =
|
||||
new NotificationCompat.Builder(appContext, ONGOING_CHANNEL_ID);
|
||||
b.setSmallIcon(icon);
|
||||
b.setColor(getColor(appContext, R.color.briar_primary));
|
||||
b.setContentTitle(appContext.getText(title));
|
||||
b.setContentText(appContext.getText(text));
|
||||
b.setWhen(0); // Don't show the time
|
||||
b.setOngoing(true);
|
||||
Intent i = new Intent(appContext, NavDrawerActivity.class);
|
||||
i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP);
|
||||
b.setContentIntent(PendingIntent.getActivity(appContext, 0, i, 0));
|
||||
if (SDK_INT >= 21) {
|
||||
b.setCategory(CATEGORY_SERVICE);
|
||||
b.setVisibility(VISIBILITY_SECRET);
|
||||
}
|
||||
b.setPriority(PRIORITY_MIN);
|
||||
return b.build();
|
||||
}
|
||||
|
||||
@UiThread
|
||||
@Override
|
||||
public void updateForegroundNotification(boolean locked) {
|
||||
Notification n = getForegroundNotification(locked);
|
||||
notificationManager.notify(ONGOING_NOTIFICATION_ID, n);
|
||||
}
|
||||
|
||||
private void showContactNotification(ContactId c) {
|
||||
androidExecutor.runOnUiThread(() -> {
|
||||
if (blockContacts) return;
|
||||
@@ -636,7 +679,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
|
||||
NotificationCompat.Builder b =
|
||||
new NotificationCompat.Builder(appContext, REMINDER_CHANNEL_ID);
|
||||
b.setSmallIcon(R.drawable.ic_signout);
|
||||
b.setColor(ContextCompat.getColor(appContext, R.color.briar_primary));
|
||||
b.setColor(getColor(appContext, R.color.briar_primary));
|
||||
b.setContentTitle(
|
||||
appContext.getText(R.string.reminder_notification_title));
|
||||
b.setContentText(
|
||||
|
||||
@@ -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,13 @@ public class AppModule {
|
||||
return dozeWatchdog;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
LockManager provideLockManager(LifecycleManager lifecycleManager,
|
||||
EventBus eventBus, LockManagerImpl lockManager) {
|
||||
lifecycleManager.registerService(lockManager);
|
||||
eventBus.addListener(lockManager);
|
||||
return lockManager;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.briarproject.briar.android;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningAppProcessInfo;
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
@@ -15,7 +16,6 @@ import android.content.ServiceConnection;
|
||||
import android.os.Binder;
|
||||
import android.os.IBinder;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
|
||||
import org.briarproject.bramble.api.account.AccountManager;
|
||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
||||
@@ -25,6 +25,7 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||
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 java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
@@ -44,8 +45,6 @@ import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static android.support.v4.app.NotificationCompat.CATEGORY_SERVICE;
|
||||
import static android.support.v4.app.NotificationCompat.PRIORITY_MIN;
|
||||
import static android.support.v4.app.NotificationCompat.VISIBILITY_SECRET;
|
||||
import static java.util.logging.Level.INFO;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
@@ -74,6 +73,8 @@ public class BriarService extends Service {
|
||||
@Nullable
|
||||
private BroadcastReceiver receiver = null;
|
||||
|
||||
@Inject
|
||||
AndroidNotificationManager notificationManager;
|
||||
@Inject
|
||||
AccountManager accountManager;
|
||||
|
||||
@@ -121,24 +122,9 @@ public class BriarService extends Service {
|
||||
failureChannel.setLockscreenVisibility(VISIBILITY_SECRET);
|
||||
nm.createNotificationChannel(failureChannel);
|
||||
}
|
||||
// Show an ongoing notification that the service is running
|
||||
NotificationCompat.Builder b =
|
||||
new NotificationCompat.Builder(this, ONGOING_CHANNEL_ID);
|
||||
b.setSmallIcon(R.drawable.notification_ongoing);
|
||||
b.setColor(ContextCompat.getColor(this, R.color.briar_primary));
|
||||
b.setContentTitle(getText(R.string.ongoing_notification_title));
|
||||
b.setContentText(getText(R.string.ongoing_notification_text));
|
||||
b.setWhen(0); // Don't show the time
|
||||
b.setOngoing(true);
|
||||
Intent i = new Intent(this, NavDrawerActivity.class);
|
||||
i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP);
|
||||
b.setContentIntent(PendingIntent.getActivity(this, 0, i, 0));
|
||||
if (SDK_INT >= 21) {
|
||||
b.setCategory(CATEGORY_SERVICE);
|
||||
b.setVisibility(VISIBILITY_SECRET);
|
||||
}
|
||||
b.setPriority(PRIORITY_MIN);
|
||||
startForeground(ONGOING_NOTIFICATION_ID, b.build());
|
||||
Notification foregroundNotification =
|
||||
notificationManager.getForegroundNotification();
|
||||
startForeground(ONGOING_NOTIFICATION_ID, foregroundNotification);
|
||||
// Start the services in a background thread
|
||||
new Thread(() -> {
|
||||
StartResult result = lifecycleManager.startServices(dbKey);
|
||||
|
||||
@@ -40,4 +40,9 @@ public interface TestingConstants {
|
||||
* Feature flag for enabling the sign-in reminder in release builds.
|
||||
*/
|
||||
boolean FEATURE_FLAG_SIGN_IN_REMINDER = IS_DEBUG_BUILD;
|
||||
|
||||
/**
|
||||
* Feature flag for enabling the PIN lock in release builds.
|
||||
*/
|
||||
boolean FEATURE_FLAG_PIN_LOCK = IS_DEBUG_BUILD;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
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 android.support.annotation.UiThread;
|
||||
|
||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.event.Event;
|
||||
import org.briarproject.bramble.api.event.EventListener;
|
||||
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.bramble.api.settings.event.SettingsUpdatedEvent;
|
||||
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, EventListener {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(LockManagerImpl.class.getName());
|
||||
|
||||
private final Context appContext;
|
||||
private final SettingsManager settingsManager;
|
||||
private final AndroidNotificationManager notificationManager;
|
||||
@DatabaseExecutor
|
||||
private final Executor dbExecutor;
|
||||
|
||||
private volatile boolean locked = false;
|
||||
private volatile boolean lockableSetting = false;
|
||||
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;
|
||||
|
||||
// setting this in the constructor makes #getValue() @NonNull
|
||||
this.lockable.setValue(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startService() {
|
||||
// only load the setting here, because database isn't open before
|
||||
loadLockableSetting();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopService() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LiveData<Boolean> isLockable() {
|
||||
return lockable;
|
||||
}
|
||||
|
||||
@UiThread
|
||||
@Override
|
||||
public void checkIfLockable() {
|
||||
boolean oldValue = lockable.getValue();
|
||||
boolean newValue = hasScreenLock(appContext) && lockableSetting;
|
||||
if (oldValue != newValue) {
|
||||
this.lockable.setValue(newValue);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLocked() {
|
||||
if (locked && !hasScreenLock(appContext)) {
|
||||
lockable.postValue(false);
|
||||
locked = false;
|
||||
}
|
||||
return locked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLocked(boolean locked) {
|
||||
this.locked = locked;
|
||||
notificationManager.updateForegroundNotification(locked);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eventOccurred(Event event) {
|
||||
if (event instanceof SettingsUpdatedEvent) {
|
||||
SettingsUpdatedEvent e = (SettingsUpdatedEvent) event;
|
||||
String namespace = e.getNamespace();
|
||||
if (namespace.equals(SETTINGS_NAMESPACE)) {
|
||||
loadLockableSetting();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void loadLockableSetting() {
|
||||
dbExecutor.execute(() -> {
|
||||
try {
|
||||
Settings settings =
|
||||
settingsManager.getSettings(SETTINGS_NAMESPACE);
|
||||
lockableSetting = settings.getBoolean(PREF_SCREEN_LOCK, false);
|
||||
boolean newValue = hasScreenLock(appContext) && lockableSetting;
|
||||
lockable.postValue(newValue);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
lockableSetting = false;
|
||||
lockable.postValue(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -37,6 +37,7 @@ import org.briarproject.briar.android.login.OpenDatabaseActivity;
|
||||
import org.briarproject.briar.android.login.PasswordActivity;
|
||||
import org.briarproject.briar.android.login.PasswordFragment;
|
||||
import org.briarproject.briar.android.login.SetupActivity;
|
||||
import org.briarproject.briar.android.login.UnlockActivity;
|
||||
import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
|
||||
import org.briarproject.briar.android.panic.PanicPreferencesActivity;
|
||||
import org.briarproject.briar.android.panic.PanicResponderActivity;
|
||||
@@ -163,6 +164,8 @@ public interface ActivityComponent {
|
||||
|
||||
void inject(StartupFailureActivity activity);
|
||||
|
||||
void inject(UnlockActivity activity);
|
||||
|
||||
// Fragments
|
||||
void inject(AuthorNameFragment fragment);
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@ import org.briarproject.briar.android.controller.BriarController;
|
||||
import org.briarproject.briar.android.controller.DbController;
|
||||
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;
|
||||
|
||||
@@ -30,6 +32,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_DOZE_WHITELISTING;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_UNLOCK;
|
||||
import static org.briarproject.briar.android.util.UiUtils.getDozeWhitelistingIntent;
|
||||
import static org.briarproject.briar.android.util.UiUtils.isSamsung7;
|
||||
|
||||
@@ -44,26 +47,43 @@ 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) {
|
||||
super.onActivityResult(request, result, data);
|
||||
if (request == REQUEST_PASSWORD) {
|
||||
if (result == RESULT_OK) briarController.startAndBindService();
|
||||
else supportFinishAfterTransition();
|
||||
if (request == REQUEST_PASSWORD && result == RESULT_OK) {
|
||||
// PasswordActivity finishes when password was entered correctly.
|
||||
// When back button is pressed there, it will bring itself back,
|
||||
// so that we never arrive here with a result that is not OK.
|
||||
briarController.startAndBindService();
|
||||
} else if (request == REQUEST_UNLOCK && result != RESULT_OK) {
|
||||
// We arrive here, if the user presses 'back'
|
||||
// in the Keyguard unlock screen, because UnlockActivity finishes.
|
||||
// If we don't finish here, isFinishing will be false in onResume()
|
||||
// and we launch a new UnlockActivity causing a loop.
|
||||
supportFinishAfterTransition();
|
||||
// If the result is OK, we don't need to do anything here
|
||||
// and can resume normally.
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (!briarController.accountSignedIn() && !isFinishing()) {
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
if (!briarController.accountSignedIn()) {
|
||||
Intent i = new Intent(this, PasswordActivity.class);
|
||||
startActivityForResult(i, REQUEST_PASSWORD);
|
||||
} else if (lockManager.isLocked() && !isFinishing()) {
|
||||
// Also check that the activity isn't finishing already.
|
||||
// This is possible if finishing in onActivityResult().
|
||||
// Failure to do this check would cause an UnlockActivity loop.
|
||||
Intent i = new Intent(this, UnlockActivity.class);
|
||||
startActivityForResult(i, REQUEST_UNLOCK);
|
||||
} else if (SDK_INT >= 23) {
|
||||
briarController.hasDozed(new UiResultHandler<Boolean>(this) {
|
||||
@Override
|
||||
|
||||
@@ -12,5 +12,7 @@ public interface RequestCodes {
|
||||
int REQUEST_PERMISSION_CAMERA = 8;
|
||||
int REQUEST_DOZE_WHITELISTING = 9;
|
||||
int REQUEST_ENABLE_BLUETOOTH = 10;
|
||||
int REQUEST_UNLOCK = 11;
|
||||
int REQUEST_KEYGUARD_UNLOCK = 12;
|
||||
|
||||
}
|
||||
|
||||
@@ -23,8 +23,6 @@ import org.briarproject.briar.api.android.AndroidNotificationManager;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static android.content.Intent.ACTION_MAIN;
|
||||
import static android.content.Intent.CATEGORY_HOME;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||
import static android.view.View.INVISIBLE;
|
||||
@@ -109,10 +107,9 @@ public class PasswordActivity extends BaseActivity {
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
// Show the home screen rather than another password prompt
|
||||
Intent intent = new Intent(ACTION_MAIN);
|
||||
intent.addCategory(CATEGORY_HOME);
|
||||
startActivity(intent);
|
||||
// Move task and activity to the background instead of showing another
|
||||
// password prompt. onActivityResult() won't be called in BriarActivity
|
||||
moveTaskToBack(true);
|
||||
}
|
||||
|
||||
private void deleteAccount() {
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
package org.briarproject.briar.android.login;
|
||||
|
||||
import android.app.KeyguardManager;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.RequiresApi;
|
||||
import android.widget.Button;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
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;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_KEYGUARD_UNLOCK;
|
||||
|
||||
@RequiresApi(21)
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class UnlockActivity extends BaseActivity {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(UnlockActivity.class.getName());
|
||||
private static final String KEYGUARD_SHOWN = "keyguardShown";
|
||||
|
||||
@Inject
|
||||
LockManager lockManager;
|
||||
|
||||
private boolean keyguardShown = false;
|
||||
|
||||
@Override
|
||||
public void injectActivity(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
|
||||
public void onCreate(@Nullable Bundle state) {
|
||||
super.onCreate(state);
|
||||
overridePendingTransition(0, 0);
|
||||
setContentView(R.layout.activity_unlock);
|
||||
|
||||
Button button = findViewById(R.id.unlock);
|
||||
button.setOnClickListener(view -> requestKeyguardUnlock());
|
||||
|
||||
keyguardShown = state != null && state.getBoolean(KEYGUARD_SHOWN);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
// Saving whether we've shown the keyguard already is necessary
|
||||
// for Android 6 when this activity gets destroyed.
|
||||
//
|
||||
// This will not help Android 5.
|
||||
// There the system will show the keyguard once again.
|
||||
// So if this activity was destroyed, the user needs to enter PIN twice.
|
||||
outState.putBoolean(KEYGUARD_SHOWN, keyguardShown);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode,
|
||||
Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (requestCode == REQUEST_KEYGUARD_UNLOCK) {
|
||||
if (resultCode == RESULT_OK) unlock();
|
||||
else {
|
||||
finish();
|
||||
overridePendingTransition(0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
// Show keyguard after onActivityResult() as been called.
|
||||
// Check if app is still locked, lockable
|
||||
// and not finishing (which is possible if recreated)
|
||||
if (!keyguardShown && lockManager.isLocked() && !isFinishing()) {
|
||||
requestKeyguardUnlock();
|
||||
} else if (!lockManager.isLocked()) {
|
||||
setResult(RESULT_OK);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
moveTaskToBack(true);
|
||||
}
|
||||
|
||||
private void requestKeyguardUnlock() {
|
||||
KeyguardManager keyguardManager =
|
||||
(KeyguardManager) getSystemService(KEYGUARD_SERVICE);
|
||||
if (keyguardManager == null) throw new AssertionError();
|
||||
Intent intent = keyguardManager.createConfirmDeviceCredentialIntent(
|
||||
SDK_INT < 23 ? getString(R.string.lock_unlock_verbose) :
|
||||
getString(R.string.lock_unlock), null);
|
||||
if (intent == null) {
|
||||
// the user must have removed the screen lock since locked
|
||||
LOG.warning("Unlocking without keyguard");
|
||||
unlock();
|
||||
} else {
|
||||
keyguardShown = true;
|
||||
startActivityForResult(intent, REQUEST_KEYGUARD_UNLOCK);
|
||||
overridePendingTransition(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
private void unlock() {
|
||||
lockManager.setLocked(false);
|
||||
setResult(RESULT_OK);
|
||||
finish();
|
||||
overridePendingTransition(0, 0);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.design.widget.NavigationView;
|
||||
import android.support.design.widget.NavigationView.OnNavigationItemSelectedListener;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentTransaction;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
@@ -136,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) {
|
||||
@@ -152,6 +155,7 @@ public class NavDrawerActivity extends BriarActivity implements
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
updateTransports();
|
||||
lockManager.checkIfLockable();
|
||||
controller.showExpiryWarning(new UiResultHandler<ExpiryWarning>(this) {
|
||||
@Override
|
||||
public void onResultUi(ExpiryWarning expiry) {
|
||||
@@ -213,9 +217,15 @@ public class NavDrawerActivity extends BriarActivity implements
|
||||
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
|
||||
drawerLayout.closeDrawer(START);
|
||||
clearBackStack();
|
||||
loadFragment(item.getItemId());
|
||||
// Don't display the Settings item as checked
|
||||
return item.getItemId() != R.id.nav_btn_settings;
|
||||
if (item.getItemId() == R.id.nav_btn_lock) {
|
||||
lockManager.setLocked(true);
|
||||
ActivityCompat.finishAfterTransition(this);
|
||||
return false;
|
||||
} else {
|
||||
loadFragment(item.getItemId());
|
||||
// Don't display the Settings item as checked
|
||||
return item.getItemId() != R.id.nav_btn_settings;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -301,6 +311,11 @@ public class NavDrawerActivity extends BriarActivity implements
|
||||
// Do nothing for now
|
||||
}
|
||||
|
||||
private void setLockVisible(boolean visible) {
|
||||
MenuItem item = navigation.getMenu().findItem(R.id.nav_btn_lock);
|
||||
if (item != null) item.setVisible(visible);
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
private void showExpiryWarning(ExpiryWarning expiry) {
|
||||
int daysUntilExpiry = getDaysUntilExpiry();
|
||||
|
||||
@@ -82,10 +82,12 @@ import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.LogUtils.now;
|
||||
import static org.briarproject.bramble.util.StringUtils.join;
|
||||
import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_DARK_THEME;
|
||||
import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_PIN_LOCK;
|
||||
import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_SIGN_IN_REMINDER;
|
||||
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_RINGTONE;
|
||||
import static org.briarproject.briar.android.navdrawer.NavDrawerActivity.INTENT_SIGN_OUT;
|
||||
import static org.briarproject.briar.android.util.UiUtils.hasScreenLock;
|
||||
import static org.briarproject.briar.api.android.AndroidNotificationManager.BLOG_CHANNEL_ID;
|
||||
import static org.briarproject.briar.api.android.AndroidNotificationManager.CONTACT_CHANNEL_ID;
|
||||
import static org.briarproject.briar.api.android.AndroidNotificationManager.FORUM_CHANNEL_ID;
|
||||
@@ -109,6 +111,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
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 NOTIFY_SIGN_IN = "pref_key_notify_sign_in";
|
||||
public static final String TOR_LOCATION = "pref_key_tor_location";
|
||||
|
||||
@@ -120,13 +123,13 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
private ListPreference enableBluetooth;
|
||||
private ListPreference torNetwork;
|
||||
private SwitchPreference torBlocked;
|
||||
private SwitchPreference screenLock;
|
||||
private SwitchPreference notifyPrivateMessages;
|
||||
private SwitchPreference notifyGroupMessages;
|
||||
private SwitchPreference notifyForumPosts;
|
||||
private SwitchPreference notifyBlogPosts;
|
||||
private SwitchPreference notifyVibration;
|
||||
private SwitchPreference notifyLockscreen;
|
||||
|
||||
private Preference notifySound;
|
||||
|
||||
// Fields that are accessed from background threads must be volatile
|
||||
@@ -162,6 +165,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
setBlockedCountries();
|
||||
SwitchPreference notifySignIn =
|
||||
(SwitchPreference) findPreference(NOTIFY_SIGN_IN);
|
||||
screenLock = (SwitchPreference) findPreference(PREF_SCREEN_LOCK);
|
||||
notifyPrivateMessages = (SwitchPreference) findPreference(
|
||||
"pref_key_notify_private_messages");
|
||||
notifyGroupMessages = (SwitchPreference) findPreference(
|
||||
@@ -176,8 +180,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
"pref_key_notify_lock_screen");
|
||||
notifySound = findPreference("pref_key_notify_sound");
|
||||
|
||||
setSettingsEnabled(false);
|
||||
|
||||
language.setOnPreferenceChangeListener(this);
|
||||
theme.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
if (getActivity() != null) {
|
||||
@@ -200,6 +202,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
enableBluetooth.setOnPreferenceChangeListener(this);
|
||||
torNetwork.setOnPreferenceChangeListener(this);
|
||||
torBlocked.setOnPreferenceChangeListener(this);
|
||||
screenLock.setOnPreferenceChangeListener(this);
|
||||
if (SDK_INT >= 21) {
|
||||
notifyLockscreen.setVisible(true);
|
||||
notifyLockscreen.setOnPreferenceChangeListener(this);
|
||||
@@ -220,6 +223,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
} else {
|
||||
theme.setVisible(FEATURE_FLAG_DARK_THEME);
|
||||
notifySignIn.setVisible(FEATURE_FLAG_SIGN_IN_REMINDER);
|
||||
screenLock.setVisible(FEATURE_FLAG_PIN_LOCK);
|
||||
|
||||
findPreference("pref_key_explode").setVisible(false);
|
||||
findPreference("pref_key_test_data").setVisible(false);
|
||||
@@ -229,7 +233,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
testing.setVisible(false);
|
||||
}
|
||||
|
||||
loadSettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -246,6 +249,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
eventBus.addListener(this);
|
||||
setSettingsEnabled(false);
|
||||
loadSettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -354,6 +359,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
enableBluetooth.setValue(Boolean.toString(btSetting));
|
||||
torNetwork.setValue(Integer.toString(torNetworkSetting));
|
||||
torBlocked.setChecked(torBlockedSetting);
|
||||
displayScreenLockSetting();
|
||||
|
||||
if (SDK_INT < 26) {
|
||||
notifyPrivateMessages.setChecked(settings.getBoolean(
|
||||
@@ -411,9 +417,12 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
// preferences not needed here, because handled by SharedPreferences:
|
||||
// - pref_key_theme
|
||||
// - pref_key_notify_sign_in
|
||||
// preferences partly needed here, because they have their own logic
|
||||
// - pref_key_lock (screenLock -> displayScreenLockSetting())
|
||||
enableBluetooth.setEnabled(enabled);
|
||||
torNetwork.setEnabled(enabled);
|
||||
torBlocked.setEnabled(enabled);
|
||||
if (!enabled) screenLock.setEnabled(false);
|
||||
notifyPrivateMessages.setEnabled(enabled);
|
||||
notifyGroupMessages.setEnabled(enabled);
|
||||
notifyForumPosts.setEnabled(enabled);
|
||||
@@ -423,6 +432,23 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
notifySound.setEnabled(enabled);
|
||||
}
|
||||
|
||||
private void displayScreenLockSetting() {
|
||||
if (SDK_INT < 21) {
|
||||
screenLock.setVisible(false);
|
||||
} else {
|
||||
if (getActivity() != null && hasScreenLock(getActivity())) {
|
||||
screenLock.setEnabled(true);
|
||||
screenLock.setChecked(
|
||||
settings.getBoolean(PREF_SCREEN_LOCK, false));
|
||||
screenLock.setSummary(R.string.pref_lock_summary);
|
||||
} else {
|
||||
screenLock.setEnabled(false);
|
||||
screenLock.setChecked(false);
|
||||
screenLock.setSummary(R.string.pref_lock_disabled_summary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(26)
|
||||
private void setupNotificationPreference(SwitchPreference pref,
|
||||
String channelId, @StringRes int summary) {
|
||||
@@ -478,6 +504,10 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
||||
} else if (preference == torBlocked) {
|
||||
boolean torBlockedSetting = (Boolean) newValue;
|
||||
storeTorBlockedSetting(torBlockedSetting);
|
||||
} else if (preference == screenLock) {
|
||||
Settings s = new Settings();
|
||||
s.putBoolean(PREF_SCREEN_LOCK, (Boolean) newValue);
|
||||
storeSettings(s);
|
||||
} else if (preference == notifyPrivateMessages) {
|
||||
Settings s = new Settings();
|
||||
s.putBoolean(PREF_NOTIFY_PRIVATE, (Boolean) newValue);
|
||||
|
||||
@@ -14,6 +14,8 @@ import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
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;
|
||||
|
||||
@@ -29,6 +31,8 @@ public class SplashScreenActivity extends BaseActivity {
|
||||
@Inject
|
||||
protected AccountManager accountManager;
|
||||
@Inject
|
||||
protected LockManager lockManager;
|
||||
@Inject
|
||||
protected AndroidExecutor androidExecutor;
|
||||
|
||||
@Override
|
||||
@@ -44,7 +48,16 @@ public class SplashScreenActivity extends BaseActivity {
|
||||
setContentView(R.layout.splash);
|
||||
|
||||
if (accountManager.hasDatabaseKey()) {
|
||||
startActivity(new Intent(this, OpenDatabaseActivity.class));
|
||||
Intent i;
|
||||
if (lockManager.isLocked()) {
|
||||
// The database needs to be opened for the app to be locked.
|
||||
// Start main activity right away. It will open UnlockActivity.
|
||||
// Otherwise, we would end up with two screen unlock inputs.
|
||||
i = new Intent(this, NavDrawerActivity.class);
|
||||
} else {
|
||||
i = new Intent(this, OpenDatabaseActivity.class);
|
||||
}
|
||||
startActivity(i);
|
||||
finish();
|
||||
} else {
|
||||
new Handler().postDelayed(() -> {
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.briarproject.briar.android.util;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.KeyguardManager;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface.OnClickListener;
|
||||
import android.content.Intent;
|
||||
@@ -36,6 +37,7 @@ import org.briarproject.briar.android.widget.LinkDialogFragment;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static android.content.Context.KEYGUARD_SERVICE;
|
||||
import static android.content.Context.POWER_SERVICE;
|
||||
import static android.content.Intent.CATEGORY_DEFAULT;
|
||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
||||
@@ -229,4 +231,15 @@ public class UiUtils {
|
||||
return ContextCompat.getColor(ctx, color);
|
||||
}
|
||||
|
||||
public static boolean hasScreenLock(Context ctx) {
|
||||
if (SDK_INT < 21) return false;
|
||||
KeyguardManager keyguardManager =
|
||||
(KeyguardManager) ctx.getSystemService(KEYGUARD_SERVICE);
|
||||
if (keyguardManager == null) return false;
|
||||
// check if there's a lock mechanism we can use
|
||||
// first one is true if SIM card is locked, so use second if available
|
||||
return (SDK_INT < 23 && keyguardManager.isKeyguardSecure()) ||
|
||||
(SDK_INT >= 23 && keyguardManager.isDeviceSecure());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.briarproject.briar.api.android;
|
||||
|
||||
import android.app.Notification;
|
||||
|
||||
import org.briarproject.bramble.api.contact.ContactId;
|
||||
import org.briarproject.bramble.api.sync.GroupId;
|
||||
|
||||
@@ -52,6 +54,10 @@ public interface AndroidNotificationManager {
|
||||
// Actions for pending intents
|
||||
String ACTION_DISMISS_REMINDER = "dismissReminder";
|
||||
|
||||
Notification getForegroundNotification();
|
||||
|
||||
void updateForegroundNotification(boolean locked);
|
||||
|
||||
void clearContactNotification(ContactId c);
|
||||
|
||||
void clearAllContactNotifications();
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package org.briarproject.briar.api.android;
|
||||
|
||||
import android.arch.lifecycle.LiveData;
|
||||
import android.support.annotation.UiThread;
|
||||
|
||||
public interface LockManager {
|
||||
|
||||
/**
|
||||
* Returns an observable LiveData to indicate whether the app can be locked.
|
||||
*/
|
||||
LiveData<Boolean> isLockable();
|
||||
|
||||
/**
|
||||
* Updates the LiveData returned by {@link #isLockable()}.
|
||||
* It checks whether a device screen lock is available and
|
||||
* whether the app setting is checked.
|
||||
*/
|
||||
@UiThread
|
||||
void checkIfLockable();
|
||||
|
||||
/**
|
||||
* Returns true if app is currently locked, false otherwise.
|
||||
* If the device's screen lock was removed while the app was locked,
|
||||
* calling this will unlock the app automatically.
|
||||
*/
|
||||
boolean isLocked();
|
||||
|
||||
/**
|
||||
* Locks the app if true is passed, otherwise unlocks the app.
|
||||
*/
|
||||
void setLocked(boolean locked);
|
||||
|
||||
}
|
||||
49
briar-android/src/main/res/layout/activity_unlock.xml
Normal file
49
briar-android/src/main/res/layout/activity_unlock.xml
Normal file
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.constraint.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
tools:context=".android.login.UnlockActivity">
|
||||
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="150dp"
|
||||
android:layout_margin="@dimen/margin_large"
|
||||
android:src="@drawable/splash_screen"
|
||||
app:layout_constraintBottom_toTopOf="@+id/is_locked"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="spread"
|
||||
app:tint="?attr/colorControlNormal"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/is_locked"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_large"
|
||||
android:gravity="center"
|
||||
android:text="@string/lock_is_locked"
|
||||
android:textSize="@dimen/text_size_xlarge"
|
||||
app:layout_constraintBottom_toTopOf="@+id/unlock"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/image"
|
||||
app:layout_constraintVertical_chainStyle="spread"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/unlock"
|
||||
style="@style/BriarButton"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_large"
|
||||
android:text="@string/lock_unlock"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
@@ -26,6 +26,11 @@
|
||||
android:id="@+id/nav_btn_settings"
|
||||
android:icon="@drawable/ic_settings_black_24dp"
|
||||
android:title="@string/settings_button"/>
|
||||
<item
|
||||
android:id="@+id/nav_btn_lock"
|
||||
android:icon="@drawable/startup_lock"
|
||||
android:title="@string/lock_button"
|
||||
android:visible="false"/>
|
||||
<item
|
||||
android:id="@+id/nav_btn_signout"
|
||||
android:icon="@drawable/ic_signout"
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
<string name="security_settings_title">Seguridá</string>
|
||||
<string name="panic_setting">Configuración del Botón d\'espantu</string>
|
||||
<string name="panic_setting_title">Botón d\'espantu</string>
|
||||
<string name="lock_setting_title">Colar</string>
|
||||
<string name="panic_setting_signout_title">Colar</string>
|
||||
<string name="uninstall_setting_title">Desinstalar Briar</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">Avisos</string>
|
||||
|
||||
@@ -271,8 +271,8 @@
|
||||
<string name="panic_app_setting_none">Няма</string>
|
||||
<string name="dialog_title_connect_panic_app">Потвърждение на паник приложение</string>
|
||||
<string name="dialog_message_connect_panic_app">Сигурни ли сте, че искате да позволите на %1$s да задейства унищожителни действия на паник бутон?</string>
|
||||
<string name="lock_setting_title">Отписване</string>
|
||||
<string name="lock_setting_summary">Отписване от Briar, ако паник бутонът е натиснат</string>
|
||||
<string name="panic_setting_signout_title">Отписване</string>
|
||||
<string name="panic_setting_signout_summary">Отписване от Briar, ако паник бутонът е натиснат</string>
|
||||
<string name="purge_setting_title">Изтриване на профил</string>
|
||||
<string name="purge_setting_summary">Изтриване на Briar профила, ако паник бутонът е натиснат. Внимание: Изтрива завинаги вашия профил, контакти и съобщения</string>
|
||||
<string name="uninstall_setting_title">Деинсталиране на Briar</string>
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
<string name="change_password">Cheñch ar ger-tremen</string>
|
||||
<string name="confirm_new_password">Kadarnaat ar ger-tremen nevez</string>
|
||||
<string name="panic_app_setting_none">Hini ebet</string>
|
||||
<string name="lock_setting_title">Digevreañ</string>
|
||||
<string name="panic_setting_signout_title">Digevreañ</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notify_sound_setting_disabled">Hini ebet</string>
|
||||
<!--Settings Feedback-->
|
||||
|
||||
@@ -343,8 +343,8 @@
|
||||
<string name="panic_app_setting_none">Cap</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirmeu l\'aplicació de pànic</string>
|
||||
<string name="dialog_message_connect_panic_app">Segur que voleu permetre que %1$s desencadeni accions destructives a conseqüència del botó de pànic?</string>
|
||||
<string name="lock_setting_title">Tanca la sessió</string>
|
||||
<string name="lock_setting_summary">Tanca la sessió de Briar si es prem un botó de pànic</string>
|
||||
<string name="panic_setting_signout_title">Tanca la sessió</string>
|
||||
<string name="panic_setting_signout_summary">Tanca la sessió de Briar si es prem un botó de pànic</string>
|
||||
<string name="purge_setting_title">Esborreu el compte</string>
|
||||
<string name="purge_setting_summary">Suprimeix el compte de Briar si es prem el botó de pànic. Atenció: En aquest cas, s\'eliminarien permanentment les vostres identitats, contactes i missatges</string>
|
||||
<string name="uninstall_setting_title">Desinstal·leu Briar</string>
|
||||
|
||||
@@ -346,8 +346,8 @@
|
||||
<string name="panic_app_setting_none">Žádný</string>
|
||||
<string name="dialog_title_connect_panic_app">Potvrdit aplikaci Paniky</string>
|
||||
<string name="dialog_message_connect_panic_app">Jste si jisti, že chcete povolit %1$s spustit akci zneškodnění pomocí tlačítka paniky?</string>
|
||||
<string name="lock_setting_title">Odhlásit se</string>
|
||||
<string name="lock_setting_summary">Odhlásit se z Briar, pokud je stisknuto tlačítko paniky</string>
|
||||
<string name="panic_setting_signout_title">Odhlásit se</string>
|
||||
<string name="panic_setting_signout_summary">Odhlásit se z Briar, pokud je stisknuto tlačítko paniky</string>
|
||||
<string name="purge_setting_title">Odstranit účet</string>
|
||||
<string name="purge_setting_summary">Vymazat váš Briar účet pokud je stlačeno tlačítko paniky. Upozornění: Toto trvale vymaže vaši identitu, kontakty a zprávy</string>
|
||||
<string name="uninstall_setting_title">Odinstalovat Briar</string>
|
||||
|
||||
@@ -333,8 +333,8 @@
|
||||
<string name="panic_app_setting_none">Keine</string>
|
||||
<string name="dialog_title_connect_panic_app">Bestätige Panik-App</string>
|
||||
<string name="dialog_message_connect_panic_app">Bist du sicher, dass du %1$s erlauben willst, Panik-Button-Ereignisse auszulösen? Dies kann zum Löschen von Daten führen.</string>
|
||||
<string name="lock_setting_title">Abmelden</string>
|
||||
<string name="lock_setting_summary">Von Briar abmelden, wenn ein Panik-Button aktiviert wird</string>
|
||||
<string name="panic_setting_signout_title">Abmelden</string>
|
||||
<string name="panic_setting_signout_summary">Von Briar abmelden, wenn ein Panik-Button aktiviert wird</string>
|
||||
<string name="purge_setting_title">Konto löschen</string>
|
||||
<string name="purge_setting_summary">Briar-Konto löschen, wenn der Panik-Button gedrückt wird. Achtung: Es werden alle Identitäten, Kontakte und Nachrichten unwiderruflich gelöscht.</string>
|
||||
<string name="uninstall_setting_title">Briar deinstallieren</string>
|
||||
|
||||
@@ -327,8 +327,8 @@
|
||||
<string name="panic_app_setting_none">Ninguna</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirmar aplicación de pánico</string>
|
||||
<string name="dialog_message_connect_panic_app">¿Seguro que quieres permitir que %1$s lance acciones destructivas de botón de pánico?</string>
|
||||
<string name="lock_setting_title">Cerrar sesión</string>
|
||||
<string name="lock_setting_summary">Cerrar la sesión de Briar si se pulsa un botón de pánico</string>
|
||||
<string name="panic_setting_signout_title">Cerrar sesión</string>
|
||||
<string name="panic_setting_signout_summary">Cerrar la sesión de Briar si se pulsa un botón de pánico</string>
|
||||
<string name="purge_setting_title">Eliminar cuenta</string>
|
||||
<string name="purge_setting_summary">Eliminar tu cuenta de Briar si se pulsa un botón de pánico. Advertencia: esto eliminará permanentemente tus identidades, contactos y mensajes</string>
|
||||
<string name="uninstall_setting_title">Desinstalar Briar</string>
|
||||
|
||||
@@ -343,8 +343,8 @@
|
||||
<string name="panic_app_setting_none">Bat ere ez</string>
|
||||
<string name="dialog_title_connect_panic_app">Berretsi larrialdi-aplikazioa</string>
|
||||
<string name="dialog_message_connect_panic_app">Ziur %1$s baimendu nahi duzula larrialdi botoiaren ekintza suntsitzaileak burutzea?</string>
|
||||
<string name="lock_setting_title">Amaitu saioa</string>
|
||||
<string name="lock_setting_summary">Amaitu saioa larrialdi botoia zapaltzen bada</string>
|
||||
<string name="panic_setting_signout_title">Amaitu saioa</string>
|
||||
<string name="panic_setting_signout_summary">Amaitu saioa larrialdi botoia zapaltzen bada</string>
|
||||
<string name="purge_setting_title">Ezabatu kontua</string>
|
||||
<string name="purge_setting_summary">Ezabatu kontua Briar larrialdi botoia zapaltzen bada. Kontuz: Honek behin betiko ezabatuko ditu zure identitateak, kontaktuak eta mezuak</string>
|
||||
<string name="uninstall_setting_title">Desinstalatu Briar</string>
|
||||
|
||||
@@ -382,8 +382,8 @@
|
||||
<string name="panic_app_setting_none">هیچکدام</string>
|
||||
<string name="dialog_title_connect_panic_app">تایید برنامه هراس</string>
|
||||
<string name="dialog_message_connect_panic_app">آیا مطمئن هستید که میخواهید به %1$s اجازه دهید تا باعث عملیات مخرب دکمه هراس بشود؟</string>
|
||||
<string name="lock_setting_title">خروج</string>
|
||||
<string name="lock_setting_summary">در صورت کلیک بر روی کلید هراس از برایر خارج شو</string>
|
||||
<string name="panic_setting_signout_title">خروج</string>
|
||||
<string name="panic_setting_signout_summary">در صورت کلیک بر روی کلید هراس از برایر خارج شو</string>
|
||||
<string name="purge_setting_title">حذف حساب کاربری</string>
|
||||
<string name="purge_setting_summary">پاک کردن حساب کاربری برایر شما در صورتی که دکمه هراس فشار داده شود. اخطار: این باعث پاک شدن دائمی تمام هویت ها، مخاطبان و پیام های شما خواهد شد</string>
|
||||
<string name="uninstall_setting_title">پاک کردن برایر</string>
|
||||
|
||||
@@ -343,8 +343,8 @@
|
||||
<string name="panic_app_setting_none">Ei mitään</string>
|
||||
<string name="dialog_title_connect_panic_app">Vahvista paniikkisovellus</string>
|
||||
<string name="dialog_message_connect_panic_app">Oletko varma, että haluat myöntää ohjelmalle %1$s luvan laukaista tuhoa aiheuttavia paniikkinapin toimintoja?</string>
|
||||
<string name="lock_setting_title">Kirjaudu ulos</string>
|
||||
<string name="lock_setting_summary">Kirjaudu ulos Briarista jos paniikkinappia on painettu</string>
|
||||
<string name="panic_setting_signout_title">Kirjaudu ulos</string>
|
||||
<string name="panic_setting_signout_summary">Kirjaudu ulos Briarista jos paniikkinappia on painettu</string>
|
||||
<string name="purge_setting_title">Poista tili</string>
|
||||
<string name="purge_setting_summary">Poista Briar tilisi jos paniikkinappia on painettu. Varoitus: Tämä tulee pysyvästi poistamaan sinun tunnukset, yhteystiedot ja viestit</string>
|
||||
<string name="uninstall_setting_title">Poista Briarin asennus</string>
|
||||
|
||||
@@ -343,8 +343,8 @@
|
||||
<string name="panic_app_setting_none">Aucune</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirmer l’application d’urgence</string>
|
||||
<string name="dialog_message_connect_panic_app">Voulez-vous vraiment autoriser %1$s à déclencher les actions destructrices du bouton d’urgence ?</string>
|
||||
<string name="lock_setting_title">Déconnexion</string>
|
||||
<string name="lock_setting_summary">Se déconnecter de Briar lorsqu’on appuie sur un bouton d’urgence</string>
|
||||
<string name="panic_setting_signout_title">Déconnexion</string>
|
||||
<string name="panic_setting_signout_summary">Se déconnecter de Briar lorsqu’on appuie sur un bouton d’urgence</string>
|
||||
<string name="purge_setting_title">Supprimer le compte</string>
|
||||
<string name="purge_setting_summary">Supprimer votre compte Briar lorsqu’on appuie sur un bouton d’urgence. Attention : cela supprimera définitivement vos identités, contacts et messages</string>
|
||||
<string name="uninstall_setting_title">Désinstaller Briar</string>
|
||||
|
||||
@@ -341,8 +341,8 @@
|
||||
<string name="panic_app_setting_none">Ningún</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirme a App do pánico</string>
|
||||
<string name="dialog_message_connect_panic_app">Está segura de querer permitir a %1$s activar accións destrutivas do botón do pánico?</string>
|
||||
<string name="lock_setting_title">Finalizar sesión</string>
|
||||
<string name="lock_setting_summary">Desconecte de Briar si o botón do pánico se preme</string>
|
||||
<string name="panic_setting_signout_title">Finalizar sesión</string>
|
||||
<string name="panic_setting_signout_summary">Desconecte de Briar si o botón do pánico se preme</string>
|
||||
<string name="purge_setting_title">Eliminar conta</string>
|
||||
<string name="purge_setting_summary">Elimina a súa conta en Briar si se preme o botón do pánico. Coidado: Esto eliminará permanentemente as súas identidade, contactos e mensaxes</string>
|
||||
<string name="uninstall_setting_title">Desinstalar Briar</string>
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
<string name="security_settings_title">אבטחה</string>
|
||||
<string name="choose_new_password">סיסמא חדשה</string>
|
||||
<string name="panic_app_setting_none">כלום</string>
|
||||
<string name="lock_setting_title">יציאה</string>
|
||||
<string name="panic_setting_signout_title">יציאה</string>
|
||||
<string name="purge_setting_title">מחק חשבון</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">הודעות מערכת</string>
|
||||
|
||||
@@ -327,8 +327,8 @@
|
||||
<string name="panic_app_setting_none">कुछ भी नहीं</string>
|
||||
<string name="dialog_title_connect_panic_app">आतंक ऐप की पुष्टि करें</string>
|
||||
<string name="dialog_message_connect_panic_app">क्या आप निश्चित हैं कि आप%1$s को विनाशकारी आतंक बटन क्रियाओं को ट्रिगर करने की अनुमति देना चाहते हैं?</string>
|
||||
<string name="lock_setting_title">साइन आउट</string>
|
||||
<string name="lock_setting_summary">यदि कोई आतंक बटन दबाया जाता है तो बियर से साइन आउट करें</string>
|
||||
<string name="panic_setting_signout_title">साइन आउट</string>
|
||||
<string name="panic_setting_signout_summary">यदि कोई आतंक बटन दबाया जाता है तो बियर से साइन आउट करें</string>
|
||||
<string name="purge_setting_title">खाता हटा दो</string>
|
||||
<string name="purge_setting_summary">यदि आपका आतंक बटन दबाया गया हो तो अपने ब्रियर खाते को हटा दें। सावधानी: यह आपकी पहचान, संपर्क और संदेश को स्थायी रूप से हटा देगा</string>
|
||||
<string name="uninstall_setting_title">बरिअर की स्थापना रद्द करें</string>
|
||||
|
||||
@@ -343,8 +343,8 @@
|
||||
<string name="panic_app_setting_none">Nessuno</string>
|
||||
<string name="dialog_title_connect_panic_app">Conferma App Panico</string>
|
||||
<string name="dialog_message_connect_panic_app">Sei sicuro di voler consentire %1$s di attivare le azioni distruttive del pulsante panico?</string>
|
||||
<string name="lock_setting_title">Esci</string>
|
||||
<string name="lock_setting_summary">Uscire da Briar se viene premuto un pulsante di panico</string>
|
||||
<string name="panic_setting_signout_title">Esci</string>
|
||||
<string name="panic_setting_signout_summary">Uscire da Briar se viene premuto un pulsante di panico</string>
|
||||
<string name="purge_setting_title">Elimina Account</string>
|
||||
<string name="purge_setting_summary">Cancella il tuo account Briar se un panic button è premuto. Attenzione: ciò cancellerà permanentemente le tue identità, contatti e messaggi</string>
|
||||
<string name="uninstall_setting_title">Disinstalla Briar</string>
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
<string name="change_password">パスワードの変更</string>
|
||||
<string name="confirm_new_password">新しいパスワードの確認</string>
|
||||
<string name="panic_app_setting_none">なし</string>
|
||||
<string name="lock_setting_title">サインアウト</string>
|
||||
<string name="panic_setting_signout_title">サインアウト</string>
|
||||
<string name="purge_setting_title">アカウントを削除</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">通知</string>
|
||||
|
||||
@@ -296,8 +296,8 @@
|
||||
<string name="panic_app_setting_none">Inget</string>
|
||||
<string name="dialog_title_connect_panic_app">Bekreft panikk-knapp-program</string>
|
||||
<string name="dialog_message_connect_panic_app">Er du sikker på at du vil tillate %1$s å utløse destruktive panikk-knapp-handlinger?</string>
|
||||
<string name="lock_setting_title">Logg ut</string>
|
||||
<string name="lock_setting_summary">Logg ut av Briar hvis panikk-knappen trykkes</string>
|
||||
<string name="panic_setting_signout_title">Logg ut</string>
|
||||
<string name="panic_setting_signout_summary">Logg ut av Briar hvis panikk-knappen trykkes</string>
|
||||
<string name="purge_setting_title">Slett konto</string>
|
||||
<string name="purge_setting_summary">Slett Briar-kontoen din hvis panikk-knappen trykkes. Advarsel: Dette vil slette dine identiteter, kontakter og meldinger for godt.</string>
|
||||
<string name="uninstall_setting_title">Avinstaller Briar</string>
|
||||
|
||||
@@ -343,8 +343,8 @@
|
||||
<string name="panic_app_setting_none">Geen</string>
|
||||
<string name="dialog_title_connect_panic_app">Bevestig paniekapp</string>
|
||||
<string name="dialog_message_connect_panic_app">Weet je zeker dat je wil toestaan dat %1$s destructieve paniekknopacties mag veroorzaken?</string>
|
||||
<string name="lock_setting_title">Log uit</string>
|
||||
<string name="lock_setting_summary">Log uit op Briar als de paniekknop wordt ingedrukt.</string>
|
||||
<string name="panic_setting_signout_title">Log uit</string>
|
||||
<string name="panic_setting_signout_summary">Log uit op Briar als de paniekknop wordt ingedrukt.</string>
|
||||
<string name="purge_setting_title">Verwijder account</string>
|
||||
<string name="purge_setting_summary">Verwijder je Briar-account als een paniekknop wordt ingedrukt. Let op: Dit zal permanent je identiteit, contacten en berichten verwijderen.</string>
|
||||
<string name="uninstall_setting_title">Deïnstalleer Briar</string>
|
||||
|
||||
@@ -309,8 +309,8 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
||||
<string name="panic_app_setting_none">Cap</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirmar l’aplicacion Urgéncia</string>
|
||||
<string name="dialog_message_connect_panic_app">Sètz segur de voler autorizar %1$s a aviar las accions de destruccion del boton Urgéncia ?</string>
|
||||
<string name="lock_setting_title">Se desconnectar</string>
|
||||
<string name="lock_setting_summary">Se desconnectar de Briar en apiejant lo boton Urgéncia ?</string>
|
||||
<string name="panic_setting_signout_title">Se desconnectar</string>
|
||||
<string name="panic_setting_signout_summary">Se desconnectar de Briar en apiejant lo boton Urgéncia ?</string>
|
||||
<string name="purge_setting_title">Suprimir lo compte</string>
|
||||
<string name="purge_setting_summary">Suprimir vòstre compte en apiejant lo boton Urgéncia. Mèfi, aquò escafarà per totjorn vòstra identitat, vòstres contactes e messatges.</string>
|
||||
<string name="uninstall_setting_title">Desinstallar Briar</string>
|
||||
|
||||
@@ -361,8 +361,8 @@
|
||||
<string name="panic_app_setting_none">Brak</string>
|
||||
<string name="dialog_title_connect_panic_app">Potwierdź Awaryjną Aplikację</string>
|
||||
<string name="dialog_message_connect_panic_app">Czy na pewno chcesz pozwolić %1$s aby działała jako przycisk wyjścia awaryjnego?</string>
|
||||
<string name="lock_setting_title">Wyloguj się</string>
|
||||
<string name="lock_setting_summary">Wyloguj się z Briar jeśli przycisk zostanie wciśnięty</string>
|
||||
<string name="panic_setting_signout_title">Wyloguj się</string>
|
||||
<string name="panic_setting_signout_summary">Wyloguj się z Briar jeśli przycisk zostanie wciśnięty</string>
|
||||
<string name="purge_setting_title">Skasuj Konto</string>
|
||||
<string name="purge_setting_summary">Skasuj Twoje konto Briar jeśli przycisk wyjścia awaryjnego zostanie wciśnięty. Ostrzeżenie: Ta akcja usunie permanentnie Twoje konto, kontakty i wiadomości</string>
|
||||
<string name="uninstall_setting_title">Odinstaluj Briar</string>
|
||||
|
||||
@@ -332,8 +332,8 @@
|
||||
<string name="panic_app_setting_none">Nenhum</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirmar aplicativo de pânico</string>
|
||||
<string name="dialog_message_connect_panic_app">Você tem certeza que quer permitir que %1$s ative ações destrutivas do botão de pânico?</string>
|
||||
<string name="lock_setting_title">Desconectar</string>
|
||||
<string name="lock_setting_summary">Desconectar do Briar se o botão de pânico for apertado</string>
|
||||
<string name="panic_setting_signout_title">Desconectar</string>
|
||||
<string name="panic_setting_signout_summary">Desconectar do Briar se o botão de pânico for apertado</string>
|
||||
<string name="purge_setting_title">Apagar conta</string>
|
||||
<string name="purge_setting_summary">Apagar sua conta do Briar se o botão de pânico for apertado. Atenção: isso irá apagar permanentemente suas identidades, contatos e mensagens</string>
|
||||
<string name="uninstall_setting_title">Desinstalar o Briar</string>
|
||||
|
||||
@@ -354,8 +354,8 @@
|
||||
<string name="panic_app_setting_none">Nici una</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirmare aplicație de panică</string>
|
||||
<string name="dialog_message_connect_panic_app">Sigur doriți să permiteți %1$s să declanșeze acțiuni destructive pentru butonul de panică?</string>
|
||||
<string name="lock_setting_title">Ieșire</string>
|
||||
<string name="lock_setting_summary">Ieși din Briar dacă un buton de panică este apăsat</string>
|
||||
<string name="panic_setting_signout_title">Ieșire</string>
|
||||
<string name="panic_setting_signout_summary">Ieși din Briar dacă un buton de panică este apăsat</string>
|
||||
<string name="purge_setting_title">Șterge cont</string>
|
||||
<string name="purge_setting_summary">Ștergeți contul Briar dacă este apăsat buton de panică. Atenție: aceasta va șterge definitiv identitatea, contactele și mesajele dvs.</string>
|
||||
<string name="uninstall_setting_title">Dezinstalare Briar</string>
|
||||
|
||||
@@ -363,8 +363,8 @@
|
||||
<string name="panic_app_setting_none">Нет</string>
|
||||
<string name="dialog_title_connect_panic_app">Подтвердить приложение тревожной кнопки</string>
|
||||
<string name="dialog_message_connect_panic_app">Вы уверены, что хотите разрешить %1$s запускать действия тревожной кнопки?</string>
|
||||
<string name="lock_setting_title">Выйти</string>
|
||||
<string name="lock_setting_summary">Выйти из Briar, если нажата тревожная кнопка</string>
|
||||
<string name="panic_setting_signout_title">Выйти</string>
|
||||
<string name="panic_setting_signout_summary">Выйти из Briar, если нажата тревожная кнопка</string>
|
||||
<string name="purge_setting_title">Удалить аккаунт</string>
|
||||
<string name="purge_setting_summary">Удалить вашу учетную запись Briar при нажатии тревожной кнопки. Внимание: это необратимо удалит ваши идентификаторы, контакты и сообщения</string>
|
||||
<string name="uninstall_setting_title">Удалить Briar</string>
|
||||
|
||||
@@ -343,8 +343,8 @@
|
||||
<string name="panic_app_setting_none">Asnjë</string>
|
||||
<string name="dialog_title_connect_panic_app">Ripohoni Aplikacion Paniku</string>
|
||||
<string name="dialog_message_connect_panic_app">Jeni i sigurt se doni të lejohet %1$s të prodhojë veprime shkatërruese butoni paniku?</string>
|
||||
<string name="lock_setting_title">Dilni</string>
|
||||
<string name="lock_setting_summary">Dil nga Briar-i nëse shtypet një buton paniku</string>
|
||||
<string name="panic_setting_signout_title">Dilni</string>
|
||||
<string name="panic_setting_signout_summary">Dil nga Briar-i nëse shtypet një buton paniku</string>
|
||||
<string name="purge_setting_title">Fshi Llogarinë</string>
|
||||
<string name="purge_setting_summary">Fshijeni llogarinë tuaj Briar, nëse shtypet një buton paniku. Kujdes: Kjo do të shkaktojë fshirjen e identiteteve, kontakteve dhe mesazheve tuaj</string>
|
||||
<string name="uninstall_setting_title">Çinstalo Briar-in</string>
|
||||
|
||||
@@ -237,8 +237,8 @@
|
||||
<string name="panic_app_setting_none">Ništa</string>
|
||||
<string name="dialog_title_connect_panic_app">Potvrdi Panic App</string>
|
||||
<string name="dialog_message_connect_panic_app">Jeste li sigurni da želite da dozvolite %1$s da pokrene destruktivne akcije panik dugmeta?</string>
|
||||
<string name="lock_setting_title">Izlogujte se</string>
|
||||
<string name="lock_setting_summary">Izloguj se iz Briar-a ako je pritisnuto panik dugme</string>
|
||||
<string name="panic_setting_signout_title">Izlogujte se</string>
|
||||
<string name="panic_setting_signout_summary">Izloguj se iz Briar-a ako je pritisnuto panik dugme</string>
|
||||
<string name="purge_setting_title">Izbriši račun</string>
|
||||
<string name="purge_setting_summary">Izbriši Briar račun ako je panik dugme pritisnuto. Pažnja: Ovo će permanentno izbrisati vaše identitete, kontakte i poruke</string>
|
||||
<string name="uninstall_setting_title">Deinstaliraj Briar</string>
|
||||
|
||||
@@ -129,8 +129,8 @@
|
||||
<string name="choose_new_password">Nytt lösenord</string>
|
||||
<string name="confirm_new_password">Bekräfta nytt lösenord</string>
|
||||
<string name="panic_app_setting_none">Ingen</string>
|
||||
<string name="lock_setting_title">Logga ut</string>
|
||||
<string name="lock_setting_summary">Logga ut från Briar om panikknappen tryckts</string>
|
||||
<string name="panic_setting_signout_title">Logga ut</string>
|
||||
<string name="panic_setting_signout_summary">Logga ut från Briar om panikknappen tryckts</string>
|
||||
<string name="purge_setting_title">Radera kontot</string>
|
||||
<string name="uninstall_setting_title">Avinstallera Briar</string>
|
||||
<!--Settings Notifications-->
|
||||
|
||||
@@ -264,8 +264,8 @@
|
||||
<string name="panic_app_setting_none">Yok</string>
|
||||
<string name="dialog_title_connect_panic_app">Panik Uygulaması Doğrulama</string>
|
||||
<string name="dialog_message_connect_panic_app">%1$s kişisinin yıkıcı panik düğmesi eylemlerini tetiklemesine izin vermek istediğinizden emin misiniz?</string>
|
||||
<string name="lock_setting_title">Çıkış Yap</string>
|
||||
<string name="lock_setting_summary">Panik Butonuna basıldığında Briar\'dan çıkış yap</string>
|
||||
<string name="panic_setting_signout_title">Çıkış Yap</string>
|
||||
<string name="panic_setting_signout_summary">Panik Butonuna basıldığında Briar\'dan çıkış yap</string>
|
||||
<string name="purge_setting_title">Hesabı Sil</string>
|
||||
<string name="purge_setting_summary">Bir panik düğmesine basıldığında Briar hesabınızı silin. Dikkat: Bu, kimliklerinizi, kayıtlarınızı ve iletilerinizi kalıcı olarak silecektir.</string>
|
||||
<string name="uninstall_setting_title">Briar\'ı Kaldır</string>
|
||||
|
||||
@@ -333,8 +333,8 @@
|
||||
<string name="panic_app_setting_none">无</string>
|
||||
<string name="dialog_title_connect_panic_app">确认应急应用</string>
|
||||
<string name="dialog_message_connect_panic_app">是否允许 %1$s 触发破坏性应急开关反应?</string>
|
||||
<string name="lock_setting_title">登出</string>
|
||||
<string name="lock_setting_summary">触发应急开关时登出 Briar</string>
|
||||
<string name="panic_setting_signout_title">登出</string>
|
||||
<string name="panic_setting_signout_summary">触发应急开关时登出 Briar</string>
|
||||
<string name="purge_setting_title">删除账号</string>
|
||||
<string name="purge_setting_summary">触发应急开关时删除您的账号。注意:您的身份、联系人和消息将会永久遗失。</string>
|
||||
<string name="uninstall_setting_title">卸载 Briar</string>
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
<string name="groups_button">Private Groups</string>
|
||||
<string name="forums_button">Forums</string>
|
||||
<string name="blogs_button">Blogs</string>
|
||||
<string name="lock_button">Lock App</string>
|
||||
<string name="settings_button">Settings</string>
|
||||
<string name="sign_out_button">Sign Out</string>
|
||||
|
||||
@@ -356,6 +357,9 @@
|
||||
|
||||
<!-- Settings Security and Panic -->
|
||||
<string name="security_settings_title">Security</string>
|
||||
<string name="pref_lock_title">Screen Lock</string>
|
||||
<string name="pref_lock_summary">Use the device\'s screen lock to protect Briar while signed in</string>
|
||||
<string name="pref_lock_disabled_summary">Set up a screen lock for your device to protect Briar while signed in</string>
|
||||
<string name="change_password">Change password</string>
|
||||
<string name="current_password">Current password</string>
|
||||
<string name="choose_new_password">New password</string>
|
||||
@@ -370,8 +374,8 @@
|
||||
<string name="panic_app_setting_none">None</string>
|
||||
<string name="dialog_title_connect_panic_app">Confirm Panic App</string>
|
||||
<string name="dialog_message_connect_panic_app">Are you sure that you want to allow %1$s to trigger destructive panic button actions?</string>
|
||||
<string name="lock_setting_title">Sign Out</string>
|
||||
<string name="lock_setting_summary">Sign out of Briar if a panic button is pressed</string>
|
||||
<string name="panic_setting_signout_title">Sign Out</string>
|
||||
<string name="panic_setting_signout_summary">Sign out of Briar if a panic button is pressed</string>
|
||||
<string name="purge_setting_title">Delete Account</string>
|
||||
<string name="purge_setting_summary">Delete your Briar account if a panic button is pressed. Caution: This will permanently delete your identities, contacts and messages</string>
|
||||
<string name="uninstall_setting_title">Uninstall Briar</string>
|
||||
@@ -444,4 +448,11 @@
|
||||
<string name="permission_camera_denied_toast">Camera permission was not granted</string>
|
||||
<string name="qr_code">QR code</string>
|
||||
<string name="show_qr_code_fullscreen">Show QR code fullscreen</string>
|
||||
|
||||
<!-- App Locking -->
|
||||
<string name="lock_unlock">Unlock Briar</string>
|
||||
<string name="lock_unlock_verbose">Enter your device PIN, pattern or password to unlock Briar</string>
|
||||
<string name="lock_is_locked">Briar is locked</string>
|
||||
<string name="lock_tap_to_unlock">Tap to unlock</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
android:defaultValue="true"
|
||||
android:enabled="false"
|
||||
android:key="pref_key_lock"
|
||||
android:summary="@string/lock_setting_summary"
|
||||
android:title="@string/lock_setting_title"/>
|
||||
android:summary="@string/panic_setting_signout_summary"
|
||||
android:title="@string/panic_setting_signout_title"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
|
||||
@@ -56,6 +56,13 @@
|
||||
android:layout="@layout/preferences_category"
|
||||
android:title="@string/security_settings_title">
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="pref_key_lock"
|
||||
android:persistent="false"
|
||||
android:summary="@string/pref_lock_summary"
|
||||
android:title="@string/pref_lock_title"
|
||||
android:enabled="false"/>
|
||||
|
||||
<Preference
|
||||
android:key="pref_key_change_password"
|
||||
android:title="@string/change_password">
|
||||
|
||||
Reference in New Issue
Block a user