diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index f105d57e9..9ae75930b 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -26,10 +26,11 @@
android:theme="@style/BriarTheme">
+
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
index 778a6f2b9..087aa5ea0 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidComponent.java
@@ -26,6 +26,7 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.briar.BriarCoreEagerSingletons;
import org.briarproject.briar.BriarCoreModule;
+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;
@@ -150,7 +151,7 @@ public interface AndroidComponent
@IoExecutor
Executor ioExecutor();
- void inject(BootReceiver briarService);
+ void inject(SignInReminderReceiver briarService);
void inject(BriarService briarService);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
index 5a2ad896c..2296a8baf 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
@@ -162,6 +162,7 @@ public class AppModule {
@Provides
SharedPreferences provideSharedPreferences(Application app) {
+ // FIXME unify this with getDefaultSharedPreferences()
return app.getSharedPreferences("db", MODE_PRIVATE);
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java
index e537bd86d..6ab1c9ee0 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplication.java
@@ -1,5 +1,7 @@
package org.briarproject.briar.android;
+import android.content.SharedPreferences;
+
import java.util.Collection;
import java.util.logging.LogRecord;
@@ -12,4 +14,6 @@ public interface BriarApplication {
Collection getRecentLogRecords();
AndroidComponent getApplicationComponent();
+
+ SharedPreferences getDefaultSharedPreferences();
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java
index 0b2f03466..08fc14b5d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java
@@ -77,11 +77,12 @@ public class BriarApplicationImpl extends Application
private final CachingLogHandler logHandler = new CachingLogHandler();
private AndroidComponent applicationComponent;
+ private volatile SharedPreferences prefs;
@Override
protected void attachBaseContext(Context base) {
- SharedPreferences prefs =
- PreferenceManager.getDefaultSharedPreferences(base);
+ if (prefs == null)
+ prefs = PreferenceManager.getDefaultSharedPreferences(base);
// Loading the language needs to be done here.
Localizer.initialize(prefs);
super.attachBaseContext(
@@ -156,4 +157,9 @@ public class BriarApplicationImpl extends Application
public AndroidComponent getApplicationComponent() {
return applicationComponent;
}
+
+ @Override
+ public SharedPreferences getDefaultSharedPreferences() {
+ return prefs;
+ }
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BootReceiver.java b/briar-android/src/main/java/org/briarproject/briar/android/login/SignInReminderReceiver.java
similarity index 63%
rename from briar-android/src/main/java/org/briarproject/briar/android/BootReceiver.java
rename to briar-android/src/main/java/org/briarproject/briar/android/login/SignInReminderReceiver.java
index cf4e0ab13..cf1edaae6 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/BootReceiver.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/login/SignInReminderReceiver.java
@@ -1,4 +1,4 @@
-package org.briarproject.briar.android;
+package org.briarproject.briar.android.login;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -6,11 +6,14 @@ import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import org.briarproject.bramble.api.db.DatabaseConfig;
import org.briarproject.briar.R;
+import org.briarproject.briar.android.AndroidComponent;
+import org.briarproject.briar.android.BriarApplication;
import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
import javax.inject.Inject;
@@ -18,16 +21,20 @@ import javax.inject.Inject;
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.content.Context.NOTIFICATION_SERVICE;
import static android.content.Intent.ACTION_BOOT_COMPLETED;
+import static android.content.Intent.ACTION_MY_PACKAGE_REPLACED;
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.PRIORITY_LOW;
import static android.support.v4.app.NotificationCompat.VISIBILITY_SECRET;
import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_SIGN_IN_REMINDER;
+import static org.briarproject.briar.android.settings.SettingsFragment.NOTIFY_SIGN_IN;
import static org.briarproject.briar.api.android.AndroidNotificationManager.REMINDER_CHANNEL_ID;
import static org.briarproject.briar.api.android.AndroidNotificationManager.REMINDER_NOTIFICATION_ID;
-public class BootReceiver extends BroadcastReceiver {
+public class SignInReminderReceiver extends BroadcastReceiver {
+
+ public static final String DISMISS_REMINDER = "dismissReminder";
@Inject
DatabaseConfig databaseConfig;
@@ -36,16 +43,22 @@ public class BootReceiver extends BroadcastReceiver {
public void onReceive(Context ctx, Intent intent) {
if (!FEATURE_FLAG_SIGN_IN_REMINDER) return;
- AndroidComponent applicationComponent =
- ((BriarApplication) ctx.getApplicationContext())
- .getApplicationComponent();
+ BriarApplication app = (BriarApplication) ctx.getApplicationContext();
+ AndroidComponent applicationComponent = app.getApplicationComponent();
applicationComponent.inject(this);
String action = intent.getAction();
- if (action != null && action.equals(ACTION_BOOT_COMPLETED)) {
+ if (action == null) return;
+ if (action.equals(ACTION_BOOT_COMPLETED) ||
+ action.equals(ACTION_MY_PACKAGE_REPLACED)) {
if (databaseConfig.databaseExists()) {
- showSignInNotification(ctx);
+ SharedPreferences prefs = app.getDefaultSharedPreferences();
+ if (prefs.getBoolean(NOTIFY_SIGN_IN, true)) {
+ showSignInNotification(ctx);
+ }
}
+ } else if (action.equals(DISMISS_REMINDER)) {
+ dismissReminder(ctx);
}
}
@@ -65,7 +78,7 @@ public class BootReceiver extends BroadcastReceiver {
NotificationCompat.Builder b =
new NotificationCompat.Builder(ctx, REMINDER_CHANNEL_ID);
- b.setSmallIcon(R.drawable.notification_reminder);
+ b.setSmallIcon(R.drawable.ic_signout);
b.setColor(ContextCompat.getColor(ctx, R.color.briar_primary));
b.setContentTitle(ctx.getText(R.string.reminder_notification_title));
b.setContentText(ctx.getText(R.string.reminder_notification_text));
@@ -73,6 +86,14 @@ public class BootReceiver extends BroadcastReceiver {
b.setWhen(0); // Don't show the time
b.setPriority(PRIORITY_LOW);
+ // Add a 'Dismiss' action
+ String actionTitle =
+ ctx.getString(R.string.reminder_notification_dismiss);
+ Intent i1 = new Intent(ctx, SignInReminderReceiver.class);
+ i1.setAction(DISMISS_REMINDER);
+ PendingIntent actionIntent = PendingIntent.getBroadcast(ctx, 0, i1, 0);
+ b.addAction(0, actionTitle, actionIntent);
+
Intent i = new Intent(ctx, NavDrawerActivity.class);
i.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP);
b.setContentIntent(PendingIntent.getActivity(ctx, 0, i, 0));
@@ -80,4 +101,11 @@ public class BootReceiver extends BroadcastReceiver {
nm.notify(REMINDER_NOTIFICATION_ID, b.build());
}
+ private void dismissReminder(Context ctx) {
+ NotificationManager nm = (NotificationManager)
+ ctx.getSystemService(NOTIFICATION_SERVICE);
+ if (nm == null) return;
+ nm.cancel(REMINDER_NOTIFICATION_ID);
+ }
+
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
index 17c50fca0..955680ff5 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java
@@ -71,6 +71,7 @@ import static org.briarproject.bramble.util.LogUtils.logDuration;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.bramble.util.LogUtils.now;
import static org.briarproject.briar.android.TestingConstants.FEATURE_FLAG_DARK_THEME;
+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;
@@ -97,6 +98,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 NOTIFY_SIGN_IN = "pref_key_notify_sign_in";
private static final Logger LOG =
Logger.getLogger(SettingsFragment.class.getName());
@@ -143,6 +145,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
(ListPreference) findPreference("pref_key_theme");
enableBluetooth = (ListPreference) findPreference("pref_key_bluetooth");
torNetwork = (ListPreference) findPreference("pref_key_tor_network");
+ CheckBoxPreference notifySignIn =
+ (CheckBoxPreference) findPreference(NOTIFY_SIGN_IN);
notifyPrivateMessages = (CheckBoxPreference) findPreference(
"pref_key_notify_private_messages");
notifyGroupMessages = (CheckBoxPreference) findPreference(
@@ -199,6 +203,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
);
} else {
theme.setVisible(FEATURE_FLAG_DARK_THEME);
+ notifySignIn.setVisible(FEATURE_FLAG_SIGN_IN_REMINDER);
findPreference("pref_key_explode").setVisible(false);
findPreference("pref_key_test_data").setVisible(false);
@@ -346,7 +351,9 @@ public class SettingsFragment extends PreferenceFragmentCompat
}
private void setSettingsEnabled(boolean enabled) {
- // theme not needed here, because handled by SharedPreferences
+ // preferences not needed here, because handled by SharedPreferences:
+ // - pref_key_theme
+ // - pref_key_notify_sign_in
enableBluetooth.setEnabled(enabled);
torNetwork.setEnabled(enabled);
notifyPrivateMessages.setEnabled(enabled);
diff --git a/briar-android/src/main/res/drawable/ic_signout.xml b/briar-android/src/main/res/drawable/ic_signout.xml
new file mode 100644
index 000000000..2dd789085
--- /dev/null
+++ b/briar-android/src/main/res/drawable/ic_signout.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/briar-android/src/main/res/drawable/ic_signout_black_24dp.xml b/briar-android/src/main/res/drawable/ic_signout_black_24dp.xml
deleted file mode 100644
index 05569dbdf..000000000
--- a/briar-android/src/main/res/drawable/ic_signout_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/briar-android/src/main/res/drawable/notification_reminder.xml b/briar-android/src/main/res/drawable/notification_reminder.xml
deleted file mode 100644
index 1defd7d3d..000000000
--- a/briar-android/src/main/res/drawable/notification_reminder.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/briar-android/src/main/res/menu/navigation_drawer.xml b/briar-android/src/main/res/menu/navigation_drawer.xml
index 9c98a5187..befb4faa2 100644
--- a/briar-android/src/main/res/menu/navigation_drawer.xml
+++ b/briar-android/src/main/res/menu/navigation_drawer.xml
@@ -28,7 +28,7 @@
android:title="@string/settings_button"/>
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 194856e89..06a09ddce 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -69,8 +69,9 @@
Signed out of Briar
- Tap to sign back in or swipe to dismiss.
+ Tap to sign back in.
Briar Sign-in Reminder
+ Dismiss
Signed into Briar
Touch to open Briar.
@@ -373,6 +374,8 @@
Notifications
+ Remind me to sign in
+ Show a reminder when the phone starts or the app has been updated
Private messages
Show alerts for private messages
Configure alerts for private messages
diff --git a/briar-android/src/main/res/xml/settings.xml b/briar-android/src/main/res/xml/settings.xml
index c74c7e3c3..c81fbb2ad 100644
--- a/briar-android/src/main/res/xml/settings.xml
+++ b/briar-android/src/main/res/xml/settings.xml
@@ -81,6 +81,12 @@
android:layout="@layout/preferences_category"
android:title="@string/notification_settings_title">
+
+