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