mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-11 18:29:05 +01:00
Show appropriate error message if contact QR code is scanned.
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user