Show notification warning when own mailbox is unreachable

This commit is contained in:
Torsten Grote
2022-05-23 12:52:04 -03:00
parent c8caae49f1
commit 6c19b22aab
5 changed files with 75 additions and 2 deletions

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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<MailboxState> 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<MailboxState> getPairingState() {
return pairingState;

View File

@@ -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();
}