Show appropriate error message if contact QR code is scanned.

This commit is contained in:
akwizgran
2022-12-02 14:02:31 +00:00
parent b4f3604584
commit 95d8783852
6 changed files with 119 additions and 75 deletions

View File

@@ -10,6 +10,13 @@ import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.event.EventExecutor; import org.briarproject.bramble.api.event.EventExecutor;
import org.briarproject.bramble.api.mailbox.MailboxAuthToken; import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.MailboxAlreadyPaired;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Pairing;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.QrCodeReceived;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.UnexpectedError;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
@@ -84,7 +91,7 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
this.mailboxUpdateManager = mailboxUpdateManager; this.mailboxUpdateManager = mailboxUpdateManager;
this.qrCodeClassifier = qrCodeClassifier; this.qrCodeClassifier = qrCodeClassifier;
timeStarted = clock.currentTimeMillis(); timeStarted = clock.currentTimeMillis();
state = new MailboxPairingState.QrCodeReceived(timeStarted); state = new QrCodeReceived(timeStarted);
} }
@Override @Override
@@ -111,27 +118,25 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
QrCodeType qrCodeType = typeAndVersion.getFirst(); QrCodeType qrCodeType = typeAndVersion.getFirst();
int formatVersion = typeAndVersion.getSecond(); int formatVersion = typeAndVersion.getSecond();
if (qrCodeType != MAILBOX || formatVersion != QR_FORMAT_VERSION) { if (qrCodeType != MAILBOX || formatVersion != QR_FORMAT_VERSION) {
setState(new MailboxPairingState.InvalidQrCode(qrCodeType, setState(new InvalidQrCode(qrCodeType, formatVersion));
formatVersion));
return; return;
} }
try { try {
pairMailbox(); pairMailbox();
} catch (FormatException e) { } catch (FormatException e) {
onMailboxError(e, new MailboxPairingState.InvalidQrCode(qrCodeType, onMailboxError(e, new InvalidQrCode(qrCodeType, formatVersion));
formatVersion));
} catch (MailboxAlreadyPairedException e) { } catch (MailboxAlreadyPairedException e) {
onMailboxError(e, new MailboxPairingState.MailboxAlreadyPaired()); onMailboxError(e, new MailboxAlreadyPaired());
} catch (IOException e) { } catch (IOException e) {
onMailboxError(e, new MailboxPairingState.ConnectionError()); onMailboxError(e, new ConnectionError());
} catch (ApiException | DbException e) { } catch (ApiException | DbException e) {
onMailboxError(e, new MailboxPairingState.UnexpectedError()); onMailboxError(e, new UnexpectedError());
} }
} }
private void pairMailbox() throws IOException, ApiException, DbException { private void pairMailbox() throws IOException, ApiException, DbException {
MailboxProperties mailboxProperties = decodeQrCodePayload(payload); MailboxProperties mailboxProperties = decodeQrCodePayload(payload);
setState(new MailboxPairingState.Pairing(timeStarted)); setState(new Pairing(timeStarted));
MailboxProperties ownerProperties = api.setup(mailboxProperties); MailboxProperties ownerProperties = api.setup(mailboxProperties);
long time = clock.currentTimeMillis(); long time = clock.currentTimeMillis();
db.transaction(false, txn -> { db.transaction(false, txn -> {
@@ -150,7 +155,7 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
} }
} }
}); });
setState(new MailboxPairingState.Paired()); setState(new Paired());
} }
private void onMailboxError(Exception e, MailboxPairingState state) { private void onMailboxError(Exception e, MailboxPairingState state) {

View File

@@ -8,6 +8,13 @@ import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.mailbox.MailboxAuthToken; import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.MailboxAlreadyPaired;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Pairing;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.QrCodeReceived;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.UnexpectedError;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
@@ -17,6 +24,8 @@ import org.briarproject.bramble.api.mailbox.MailboxVersion;
import org.briarproject.bramble.api.qrcode.QrCodeClassifier; import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType; import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.mailbox.MailboxApi.ApiException;
import org.briarproject.bramble.mailbox.MailboxApi.MailboxAlreadyPairedException;
import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.BrambleMockTestCase;
import org.briarproject.bramble.test.DbExpectations; import org.briarproject.bramble.test.DbExpectations;
import org.briarproject.bramble.test.ImmediateExecutor; import org.briarproject.bramble.test.ImmediateExecutor;
@@ -75,8 +84,7 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
public void testInitialQrCodeReceivedState() { public void testInitialQrCodeReceivedState() {
MailboxPairingTask task = createPairingTask(getRandomString(42)); MailboxPairingTask task = createPairingTask(getRandomString(42));
task.addObserver(state -> task.addObserver(state ->
assertTrue(state instanceof MailboxPairingState.QrCodeReceived) assertTrue(state instanceof QrCodeReceived));
);
} }
@Test @Test
@@ -88,8 +96,7 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
task.run(); task.run();
task.addObserver(state -> task.addObserver(state ->
assertTrue(state instanceof MailboxPairingState.InvalidQrCode) assertTrue(state instanceof InvalidQrCode));
);
} }
@Test @Test
@@ -101,8 +108,7 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
task.run(); task.run();
task.addObserver(state -> task.addObserver(state ->
assertTrue(state instanceof MailboxPairingState.InvalidQrCode) assertTrue(state instanceof InvalidQrCode));
);
} }
@Test @Test
@@ -114,8 +120,7 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
task.run(); task.run();
task.addObserver(state -> task.addObserver(state ->
assertTrue(state instanceof MailboxPairingState.InvalidQrCode) assertTrue(state instanceof InvalidQrCode));
);
} }
@Test @Test
@@ -151,14 +156,11 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
MailboxPairingTask task = createPairingTask(validPayload); MailboxPairingTask task = createPairingTask(validPayload);
task.addObserver(state -> { task.addObserver(state -> {
if (i.get() == 0) { if (i.get() == 0) {
assertEquals(MailboxPairingState.QrCodeReceived.class, assertEquals(QrCodeReceived.class, state.getClass());
state.getClass());
} else if (i.get() == 1) { } else if (i.get() == 1) {
assertEquals(MailboxPairingState.Pairing.class, assertEquals(Pairing.class, state.getClass());
state.getClass());
} else if (i.get() == 2) { } else if (i.get() == 2) {
assertEquals(MailboxPairingState.Paired.class, assertEquals(Paired.class, state.getClass());
state.getClass());
} else fail("Unexpected change of state " + state.getClass()); } else fail("Unexpected change of state " + state.getClass());
i.getAndIncrement(); i.getAndIncrement();
}); });
@@ -167,20 +169,18 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
@Test @Test
public void testAlreadyPaired() throws Exception { public void testAlreadyPaired() throws Exception {
testApiException(new MailboxApi.MailboxAlreadyPairedException(), testApiException(new MailboxAlreadyPairedException(),
MailboxPairingState.MailboxAlreadyPaired.class); MailboxAlreadyPaired.class);
} }
@Test @Test
public void testMailboxApiException() throws Exception { public void testMailboxApiException() throws Exception {
testApiException(new MailboxApi.ApiException(), testApiException(new ApiException(), UnexpectedError.class);
MailboxPairingState.UnexpectedError.class);
} }
@Test @Test
public void testApiIOException() throws Exception { public void testApiIOException() throws Exception {
testApiException(new IOException(), testApiException(new IOException(), ConnectionError.class);
MailboxPairingState.ConnectionError.class);
} }
private void testApiException(Exception e, private void testApiException(Exception e,
@@ -219,8 +219,8 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
MailboxPairingTask task = createPairingTask(validPayload); MailboxPairingTask task = createPairingTask(validPayload);
task.run(); task.run();
task.addObserver(state -> assertEquals(state.getClass(), task.addObserver(state ->
MailboxPairingState.UnexpectedError.class)); assertEquals(state.getClass(), UnexpectedError.class));
} }
private PredicateMatcher<MailboxProperties> matches(MailboxProperties p2) { private PredicateMatcher<MailboxProperties> matches(MailboxProperties p2) {

View File

@@ -6,10 +6,24 @@ import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.MailboxAlreadyPaired;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Pending;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.UnexpectedError;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity; import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.fragment.FinalFragment; import org.briarproject.briar.android.fragment.FinalFragment;
import org.briarproject.briar.android.mailbox.MailboxState.CameraError;
import org.briarproject.briar.android.mailbox.MailboxState.IsPaired;
import org.briarproject.briar.android.mailbox.MailboxState.NotSetup;
import org.briarproject.briar.android.mailbox.MailboxState.OfflineWhenPairing;
import org.briarproject.briar.android.mailbox.MailboxState.Pairing;
import org.briarproject.briar.android.mailbox.MailboxState.ScanningQrCode;
import org.briarproject.briar.android.mailbox.MailboxState.ShowDownload;
import org.briarproject.briar.android.mailbox.MailboxState.WasUnpaired;
import org.briarproject.briar.android.view.BlankFragment; import org.briarproject.briar.android.view.BlankFragment;
import org.briarproject.nullsafety.MethodsNotNullByDefault; import org.briarproject.nullsafety.MethodsNotNullByDefault;
import org.briarproject.nullsafety.ParametersNotNullByDefault; import org.briarproject.nullsafety.ParametersNotNullByDefault;
@@ -25,6 +39,9 @@ import androidx.lifecycle.ViewModelProvider;
import static android.view.View.INVISIBLE; import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE; import static android.view.View.VISIBLE;
import static android.widget.Toast.LENGTH_LONG; import static android.widget.Toast.LENGTH_LONG;
import static org.briarproject.bramble.api.mailbox.MailboxConstants.QR_FORMAT_VERSION;
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.BQP;
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
import static org.briarproject.briar.android.util.UiUtils.showFragment; import static org.briarproject.briar.android.util.UiUtils.showFragment;
@MethodsNotNullByDefault @MethodsNotNullByDefault
@@ -56,24 +73,23 @@ public class MailboxActivity extends BriarActivity {
} }
viewModel.getPairingState().observeEvent(this, state -> { viewModel.getPairingState().observeEvent(this, state -> {
if (state instanceof MailboxState.NotSetup) { if (state instanceof NotSetup) {
onNotSetup(); onNotSetup();
} else if (state instanceof MailboxState.ShowDownload) { } else if (state instanceof ShowDownload) {
onShowDownload(); onShowDownload();
} else if (state instanceof MailboxState.ScanningQrCode) { } else if (state instanceof ScanningQrCode) {
onScanningQrCode(); onScanningQrCode();
} else if (state instanceof MailboxState.Pairing) { } else if (state instanceof Pairing) {
MailboxPairingState s = MailboxPairingState s = ((Pairing) state).pairingState;
((MailboxState.Pairing) state).pairingState;
onMailboxPairingStateChanged(s); onMailboxPairingStateChanged(s);
} else if (state instanceof MailboxState.OfflineWhenPairing) { } else if (state instanceof OfflineWhenPairing) {
onOffline(); onOffline();
} else if (state instanceof MailboxState.CameraError) { } else if (state instanceof CameraError) {
onCameraError(); onCameraError();
} else if (state instanceof MailboxState.IsPaired) { } else if (state instanceof IsPaired) {
onIsPaired(((MailboxState.IsPaired) state).isOnline); onIsPaired(((IsPaired) state).isOnline);
} else if (state instanceof MailboxState.WasUnpaired) { } else if (state instanceof WasUnpaired) {
MailboxState.WasUnpaired s = (MailboxState.WasUnpaired) state; WasUnpaired s = (WasUnpaired) state;
onUnPaired(s.tellUserToWipeMailbox); onUnPaired(s.tellUserToWipeMailbox);
} else { } else {
throw new AssertionError("Unknown state: " + state); throw new AssertionError("Unknown state: " + state);
@@ -104,7 +120,7 @@ public class MailboxActivity extends BriarActivity {
@Override @Override
public void onBackPressed() { public void onBackPressed() {
MailboxState s = viewModel.getPairingState().getLastValue(); MailboxState s = viewModel.getPairingState().getLastValue();
if (s instanceof MailboxState.Pairing) { if (s instanceof Pairing) {
// don't go back in the flow if we are already pairing // don't go back in the flow if we are already pairing
// with the mailbox. We provide a try-again button instead. // with the mailbox. We provide a try-again button instead.
supportFinishAfterTransition(); supportFinishAfterTransition();
@@ -158,31 +174,44 @@ public class MailboxActivity extends BriarActivity {
} }
Fragment f; Fragment f;
String tag; String tag;
if (s instanceof MailboxPairingState.Pending) { if (s instanceof Pending) {
long timeStarted = ((MailboxPairingState.Pending) s).timeStarted; long timeStarted = ((Pending) s).timeStarted;
f = MailboxConnectingFragment.newInstance(timeStarted); f = MailboxConnectingFragment.newInstance(timeStarted);
tag = MailboxConnectingFragment.TAG; tag = MailboxConnectingFragment.TAG;
} else if (s instanceof MailboxPairingState.InvalidQrCode) { } else if (s instanceof InvalidQrCode) {
f = ErrorFragment.newInstance( InvalidQrCode i = (InvalidQrCode) s;
R.string.mailbox_setup_qr_code_wrong_title, int errorRes;
R.string.mailbox_setup_qr_code_wrong_description); if (i.qrCodeType == MAILBOX) {
if (i.formatVersion < QR_FORMAT_VERSION) {
errorRes = R.string.mailbox_qr_code_too_old;
} else if (i.formatVersion > QR_FORMAT_VERSION) {
errorRes = R.string.mailbox_qr_code_too_new;
} else {
errorRes = R.string.mailbox_setup_qr_code_wrong_description;
}
} else if (i.qrCodeType == BQP) {
errorRes = R.string.contact_qr_code_for_mailbox;
} else {
errorRes = R.string.mailbox_setup_qr_code_wrong_description;
}
f = ErrorFragment.newInstance(R.string.qr_code_invalid, errorRes);
tag = ErrorFragment.TAG; tag = ErrorFragment.TAG;
} else if (s instanceof MailboxPairingState.MailboxAlreadyPaired) { } else if (s instanceof MailboxAlreadyPaired) {
f = ErrorFragment.newInstance( f = ErrorFragment.newInstance(
R.string.mailbox_setup_already_paired_title, R.string.mailbox_setup_already_paired_title,
R.string.mailbox_setup_already_paired_description); R.string.mailbox_setup_already_paired_description);
tag = ErrorFragment.TAG; tag = ErrorFragment.TAG;
} else if (s instanceof MailboxPairingState.ConnectionError) { } else if (s instanceof ConnectionError) {
f = ErrorFragment.newInstance( f = ErrorFragment.newInstance(
R.string.mailbox_setup_io_error_title, R.string.mailbox_setup_io_error_title,
R.string.mailbox_setup_io_error_description); R.string.mailbox_setup_io_error_description);
tag = ErrorFragment.TAG; tag = ErrorFragment.TAG;
} else if (s instanceof MailboxPairingState.UnexpectedError) { } else if (s instanceof UnexpectedError) {
f = ErrorFragment.newInstance( f = ErrorFragment.newInstance(
R.string.mailbox_setup_assertion_error_title, R.string.mailbox_setup_assertion_error_title,
R.string.mailbox_setup_assertion_error_description); R.string.mailbox_setup_assertion_error_description);
tag = ErrorFragment.TAG; tag = ErrorFragment.TAG;
} else if (s instanceof MailboxPairingState.Paired) { } else if (s instanceof Paired) {
f = FinalFragment.newInstance(R.string.mailbox_setup_paired_title, f = FinalFragment.newInstance(R.string.mailbox_setup_paired_title,
R.drawable.ic_check_circle_outline, R.drawable.ic_check_circle_outline,
R.color.briar_brand_green, R.color.briar_brand_green,

View File

@@ -15,6 +15,7 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.mailbox.MailboxManager; import org.briarproject.bramble.api.mailbox.MailboxManager;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState;
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
import org.briarproject.bramble.api.mailbox.MailboxStatus; import org.briarproject.bramble.api.mailbox.MailboxStatus;
import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent; import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent;
@@ -24,7 +25,14 @@ import org.briarproject.bramble.api.plugin.TorConstants;
import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.TransportId;
import org.briarproject.bramble.api.plugin.event.TransportInactiveEvent; import org.briarproject.bramble.api.plugin.event.TransportInactiveEvent;
import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.briar.android.mailbox.MailboxState.CameraError;
import org.briarproject.briar.android.mailbox.MailboxState.IsPaired;
import org.briarproject.briar.android.mailbox.MailboxState.NotSetup; import org.briarproject.briar.android.mailbox.MailboxState.NotSetup;
import org.briarproject.briar.android.mailbox.MailboxState.OfflineWhenPairing;
import org.briarproject.briar.android.mailbox.MailboxState.Pairing;
import org.briarproject.briar.android.mailbox.MailboxState.ScanningQrCode;
import org.briarproject.briar.android.mailbox.MailboxState.ShowDownload;
import org.briarproject.briar.android.mailbox.MailboxState.WasUnpaired;
import org.briarproject.briar.android.qrcode.QrCodeDecoder; import org.briarproject.briar.android.qrcode.QrCodeDecoder;
import org.briarproject.briar.android.viewmodel.DbViewModel; import org.briarproject.briar.android.viewmodel.DbViewModel;
import org.briarproject.briar.android.viewmodel.LiveEvent; import org.briarproject.briar.android.viewmodel.LiveEvent;
@@ -113,7 +121,7 @@ class MailboxViewModel extends DbViewModel
MailboxStatus mailboxStatus = MailboxStatus mailboxStatus =
mailboxManager.getMailboxStatus(txn); mailboxManager.getMailboxStatus(txn);
boolean isOnline = isTorActive(); boolean isOnline = isTorActive();
pairingState.postEvent(new MailboxState.IsPaired(isOnline)); pairingState.postEvent(new IsPaired(isOnline));
status.postValue(mailboxStatus); status.postValue(mailboxStatus);
} else { } else {
pairingState.postEvent(new NotSetup()); pairingState.postEvent(new NotSetup());
@@ -142,14 +150,14 @@ class MailboxViewModel extends DbViewModel
@UiThread @UiThread
private void onTorInactive() { private void onTorInactive() {
MailboxState lastState = pairingState.getLastValue(); MailboxState lastState = pairingState.getLastValue();
if (lastState instanceof MailboxState.IsPaired) { if (lastState instanceof IsPaired) {
// we are already paired, so use IsPaired state // we are already paired, so use IsPaired state
pairingState.setEvent(new MailboxState.IsPaired(false)); pairingState.setEvent(new IsPaired(false));
} else if (lastState instanceof MailboxState.Pairing) { } else if (lastState instanceof Pairing) {
MailboxState.Pairing p = (MailboxState.Pairing) lastState; Pairing p = (Pairing) lastState;
// check that we not just finished pairing (showing success screen) // check that we not just finished pairing (showing success screen)
if (!(p.pairingState instanceof MailboxPairingState.Paired)) { if (!(p.pairingState instanceof Paired)) {
pairingState.setEvent(new MailboxState.OfflineWhenPairing()); pairingState.setEvent(new OfflineWhenPairing());
} }
// else ignore offline event as user will be leaving UI flow anyway // else ignore offline event as user will be leaving UI flow anyway
} }
@@ -158,15 +166,15 @@ class MailboxViewModel extends DbViewModel
@UiThread @UiThread
void onScanButtonClicked() { void onScanButtonClicked() {
if (isTorActive()) { if (isTorActive()) {
pairingState.setEvent(new MailboxState.ScanningQrCode()); pairingState.setEvent(new ScanningQrCode());
} else { } else {
pairingState.setEvent(new MailboxState.OfflineWhenPairing()); pairingState.setEvent(new OfflineWhenPairing());
} }
} }
@UiThread @UiThread
void onCameraError() { void onCameraError() {
pairingState.setEvent(new MailboxState.CameraError()); pairingState.setEvent(new CameraError());
} }
@Override @Override
@@ -182,7 +190,7 @@ class MailboxViewModel extends DbViewModel
pairingTask = mailboxManager.startPairingTask(qrCodePayload); pairingTask = mailboxManager.startPairingTask(qrCodePayload);
pairingTask.addObserver(this); pairingTask.addObserver(this);
} else { } else {
pairingState.postEvent(new MailboxState.OfflineWhenPairing()); pairingState.postEvent(new OfflineWhenPairing());
} }
} }
@@ -193,7 +201,7 @@ class MailboxViewModel extends DbViewModel
LOG.info("New pairing state: " + LOG.info("New pairing state: " +
mailboxPairingState.getClass().getSimpleName()); mailboxPairingState.getClass().getSimpleName());
} }
pairingState.setEvent(new MailboxState.Pairing(mailboxPairingState)); pairingState.setEvent(new Pairing(mailboxPairingState));
} }
private boolean isTorActive() { private boolean isTorActive() {
@@ -203,7 +211,7 @@ class MailboxViewModel extends DbViewModel
@UiThread @UiThread
void showDownloadFragment() { void showDownloadFragment() {
pairingState.setEvent(new MailboxState.ShowDownload()); pairingState.setEvent(new ShowDownload());
} }
@UiThread @UiThread
@@ -214,7 +222,7 @@ class MailboxViewModel extends DbViewModel
@UiThread @UiThread
void checkIfOnlineWhenPaired() { void checkIfOnlineWhenPaired() {
boolean isOnline = isTorActive(); boolean isOnline = isTorActive();
pairingState.setEvent(new MailboxState.IsPaired(isOnline)); pairingState.setEvent(new IsPaired(isOnline));
} }
LiveData<Boolean> checkConnection() { LiveData<Boolean> checkConnection() {
@@ -227,7 +235,7 @@ class MailboxViewModel extends DbViewModel
checkConnection(success -> { checkConnection(success -> {
boolean isOnline = isTorActive(); boolean isOnline = isTorActive();
// make UI move back to status fragment by changing pairingState // make UI move back to status fragment by changing pairingState
pairingState.postEvent(new MailboxState.IsPaired(isOnline)); pairingState.postEvent(new IsPaired(isOnline));
}); });
} }
@@ -246,7 +254,7 @@ class MailboxViewModel extends DbViewModel
ioExecutor.execute(() -> { ioExecutor.execute(() -> {
try { try {
boolean wasWiped = mailboxManager.unPair(); boolean wasWiped = mailboxManager.unPair();
pairingState.postEvent(new MailboxState.WasUnpaired(!wasWiped)); pairingState.postEvent(new WasUnpaired(!wasWiped));
} catch (DbException e) { } catch (DbException e) {
handleException(e); handleException(e);
} }

View File

@@ -637,8 +637,10 @@
<string name="mailbox_setup_connecting">Connecting to Mailbox…</string> <string name="mailbox_setup_connecting">Connecting to Mailbox…</string>
<!-- This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes". --> <!-- This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes". -->
<string name="mailbox_setup_connecting_info">This may take up to %1s</string> <string name="mailbox_setup_connecting_info">This may take up to %1s</string>
<string name="mailbox_setup_qr_code_wrong_title">Wrong QR code</string> <string name="mailbox_qr_code_too_old">The QR code you have scanned comes from an older version of Briar Mailbox.\n\nPlease upgrade Briar Mailbox to the latest version and then try again.</string>
<string name="mailbox_setup_qr_code_wrong_description">The scanned code is invalid. Please open the Briar Mailbox app on your Mailbox device and scan the QR code it presents.</string> <string name="mailbox_qr_code_too_new">The QR code you have scanned comes from a newer version of Briar Mailbox.\n\nPlease upgrade Briar to the latest version and then try again.</string>
<string name="contact_qr_code_for_mailbox">The QR code you have scanned is for adding a Briar contact.\n\nIf you want to add a contact, please go to the contact list and tap the + icon.</string>
<string name="mailbox_setup_qr_code_wrong_description">The QR code you have scanned does not come from Briar Mailbox.\n\nPlease open the Briar Mailbox app on your Mailbox device and scan the QR code it presents.</string>
<string name="mailbox_setup_already_paired_title">Mailbox already linked</string> <string name="mailbox_setup_already_paired_title">Mailbox already linked</string>
<string name="mailbox_setup_already_paired_description">Unlink the Mailbox on your other device and try again.</string> <string name="mailbox_setup_already_paired_description">Unlink the Mailbox on your other device and try again.</string>
<string name="mailbox_setup_io_error_title">Could not connect</string> <string name="mailbox_setup_io_error_title">Could not connect</string>

View File

@@ -11,7 +11,7 @@ import org.briarproject.bramble.api.identity.IdentityManager;
import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.identity.LocalAuthor;
import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.mailbox.MailboxAuthToken; import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
import org.briarproject.bramble.api.mailbox.MailboxPairingState; import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
import org.briarproject.bramble.api.mailbox.MailboxPairingTask; import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
import org.briarproject.bramble.api.mailbox.MailboxProperties; import org.briarproject.bramble.api.mailbox.MailboxProperties;
import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox; import org.briarproject.bramble.api.mailbox.MailboxUpdateWithMailbox;
@@ -121,7 +121,7 @@ abstract class AbstractMailboxIntegrationTest
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
pairingTask.addObserver((state) -> { pairingTask.addObserver((state) -> {
if (state instanceof MailboxPairingState.Paired) { if (state instanceof Paired) {
latch.countDown(); latch.countDown();
} }
}); });