diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml
index 476229541..ac262a3c2 100644
--- a/briar-android/AndroidManifest.xml
+++ b/briar-android/AndroidManifest.xml
@@ -7,6 +7,9 @@
@@ -188,5 +191,22 @@
android:name=".android.StartupFailureActivity"
android:label="@string/startup_failed_activity_title" >
+
+
+
+
+
+
+
+
+
+
diff --git a/briar-android/build.gradle b/briar-android/build.gradle
index 756b2da58..4c3835102 100644
--- a/briar-android/build.gradle
+++ b/briar-android/build.gradle
@@ -1,4 +1,9 @@
apply plugin: 'com.android.application'
+apply plugin: 'witness'
+
+repositories {
+ jcenter()
+}
dependencies {
compile fileTree(dir: '../briar-api/libs', include: '*.jar')
@@ -8,7 +13,23 @@ dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile "com.android.support:support-v4:23.1.1"
compile "com.android.support:appcompat-v7:23.1.1"
+ compile "com.android.support:preference-v7:23.1.1"
+ compile "com.android.support:preference-v14:23.1.1"
compile "com.android.support:design:23.1.1"
+ compile "info.guardianproject.panic:panic:0.5"
+}
+
+dependencyVerification {
+ verify = [
+ 'com.android.support:support-v4:5c7dceb6c824089fe80f502e5206264048ef8bffa4e8ddeab180b81723e79b7f',
+ 'com.android.support:appcompat-v7:0a8762214382b7e8d4b989b4ac10b5c846b957d767ccb7bccbc6be5afa885a82',
+ 'com.android.support:preference-v7:4b6dabaa4400cbed885c7edc885aa6372468f48d628cc0d4a04b9ccd128ed324',
+ 'com.android.support:preference-v14:a69906c2b29b315ac3c1fdf01537a7557660a65b8ea1cf891baa8665e1197459',
+ 'com.android.support:design:41a9cd75ca78f25df5f573db7cedf8bb66beae00c330943923ba9f3e2051736d',
+ 'com.android.support:support-annotations:f347a35b9748a4103b39a6714a77e2100f488d623fd6268e259c177b200e9d82',
+ 'com.android.support:recyclerview-v7:7606373da0931a1e62588335465a0e390cd676c98117edab29220317495faefd',
+ 'info.guardianproject.panic:panic:a7ed9439826db2e9901649892cf9afbe76f00991b768d8f4c26332d7c9406cb2',
+ ]
}
android {
diff --git a/briar-android/res/layout/activity_panic_preferences.xml b/briar-android/res/layout/activity_panic_preferences.xml
new file mode 100644
index 000000000..78aaeb88d
--- /dev/null
+++ b/briar-android/res/layout/activity_panic_preferences.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/res/values-v14/styles.xml b/briar-android/res/values-v14/styles.xml
index 898a9e4e0..ff39392ac 100644
--- a/briar-android/res/values-v14/styles.xml
+++ b/briar-android/res/values-v14/styles.xml
@@ -1,5 +1,11 @@
+
+
+
diff --git a/briar-android/res/values/color.xml b/briar-android/res/values/color.xml
index 28cddbd4f..fc0ea3977 100644
--- a/briar-android/res/values/color.xml
+++ b/briar-android/res/values/color.xml
@@ -16,10 +16,14 @@
#2D3E50
#0f1720
+ #2D3E50
#75ab0d
#95d220
#75ab0d
#333333
#ffffff
+
+
+ @color/briar_accent
\ No newline at end of file
diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index 4934dceab..25aa173bc 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -106,6 +106,9 @@
Connect via Tor
Only when using Wi-Fi
When using Wi-Fi or mobile data
+ Panic Button Setup
+ Panic Button
+ Configure how Briar will react when you use a Panic Button app
NOTIFICATIONS
Show alerts for private messages
Show alerts for forum posts
@@ -114,6 +117,13 @@
Default ringtone
None
Choose ringtone
+ Accept from App
+ No app set, don\'t do destructive actions
+ None
+ Lock Briar
+ Signs you out and require password to access data
+ Delete Data
+ Caution: This irrevocably deletes your contacts and all other data
Step %1$d/%2$d
Online
Offline
@@ -122,11 +132,14 @@
Internet
Bluetooth
Wi-Fi
+ No data
+ an unknown App
Lost password
Password recovery is not possible. Do you wish to delete your user, all contacts, and re-register ?
Confirm Contact Deletion
Are you sure that you want to remove this contact and all messages exchanged with this contact?
- No data
+ Confirm Panic App
+ Are you sure that you want to allow %1$s to trigger destructive panic actions?
diff --git a/briar-android/res/values/styles.xml b/briar-android/res/values/styles.xml
index 8a706c0a2..7a869c905 100644
--- a/briar-android/res/values/styles.xml
+++ b/briar-android/res/values/styles.xml
@@ -1,17 +1,20 @@
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/res/xml/panic_preferences.xml b/briar-android/res/xml/panic_preferences.xml
new file mode 100644
index 000000000..3b40f0e3d
--- /dev/null
+++ b/briar-android/res/xml/panic_preferences.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/BriarActivity.java b/briar-android/src/org/briarproject/android/BriarActivity.java
index 5442839ac..fcc4ab604 100644
--- a/briar-android/src/org/briarproject/android/BriarActivity.java
+++ b/briar-android/src/org/briarproject/android/BriarActivity.java
@@ -2,11 +2,13 @@ package org.briarproject.android;
import android.annotation.SuppressLint;
import android.content.Intent;
+import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import org.briarproject.android.BriarService.BriarBinder;
import org.briarproject.android.BriarService.BriarServiceConnection;
+import org.briarproject.android.panic.ExitActivity;
import org.briarproject.api.db.DatabaseConfig;
import org.briarproject.api.db.DatabaseExecutor;
import org.briarproject.api.lifecycle.LifecycleManager;
@@ -78,7 +80,7 @@ public class BriarActivity extends BaseActivity {
if (bound) unbindService(serviceConnection);
}
- protected void signOut() {
+ protected void signOut(final boolean removeFromRecentApps) {
new Thread() {
@Override
public void run() {
@@ -95,15 +97,28 @@ public class BriarActivity extends BaseActivity {
LOG.warning("Interrupted while waiting for service");
Thread.currentThread().interrupt();
}
- finishAndExit();
+
+ if(removeFromRecentApps){
+ ExitActivity.exitAndRemoveFromRecentApps(BriarActivity.this);
+ } else {
+ finishAndExit();
+ }
}
}.start();
}
+ protected void signOut() {
+ signOut(false);
+ }
+
private void finishAndExit() {
runOnUiThread(new Runnable() {
public void run() {
- finish();
+ if (Build.VERSION.SDK_INT >= 21) {
+ finishAndRemoveTask();
+ } else {
+ finish();
+ }
LOG.info("Exiting");
System.exit(0);
}
diff --git a/briar-android/src/org/briarproject/android/SettingsActivity.java b/briar-android/src/org/briarproject/android/SettingsActivity.java
index e2f2d233a..7c48355a9 100644
--- a/briar-android/src/org/briarproject/android/SettingsActivity.java
+++ b/briar-android/src/org/briarproject/android/SettingsActivity.java
@@ -16,6 +16,7 @@ import android.widget.ScrollView;
import android.widget.TextView;
import org.briarproject.R;
+import org.briarproject.android.panic.PanicPreferencesActivity;
import org.briarproject.android.util.FixedVerticalSpace;
import org.briarproject.android.util.HorizontalBorder;
import org.briarproject.android.util.LayoutUtils;
@@ -68,6 +69,7 @@ OnClickListener {
private CheckBox notifyPrivateMessages = null, notifyForumPosts = null;
private CheckBox notifyVibration = null;
private TextView torOverWifi = null, torOverWifiHint = null;
+ private TextView panicSettings = null, panicSettingsHint = null;
private TextView notifySound = null, notifySoundHint = null;
private ListLoadingProgressBar progress = null;
private ImageButton testingButton = null;
@@ -141,6 +143,30 @@ OnClickListener {
torOverWifiHint.setOnClickListener(this);
settings.addView(torOverWifiHint);
+ TextView panicTitle = new TextView(this);
+ panicTitle.setPadding(pad, 0, pad, 0);
+ panicTitle.setTypeface(DEFAULT_BOLD);
+ panicTitle.setTextColor(titleText);
+ panicTitle.setText(R.string.panic_setting_title);
+ settings.addView(panicTitle);
+
+ underline = new HorizontalBorder(this);
+ underline.setBackgroundColor(titleUnderline);
+ settings.addView(underline);
+
+ panicSettings = new TextView(this);
+ panicSettings.setPadding(pad, pad, pad, 0);
+ panicSettings.setTextSize(18);
+ panicSettings.setText(R.string.panic_setting);
+ panicSettings.setOnClickListener(this);
+ settings.addView(panicSettings);
+
+ panicSettingsHint = new TextView(this);
+ panicSettingsHint.setText(R.string.panic_setting_hint);
+ panicSettingsHint.setPadding(pad, 0, pad, pad);
+ panicSettingsHint.setOnClickListener(this);
+ settings.addView(panicSettingsHint);
+
TextView notificationsTitle = new TextView(this);
notificationsTitle.setPadding(pad, 0, pad, 0);
notificationsTitle.setTypeface(DEFAULT_BOLD);
@@ -317,6 +343,8 @@ OnClickListener {
s.putBoolean("notifyPrivateMessages",
notifyPrivateMessages.isChecked());
storeSettings(s);
+ } else if (view == panicSettings || view == panicSettingsHint) {
+ startActivity(new Intent(this, PanicPreferencesActivity.class));
} else if (view == notifyForumPosts) {
Settings s = new Settings();
s.putBoolean("notifyForumPosts", notifyForumPosts.isChecked());
diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java
index 60712a583..e74056341 100644
--- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java
+++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java
@@ -7,6 +7,7 @@ import android.os.Bundle;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import android.os.StrictMode.VmPolicy;
+import android.support.v7.preference.PreferenceManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -64,6 +65,9 @@ public class SplashScreenActivity extends RoboSplashActivity {
logo.setImageResource(R.drawable.briar_logo_large);
layout.addView(logo);
+ PreferenceManager
+ .setDefaultValues(this, R.xml.panic_preferences, false);
+
setContentView(layout);
}
diff --git a/briar-android/src/org/briarproject/android/panic/ExitActivity.java b/briar-android/src/org/briarproject/android/panic/ExitActivity.java
new file mode 100644
index 000000000..68bef09ec
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/panic/ExitActivity.java
@@ -0,0 +1,40 @@
+package org.briarproject.android.panic;
+
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+
+import org.briarproject.android.BaseActivity;
+
+public class ExitActivity extends BaseActivity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ finishAndRemoveTask();
+ } else {
+ finish();
+ }
+
+ System.exit(0);
+ }
+
+ public static void exitAndRemoveFromRecentApps(final BaseActivity activity) {
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Intent intent = new Intent(activity, ExitActivity.class);
+
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+ | Intent.FLAG_ACTIVITY_CLEAR_TASK
+ | Intent.FLAG_ACTIVITY_NO_ANIMATION);
+
+ activity.startActivity(intent);
+ }
+ });
+
+ }
+}
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java b/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java
new file mode 100644
index 000000000..13556f838
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java
@@ -0,0 +1,33 @@
+package org.briarproject.android.panic;
+
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.view.MenuItem;
+
+import org.briarproject.R;
+import org.briarproject.android.BriarActivity;
+
+public class PanicPreferencesActivity extends BriarActivity {
+
+ @Override
+ public void onCreate(Bundle bundle) {
+ super.onCreate(bundle);
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setHomeButtonEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ setContentView(R.layout.activity_panic_preferences);
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ onBackPressed();
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java b/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java
new file mode 100644
index 000000000..7fd096213
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java
@@ -0,0 +1,14 @@
+package org.briarproject.android.panic;
+
+import android.os.Bundle;
+import android.support.v7.preference.PreferenceFragmentCompat;
+
+import org.briarproject.R;
+
+public class PanicPreferencesFragment extends PreferenceFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ addPreferencesFromResource(R.xml.panic_preferences);
+ }
+}
diff --git a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java
new file mode 100644
index 000000000..df758e295
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java
@@ -0,0 +1,37 @@
+package org.briarproject.android.panic;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v7.preference.PreferenceManager;
+
+import org.briarproject.android.BriarActivity;
+
+import java.util.logging.Logger;
+
+public class PanicResponderActivity extends BriarActivity {
+
+ private static final Logger LOG =
+ Logger.getLogger(PanicResponderActivity.class.getName());
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ SharedPreferences sharedPref = PreferenceManager
+ .getDefaultSharedPreferences(this);
+
+ Intent intent = getIntent();
+ if (intent != null && sharedPref.getBoolean("pref_key_lock", true)) {
+ LOG.info("Signing out...");
+ signOut(true);
+ }
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ finishAndRemoveTask();
+ } else {
+ finish();
+ }
+ }
+}
\ No newline at end of file
diff --git a/briar-core/libs/gradle-witness.jar b/briar-core/libs/gradle-witness.jar
new file mode 100644
index 000000000..561041d36
Binary files /dev/null and b/briar-core/libs/gradle-witness.jar differ
diff --git a/build.gradle b/build.gradle
index ec8b633f8..98a1101ba 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,5 +5,6 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
+ classpath files('briar-core/libs/gradle-witness.jar')
}
-}
+}
\ No newline at end of file