diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 2ab0dc683b3610f3fafe9a83a98e891bc936ba03..1ac6b50ebce552540c62051b8f8fc2b8f3be1886 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -122,6 +122,8 @@ <string name="lock_setting_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> + <string name="uninstall_setting_summary">This requires manual confirmation in a panic event</string> <string name="step">Step %1$d/%2$d</string> <string name="online">Online</string> <string name="offline">Offline</string> diff --git a/briar-android/res/xml/panic_preferences.xml b/briar-android/res/xml/panic_preferences.xml index af9bbeca501b78bac1abd2115e0a3279ebd089d3..306f53ac2a0c141d962790cdc8b0b890203fbd74 100644 --- a/briar-android/res/xml/panic_preferences.xml +++ b/briar-android/res/xml/panic_preferences.xml @@ -24,6 +24,13 @@ android:enabled="false" android:defaultValue="false"/> + <CheckBoxPreference + android:key="pref_key_uninstall" + android:title="@string/uninstall_setting_title" + android:summary="@string/uninstall_setting_summary" + android:enabled="false" + android:defaultValue="false"/> + </PreferenceCategory> </PreferenceScreen> \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java b/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java index 3ee8915c25d976609029bbdc189ffa64eea406c3..9324466b0b5c377add15c22ef4cd1723a342b513 100644 --- a/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java +++ b/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java @@ -27,13 +27,17 @@ import info.guardianproject.panic.PanicResponder; public class PanicPreferencesFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { + public static final String KEY_LOCK = "pref_key_lock"; + public static final String KEY_PANIC_APP = "pref_key_panic_app"; + public static final String KEY_PURGE = "pref_key_purge"; + public static final String KEY_UNINSTALL = "pref_key_uninstall"; + private static final Logger LOG = Logger.getLogger(PanicPreferencesFragment.class.getName()); private PackageManager pm; - private CheckBoxPreference lockPref; + private CheckBoxPreference lockPref, purgePref, uninstallPref; private ListPreference panicAppPref; - private CheckBoxPreference purgePref; @Override public void onCreatePreferences(Bundle bundle, String s) { @@ -41,9 +45,10 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat pm = getActivity().getPackageManager(); - lockPref = (CheckBoxPreference) findPreference("pref_key_lock"); - panicAppPref = (ListPreference) findPreference("pref_key_panic_app"); - purgePref = (CheckBoxPreference) findPreference("pref_key_purge"); + lockPref = (CheckBoxPreference) findPreference(KEY_LOCK); + panicAppPref = (ListPreference) findPreference(KEY_PANIC_APP); + purgePref = (CheckBoxPreference) findPreference(KEY_PURGE); + uninstallPref = (CheckBoxPreference) findPreference(KEY_UNINSTALL); // check for connect/disconnect intents from panic trigger apps if (PanicResponder.checkForDisconnectIntent(getActivity())) { @@ -98,9 +103,12 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat if (packageName.equals(Panic.PACKAGE_NAME_NONE)) { purgePref.setChecked(false); purgePref.setEnabled(false); + uninstallPref.setChecked(false); + uninstallPref.setEnabled(false); getActivity().setResult(Activity.RESULT_CANCELED); } else { purgePref.setEnabled(true); + uninstallPref.setEnabled(true); } return true; @@ -141,16 +149,27 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - // enable locking if purging gets enabled - if (key.equals("pref_key_purge") - && sharedPreferences.getBoolean("pref_key_purge", false)) { + if (key.equals(KEY_PURGE)) { + // enable locking if purging gets enabled + if (sharedPreferences.getBoolean(KEY_PURGE, false)) { + lockPref.setChecked(true); + } + // disable uninstall if purging gets disabled + else { + uninstallPref.setChecked(false); + } + } + // enable purging and locking if uninstall gets enabled + if (key.equals(KEY_UNINSTALL) && + sharedPreferences.getBoolean(KEY_UNINSTALL, false)) { lockPref.setChecked(true); + purgePref.setChecked(true); } - // disable purging if locking gets disabled - if (key.equals("pref_key_lock") - && !sharedPreferences.getBoolean("pref_key_lock", true) - && sharedPreferences.getBoolean("pref_key_purge", false)) { + // disable purging and uninstalling if locking gets disabled + if (key.equals(KEY_LOCK) && + !sharedPreferences.getBoolean(KEY_LOCK, true)) { purgePref.setChecked(false); + uninstallPref.setChecked(false); } } @@ -163,7 +182,9 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat .setSummary(getString(R.string.panic_app_setting_summary)); panicAppPref.setIcon( android.R.drawable.ic_menu_close_clear_cancel); + purgePref.setEnabled(false); + uninstallPref.setEnabled(false); } else { // display connected panic app try { @@ -172,7 +193,9 @@ public class PanicPreferencesFragment extends PreferenceFragmentCompat pm.getApplicationInfo(triggerPackageName, 0))); panicAppPref.setIcon( pm.getApplicationIcon(triggerPackageName)); + purgePref.setEnabled(true); + uninstallPref.setEnabled(true); } catch (PackageManager.NameNotFoundException e) { // revert back to no app, just to be safe PanicResponder.setTriggerPackageName(getActivity(), diff --git a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java index 1f3c0fd900de3d062bfb1c3c0b8d347b37d88709..674ce556efef10045500420cb64f856b4ab72cd1 100644 --- a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java +++ b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java @@ -2,6 +2,7 @@ package org.briarproject.android.panic; import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v7.preference.PreferenceManager; @@ -20,6 +21,10 @@ import info.guardianproject.panic.Panic; import info.guardianproject.panic.PanicResponder; import info.guardianproject.trustedintents.TrustedIntents; +import static org.briarproject.android.panic.PanicPreferencesFragment.KEY_LOCK; +import static org.briarproject.android.panic.PanicPreferencesFragment.KEY_PURGE; +import static org.briarproject.android.panic.PanicPreferencesFragment.KEY_UNINSTALL; + public class PanicResponderActivity extends BriarActivity { private static final Logger LOG = @@ -50,23 +55,29 @@ public class PanicResponderActivity extends BriarActivity { LOG.info("Performing destructive responses..."); // Performing destructive panic responses - if (sharedPref.getBoolean("pref_key_purge", false)) { + if (sharedPref.getBoolean(KEY_UNINSTALL, false)) { + LOG.info("Purging all data..."); + deleteAllData(); + + LOG.info("Uninstalling..."); + Intent uninstall = new Intent(Intent.ACTION_DELETE); + uninstall.setData( + Uri.parse("package:" + getPackageName())); + startActivity(uninstall); + } + else if (sharedPref.getBoolean(KEY_PURGE, false)) { LOG.info("Purging all data..."); deleteAllData(); } - // still sign out if enabled - else if (sharedPref.getBoolean("pref_key_lock", true)) { + else if (sharedPref.getBoolean(KEY_LOCK, true)) { LOG.info("Signing out..."); signOut(true); } - // TODO add other panic behavior such as: - // * send a pre-defined message to certain contacts (#212) - // * uninstall the app (#211) - + // TODO send a pre-defined message to certain contacts (#212) } // Performing non-destructive default panic response - else if (sharedPref.getBoolean("pref_key_lock", true)) { + else if (sharedPref.getBoolean(KEY_LOCK, true)) { LOG.info("Signing out..."); signOut(true); }