From 5e7891d78ab515542fbb93e53c633f57916dd36c Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Fri, 1 Apr 2022 12:46:33 -0300 Subject: [PATCH] Add checkConnection() to MailboxManager --- .../bramble/api/mailbox/MailboxManager.java | 13 +++++ .../bramble/mailbox/MailboxManagerImpl.java | 50 ++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) 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 dabfb9ea4..1e1edfe92 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 @@ -1,7 +1,9 @@ package org.briarproject.bramble.api.mailbox; +import org.briarproject.bramble.api.Consumer; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.lifecycle.IoExecutor; import javax.annotation.Nullable; @@ -32,4 +34,15 @@ public interface MailboxManager { */ MailboxPairingTask startPairingTask(String qrCodePayload); + /** + * Can be used by the UI to test the mailbox connection. + * After the connection has been made, the given {@param connectionCallback} + * will be called with true (success) or false (error). + * In addition, a {@link OwnMailboxConnectionStatusEvent} might be broadcast + * with a new {@link MailboxStatus}. + *

+ * Note that the callback will be made on the {@link IoExecutor}. + */ + void checkConnection(Consumer connectionCallback); + } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java index 7bbeb0e12..6db11986b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java @@ -1,28 +1,44 @@ package org.briarproject.bramble.mailbox; +import org.briarproject.bramble.api.Consumer; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.mailbox.MailboxManager; import org.briarproject.bramble.api.mailbox.MailboxPairingTask; +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.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.system.Clock; +import java.io.IOException; import java.util.concurrent.Executor; +import java.util.logging.Logger; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; +import static java.util.logging.Level.WARNING; +import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.LogUtils.logException; + @Immutable @NotNullByDefault class MailboxManagerImpl implements MailboxManager { + private static final String TAG = MailboxManagerImpl.class.getName(); + private final static Logger LOG = getLogger(TAG); + private final Executor ioExecutor; + private final MailboxApi api; + private final TransactionManager db; private final MailboxSettingsManager mailboxSettingsManager; private final MailboxPairingTaskFactory pairingTaskFactory; + private final Clock clock; private final Object lock = new Object(); @Nullable @@ -32,11 +48,17 @@ class MailboxManagerImpl implements MailboxManager { @Inject MailboxManagerImpl( @IoExecutor Executor ioExecutor, + MailboxApi api, + TransactionManager db, MailboxSettingsManager mailboxSettingsManager, - MailboxPairingTaskFactory pairingTaskFactory) { + MailboxPairingTaskFactory pairingTaskFactory, + Clock clock) { this.ioExecutor = ioExecutor; + this.api = api; + this.db = db; this.mailboxSettingsManager = mailboxSettingsManager; this.pairingTaskFactory = pairingTaskFactory; + this.clock = clock; } @Override @@ -75,4 +97,30 @@ class MailboxManagerImpl implements MailboxManager { return created; } + @Override + public void checkConnection(Consumer connectionCallback) { + ioExecutor.execute(() -> { + boolean success; + try { + MailboxProperties props = db.transactionWithNullableResult(true, + mailboxSettingsManager::getOwnMailboxProperties); + success = api.checkStatus(props); + } catch (DbException | IOException | MailboxApi.ApiException e) { + success = false; + logException(LOG, WARNING, e); + } + connectionCallback.accept(success); + if (!success) return; + try { + // we are only recording successful connections here + // as those update the UI and failures might be false negatives + db.transaction(false, txn -> + mailboxSettingsManager.recordSuccessfulConnection(txn, + clock.currentTimeMillis())); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + } + }