From c8caae49f19ba045cba52e7ce9e56349eda63918 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 23 May 2022 12:00:42 -0300 Subject: [PATCH 1/3] Broadcast MailboxProblemEvent in case of mailbox problems Also move other mailbox related events into the events package --- .../bramble/api/mailbox/MailboxManager.java | 1 + .../mailbox/event/MailboxProblemEvent.java | 19 +++++++++++++++++++ .../OwnMailboxConnectionStatusEvent.java | 4 +++- .../{ => event}/RemoteMailboxUpdateEvent.java | 3 ++- .../mailbox/MailboxSettingsManagerImpl.java | 7 ++++++- .../mailbox/MailboxUpdateManagerImpl.java | 2 +- .../mailbox/MailboxPairingTaskImplTest.java | 2 +- .../MailboxSettingsManagerImplTest.java | 2 +- .../mailbox/MailboxUpdateManagerImplTest.java | 2 +- 9 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxProblemEvent.java rename bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/{ => event}/OwnMailboxConnectionStatusEvent.java (76%) rename bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/{ => event}/RemoteMailboxUpdateEvent.java (87%) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java index d2c88aebb..89730f715 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.api.mailbox; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent; import javax.annotation.Nullable; diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxProblemEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxProblemEvent.java new file mode 100644 index 000000000..4c00cac98 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/MailboxProblemEvent.java @@ -0,0 +1,19 @@ +package org.briarproject.bramble.api.mailbox.event; + +import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +/** + * An event that is broadcast by {@link MailboxSettingsManager} when + * recording a connection failure for own Mailbox + * that has persistent for long enough for the mailbox owner to become active + * and fix the problem with the mailbox. + */ +@Immutable +@NotNullByDefault +public class MailboxProblemEvent extends Event { + +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/OwnMailboxConnectionStatusEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/OwnMailboxConnectionStatusEvent.java similarity index 76% rename from bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/OwnMailboxConnectionStatusEvent.java rename to bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/OwnMailboxConnectionStatusEvent.java index b137052ea..4a4b6b93e 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/OwnMailboxConnectionStatusEvent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/OwnMailboxConnectionStatusEvent.java @@ -1,6 +1,8 @@ -package org.briarproject.bramble.api.mailbox; +package org.briarproject.bramble.api.mailbox.event; import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; +import org.briarproject.bramble.api.mailbox.MailboxStatus; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import javax.annotation.concurrent.Immutable; diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/RemoteMailboxUpdateEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/RemoteMailboxUpdateEvent.java similarity index 87% rename from bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/RemoteMailboxUpdateEvent.java rename to bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/RemoteMailboxUpdateEvent.java index f213eb27b..aeee7da39 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/RemoteMailboxUpdateEvent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/event/RemoteMailboxUpdateEvent.java @@ -1,7 +1,8 @@ -package org.briarproject.bramble.api.mailbox; +package org.briarproject.bramble.api.mailbox.event; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.event.Event; +import org.briarproject.bramble.api.mailbox.MailboxUpdate; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import javax.annotation.concurrent.Immutable; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java index eee2a49c2..fa4232a57 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java @@ -9,7 +9,8 @@ import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxStatus; import org.briarproject.bramble.api.mailbox.MailboxVersion; -import org.briarproject.bramble.api.mailbox.OwnMailboxConnectionStatusEvent; +import org.briarproject.bramble.api.mailbox.event.MailboxProblemEvent; +import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.SettingsManager; @@ -22,6 +23,7 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; +import static java.util.concurrent.TimeUnit.DAYS; import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; @Immutable @@ -141,6 +143,9 @@ class MailboxSettingsManagerImpl implements MailboxSettingsManager { settingsManager.mergeSettings(txn, newSettings, SETTINGS_NAMESPACE); MailboxStatus status = new MailboxStatus(now, lastSuccess, newAttempts); txn.attach(new OwnMailboxConnectionStatusEvent(status)); + if (now - lastSuccess > DAYS.toMillis(3) && newAttempts > 10) { + txn.attach(new MailboxProblemEvent()); + } } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java index 5262e4ebd..174b979e3 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImpl.java @@ -25,7 +25,7 @@ import org.briarproject.bramble.api.mailbox.MailboxUpdate; import org.briarproject.bramble.api.mailbox.MailboxUpdateManager; import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; import org.briarproject.bramble.api.mailbox.MailboxVersion; -import org.briarproject.bramble.api.mailbox.RemoteMailboxUpdateEvent; +import org.briarproject.bramble.api.mailbox.event.RemoteMailboxUpdateEvent; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group.Visibility; diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java index 10c1a74fa..9d43995c2 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPairingTaskImplTest.java @@ -13,7 +13,7 @@ import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxUpdate; import org.briarproject.bramble.api.mailbox.MailboxUpdateManager; import org.briarproject.bramble.api.mailbox.MailboxVersion; -import org.briarproject.bramble.api.mailbox.OwnMailboxConnectionStatusEvent; +import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.DbExpectations; diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java index 963093fb5..fe8d34cce 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java @@ -7,7 +7,7 @@ import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxStatus; import org.briarproject.bramble.api.mailbox.MailboxVersion; -import org.briarproject.bramble.api.mailbox.OwnMailboxConnectionStatusEvent; +import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.SettingsManager; import org.briarproject.bramble.test.BrambleMockTestCase; diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java index e1bdcf934..36b49b00a 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxUpdateManagerImplTest.java @@ -18,7 +18,7 @@ import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxUpdate; import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; import org.briarproject.bramble.api.mailbox.MailboxVersion; -import org.briarproject.bramble.api.mailbox.RemoteMailboxUpdateEvent; +import org.briarproject.bramble.api.mailbox.event.RemoteMailboxUpdateEvent; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.Message; From 6c19b22aab71b9771a53db82c48d0ce08c57a4ab Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 23 May 2022 12:52:04 -0300 Subject: [PATCH 2/3] Show notification warning when own mailbox is unreachable --- .../AndroidNotificationManagerImpl.java | 55 +++++++++++++++++++ .../mailbox/MailboxStatusFragment.java | 1 + .../android/mailbox/MailboxViewModel.java | 12 +++- .../android/AndroidNotificationManager.java | 6 ++ briar-android/src/main/res/values/strings.xml | 3 + 5 files changed, 75 insertions(+), 2 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java index 05135062e..433410c7e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidNotificationManagerImpl.java @@ -18,6 +18,9 @@ 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.lifecycle.ServiceException; +import org.briarproject.bramble.api.mailbox.MailboxStatus; +import org.briarproject.bramble.api.mailbox.event.MailboxProblemEvent; +import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.settings.Settings; @@ -32,6 +35,7 @@ import org.briarproject.briar.android.conversation.ConversationActivity; import org.briarproject.briar.android.forum.ForumActivity; import org.briarproject.briar.android.hotspot.HotspotActivity; import org.briarproject.briar.android.login.SignInReminderReceiver; +import org.briarproject.briar.android.mailbox.MailboxActivity; import org.briarproject.briar.android.navdrawer.NavDrawerActivity; import org.briarproject.briar.android.privategroup.conversation.GroupActivity; import org.briarproject.briar.android.splash.SplashScreenActivity; @@ -69,10 +73,12 @@ import static android.content.Context.NOTIFICATION_SERVICE; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP; +import static android.net.Uri.EMPTY; import static android.os.Build.VERSION.SDK_INT; import static androidx.core.app.NotificationCompat.CATEGORY_MESSAGE; import static androidx.core.app.NotificationCompat.CATEGORY_SERVICE; import static androidx.core.app.NotificationCompat.CATEGORY_SOCIAL; +import static androidx.core.app.NotificationCompat.PRIORITY_HIGH; import static androidx.core.app.NotificationCompat.PRIORITY_LOW; import static androidx.core.app.NotificationCompat.PRIORITY_MIN; import static androidx.core.app.NotificationCompat.VISIBILITY_SECRET; @@ -182,6 +188,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, clearForumPostNotification(); clearBlogPostNotification(); clearContactAddedNotification(); + clearMailboxProblemNotification(); return null; }); try { @@ -250,6 +257,13 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, ContactAddedEvent c = (ContactAddedEvent) e; // Don't show notifications for contacts added in person if (!c.isVerified()) showContactAddedNotification(); + } else if (e instanceof MailboxProblemEvent) { + showMailboxProblemNotification(); + } else if (e instanceof OwnMailboxConnectionStatusEvent) { + MailboxStatus s = ((OwnMailboxConnectionStatusEvent) e).getStatus(); + if (s.getAttemptsSinceSuccess() == 0) { + clearMailboxProblemNotification(); + } } } @@ -757,4 +771,45 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, public void clearHotspotNotification() { notificationManager.cancel(HOTSPOT_NOTIFICATION_ID); } + + @Override + public void showMailboxProblemNotification() { + if (SDK_INT >= 26) { + NotificationChannel channel = new NotificationChannel( + MAILBOX_PROBLEM_CHANNEL_ID, appContext.getString( + R.string.mailbox_error_notification_channel_title), + IMPORTANCE_DEFAULT); + channel.setLockscreenVisibility(VISIBILITY_SECRET); + notificationManager.createNotificationChannel(channel); + } + + NotificationCompat.Builder b = new NotificationCompat.Builder( + appContext, MAILBOX_PROBLEM_CHANNEL_ID); + b.setSmallIcon(R.drawable.ic_mailbox); + b.setColor(getColor(appContext, R.color.briar_red_500)); + b.setContentTitle( + appContext.getText(R.string.mailbox_error_notification_title)); + b.setContentText( + appContext.getText(R.string.mailbox_error_notification_text)); + b.setAutoCancel(true); + b.setNotificationSilent(); // not important enough for sound + b.setWhen(0); // Don't show the time + b.setPriority(PRIORITY_HIGH); + + // Touching the notification shows the mailbox status page + Intent i = new Intent(appContext, MailboxActivity.class); + i.setData(EMPTY); // for some reason, the back navigation needs an Uri + i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); + TaskStackBuilder t = TaskStackBuilder.create(appContext); + t.addParentStack(MailboxActivity.class); + t.addNextIntent(i); + b.setContentIntent(t.getPendingIntent(nextRequestId++, 0)); + + notificationManager.notify(MAILBOX_PROBLEM_NOTIFICATION_ID, b.build()); + } + + @Override + public void clearMailboxProblemNotification() { + notificationManager.cancel(MAILBOX_PROBLEM_NOTIFICATION_ID); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java index c4382a0a2..6b205979b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java @@ -117,6 +117,7 @@ public class MailboxStatusFragment extends Fragment { public void onStart() { super.onStart(); requireActivity().setTitle(R.string.mailbox_status_title); + viewModel.clearProblemNotification(); refresher = this::refreshLastConnection; handler.postDelayed(refresher, MIN_DATE_RESOLUTION); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java index 27dbab0f5..e10ee9402 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxViewModel.java @@ -17,7 +17,7 @@ import org.briarproject.bramble.api.mailbox.MailboxManager; import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxStatus; -import org.briarproject.bramble.api.mailbox.OwnMailboxConnectionStatusEvent; +import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.plugin.PluginManager; @@ -30,6 +30,7 @@ import org.briarproject.briar.android.qrcode.QrCodeDecoder; import org.briarproject.briar.android.viewmodel.DbViewModel; import org.briarproject.briar.android.viewmodel.LiveEvent; import org.briarproject.briar.android.viewmodel.MutableLiveEvent; +import org.briarproject.briar.api.android.AndroidNotificationManager; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -59,6 +60,7 @@ class MailboxViewModel extends DbViewModel private final QrCodeDecoder qrCodeDecoder; private final PluginManager pluginManager; private final MailboxManager mailboxManager; + private final AndroidNotificationManager notificationManager; private final MutableLiveEvent pairingState = new MutableLiveEvent<>(); @@ -77,12 +79,14 @@ class MailboxViewModel extends DbViewModel EventBus eventBus, @IoExecutor Executor ioExecutor, PluginManager pluginManager, - MailboxManager mailboxManager) { + MailboxManager mailboxManager, + AndroidNotificationManager notificationManager) { super(app, dbExecutor, lifecycleManager, db, androidExecutor); this.eventBus = eventBus; this.ioExecutor = ioExecutor; this.pluginManager = pluginManager; this.mailboxManager = mailboxManager; + this.notificationManager = notificationManager; qrCodeDecoder = new QrCodeDecoder(androidExecutor, ioExecutor, this); eventBus.addListener(this); checkIfSetup(); @@ -251,6 +255,10 @@ class MailboxViewModel extends DbViewModel }); } + void clearProblemNotification() { + notificationManager.clearMailboxProblemNotification(); + } + @UiThread LiveEvent getPairingState() { return pairingState; diff --git a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java index 908b27322..c1b54275b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java +++ b/briar-android/src/main/java/org/briarproject/briar/api/android/AndroidNotificationManager.java @@ -32,6 +32,7 @@ public interface AndroidNotificationManager { int BLOG_POST_NOTIFICATION_ID = 7; int CONTACT_ADDED_NOTIFICATION_ID = 8; int HOTSPOT_NOTIFICATION_ID = 9; + int MAILBOX_PROBLEM_NOTIFICATION_ID = 10; // Channel IDs String CONTACT_CHANNEL_ID = "contacts"; @@ -44,6 +45,7 @@ public interface AndroidNotificationManager { String ONGOING_CHANNEL_ID = "zForegroundService2"; String REMINDER_CHANNEL_ID = "zSignInReminder"; String HOTSPOT_CHANNEL_ID = "zHotspot"; + String MAILBOX_PROBLEM_CHANNEL_ID = "zMailboxProblem"; // This channel is no longer used - keep the ID so we can remove the // channel from existing installations @@ -104,4 +106,8 @@ public interface AndroidNotificationManager { void showHotspotNotification(); void clearHotspotNotification(); + + void showMailboxProblemNotification(); + + void clearMailboxProblemNotification(); } diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 660fc00c5..f4e3acec8 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -652,6 +652,9 @@ Your Mailbox has been unlinked Next time you have access to your Mailbox device, please open the Mailbox app and tap the \"Unlink\" button to complete the process.\n\nIf you no longer have access to your Mailbox device, don\'t worry. Your data is encrypted so it will remain secure even if you don\'t complete the process. + Briar Mailbox problem + Briar Mailbox is unavailable + Tap to fix problem. Fix problem Mailbox troubleshooting wizard Do you have access to your Mailbox device? From 54339afab817b97af19769be626c1ed3ab80b705 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 25 May 2022 13:06:54 -0300 Subject: [PATCH 3/3] Factor mailbox problem detection into MailboxStatus and constants --- .../bramble/api/mailbox/MailboxConstants.java | 14 ++++++++++++++ .../bramble/api/mailbox/MailboxStatus.java | 11 +++++++++++ .../mailbox/MailboxSettingsManagerImpl.java | 5 +---- .../android/mailbox/MailboxStatusFragment.java | 2 +- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java index 976e86c90..8cc6b5fc0 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxConstants.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.api.mailbox; +import static java.util.concurrent.TimeUnit.HOURS; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_FRAME_LENGTH; import static org.briarproject.bramble.api.transport.TransportConstants.MAX_PAYLOAD_LENGTH; import static org.briarproject.bramble.api.transport.TransportConstants.STREAM_HEADER_LENGTH; @@ -20,4 +21,17 @@ public interface MailboxConstants { int MAX_FILE_PAYLOAD_BYTES = (MAX_FILE_BYTES - TAG_LENGTH - STREAM_HEADER_LENGTH) / MAX_FRAME_LENGTH * MAX_PAYLOAD_LENGTH; + + /** + * The number of connection failures + * that indicate a problem with the mailbox. + */ + int PROBLEM_NUM_CONNECTION_FAILURES = 5; + + /** + * The time in milliseconds since the last connection success + * that need to pass to indicates a problem with the mailbox. + */ + long PROBLEM_MS_SINCE_LAST_SUCCESS = HOURS.toMillis(1); + } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStatus.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStatus.java index 40d566b44..bbf60cdba 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStatus.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStatus.java @@ -4,6 +4,9 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import javax.annotation.concurrent.Immutable; +import static org.briarproject.bramble.api.mailbox.MailboxConstants.PROBLEM_MS_SINCE_LAST_SUCCESS; +import static org.briarproject.bramble.api.mailbox.MailboxConstants.PROBLEM_NUM_CONNECTION_FAILURES; + @Immutable @NotNullByDefault public class MailboxStatus { @@ -56,4 +59,12 @@ public class MailboxStatus { public int getAttemptsSinceSuccess() { return attemptsSinceSuccess; } + + /** + * @return true if this status indicates a problem with the mailbox. + */ + public boolean hasProblem(long now) { + return attemptsSinceSuccess >= PROBLEM_NUM_CONNECTION_FAILURES && + (now - lastSuccess) >= PROBLEM_MS_SINCE_LAST_SUCCESS; + } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java index fa4232a57..a1831bd75 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java @@ -23,7 +23,6 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static java.util.concurrent.TimeUnit.DAYS; import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; @Immutable @@ -143,9 +142,7 @@ class MailboxSettingsManagerImpl implements MailboxSettingsManager { settingsManager.mergeSettings(txn, newSettings, SETTINGS_NAMESPACE); MailboxStatus status = new MailboxStatus(now, lastSuccess, newAttempts); txn.attach(new OwnMailboxConnectionStatusEvent(status)); - if (now - lastSuccess > DAYS.toMillis(3) && newAttempts > 10) { - txn.attach(new MailboxProblemEvent()); - } + if (status.hasProblem(now)) txn.attach(new MailboxProblemEvent()); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java index 6b205979b..cab83b649 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/mailbox/MailboxStatusFragment.java @@ -139,7 +139,7 @@ public class MailboxStatusFragment extends Fragment { tintRes = R.color.briar_brand_green; showUnlinkWarning = true; wizardButton.setVisibility(GONE); - } else if (status.getAttemptsSinceSuccess() < NUM_FAILURES) { + } else if (!status.hasProblem(System.currentTimeMillis())) { iconRes = R.drawable.ic_help_outline_white; title = getString(R.string.mailbox_status_problem_title); tintRes = R.color.briar_orange_500;