mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-13 19:29:06 +01:00
Merge branch '2319-mailbox-version-warning' into 'master'
Show warning if own mailbox's API version is incompatible Closes #2319 See merge request briar/briar!1651
This commit is contained in:
@@ -2,6 +2,9 @@ package org.briarproject.bramble.api.mailbox;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
import static java.util.concurrent.TimeUnit.HOURS;
|
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_FRAME_LENGTH;
|
||||||
import static org.briarproject.bramble.api.transport.TransportConstants.MAX_PAYLOAD_LENGTH;
|
import static org.briarproject.bramble.api.transport.TransportConstants.MAX_PAYLOAD_LENGTH;
|
||||||
@@ -15,6 +18,27 @@ public interface MailboxConstants {
|
|||||||
*/
|
*/
|
||||||
TransportId ID = new TransportId("org.briarproject.bramble.mailbox");
|
TransportId ID = new TransportId("org.briarproject.bramble.mailbox");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mailbox API versions that we support as a client. This is reported to our
|
||||||
|
* contacts by {@link MailboxUpdateManager}.
|
||||||
|
*/
|
||||||
|
List<MailboxVersion> CLIENT_SUPPORTS = singletonList(
|
||||||
|
new MailboxVersion(1, 0));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The constant returned by
|
||||||
|
* {@link MailboxHelper#getHighestCommonMajorVersion(List, List)}
|
||||||
|
* when the server is too old to support our major version.
|
||||||
|
*/
|
||||||
|
int API_SERVER_TOO_OLD = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The constant returned by
|
||||||
|
* {@link MailboxHelper#getHighestCommonMajorVersion(List, List)}
|
||||||
|
* when we as a client are too old to support the server's major version.
|
||||||
|
*/
|
||||||
|
int API_CLIENT_TOO_OLD = -2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The maximum length of a file that can be uploaded to or downloaded from
|
* The maximum length of a file that can be uploaded to or downloaded from
|
||||||
* a mailbox.
|
* a mailbox.
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package org.briarproject.bramble.api.mailbox;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_CLIENT_TOO_OLD;
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_SERVER_TOO_OLD;
|
||||||
|
|
||||||
|
class MailboxHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the highest major version that both client and server support
|
||||||
|
* or {@link MailboxConstants#API_SERVER_TOO_OLD} if the server is too old
|
||||||
|
* or {@link MailboxConstants#API_CLIENT_TOO_OLD} if the client is too old.
|
||||||
|
*/
|
||||||
|
static int getHighestCommonMajorVersion(
|
||||||
|
List<MailboxVersion> client, List<MailboxVersion> server) {
|
||||||
|
TreeSet<Integer> clientVersions = new TreeSet<>();
|
||||||
|
for (MailboxVersion version : client) {
|
||||||
|
clientVersions.add(version.getMajor());
|
||||||
|
}
|
||||||
|
TreeSet<Integer> serverVersions = new TreeSet<>();
|
||||||
|
for (MailboxVersion version : server) {
|
||||||
|
serverVersions.add(version.getMajor());
|
||||||
|
}
|
||||||
|
for (int clientVersion : clientVersions.descendingSet()) {
|
||||||
|
if (serverVersions.contains(clientVersion)) return clientVersion;
|
||||||
|
}
|
||||||
|
if (clientVersions.last() < serverVersions.last()) {
|
||||||
|
return API_CLIENT_TOO_OLD;
|
||||||
|
}
|
||||||
|
return API_SERVER_TOO_OLD;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,10 +2,14 @@ package org.briarproject.bramble.api.mailbox;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS;
|
||||||
import static org.briarproject.bramble.api.mailbox.MailboxConstants.PROBLEM_MS_SINCE_LAST_SUCCESS;
|
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;
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.PROBLEM_NUM_CONNECTION_FAILURES;
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxHelper.getHighestCommonMajorVersion;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
@@ -13,12 +17,15 @@ public class MailboxStatus {
|
|||||||
|
|
||||||
private final long lastAttempt, lastSuccess;
|
private final long lastAttempt, lastSuccess;
|
||||||
private final int attemptsSinceSuccess;
|
private final int attemptsSinceSuccess;
|
||||||
|
private final List<MailboxVersion> serverSupports;
|
||||||
|
|
||||||
public MailboxStatus(long lastAttempt, long lastSuccess,
|
public MailboxStatus(long lastAttempt, long lastSuccess,
|
||||||
int attemptsSinceSuccess) {
|
int attemptsSinceSuccess,
|
||||||
|
List<MailboxVersion> serverSupports) {
|
||||||
this.lastAttempt = lastAttempt;
|
this.lastAttempt = lastAttempt;
|
||||||
this.lastSuccess = lastSuccess;
|
this.lastSuccess = lastSuccess;
|
||||||
this.attemptsSinceSuccess = attemptsSinceSuccess;
|
this.attemptsSinceSuccess = attemptsSinceSuccess;
|
||||||
|
this.serverSupports = serverSupports;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,4 +74,13 @@ public class MailboxStatus {
|
|||||||
return attemptsSinceSuccess >= PROBLEM_NUM_CONNECTION_FAILURES &&
|
return attemptsSinceSuccess >= PROBLEM_NUM_CONNECTION_FAILURES &&
|
||||||
(now - lastSuccess) >= PROBLEM_MS_SINCE_LAST_SUCCESS;
|
(now - lastSuccess) >= PROBLEM_MS_SINCE_LAST_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a positive integer if the mailbox is compatible. Same result as
|
||||||
|
* {@link MailboxHelper#getHighestCommonMajorVersion(List, List)}.
|
||||||
|
*/
|
||||||
|
public int getMailboxCompatibility() {
|
||||||
|
return getHighestCommonMajorVersion(CLIENT_SUPPORTS, serverSupports);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package org.briarproject.bramble.api.mailbox;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_CLIENT_TOO_OLD;
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_SERVER_TOO_OLD;
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxHelper.getHighestCommonMajorVersion;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class MailboxHelperTest {
|
||||||
|
|
||||||
|
private final Random random = new Random();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetHighestCommonMajorVersion() {
|
||||||
|
assertEquals(2, getHighestCommonMajorVersion(v(2), v(2)));
|
||||||
|
assertEquals(2, getHighestCommonMajorVersion(v(1, 2), v(2, 3, 4)));
|
||||||
|
assertEquals(2, getHighestCommonMajorVersion(v(2, 3, 4), v(2)));
|
||||||
|
assertEquals(2, getHighestCommonMajorVersion(v(2), v(2, 3, 4)));
|
||||||
|
|
||||||
|
assertEquals(API_CLIENT_TOO_OLD,
|
||||||
|
getHighestCommonMajorVersion(v(2), v(3, 4)));
|
||||||
|
assertEquals(API_CLIENT_TOO_OLD,
|
||||||
|
getHighestCommonMajorVersion(v(2), v(1, 3)));
|
||||||
|
assertEquals(API_SERVER_TOO_OLD,
|
||||||
|
getHighestCommonMajorVersion(v(3, 4, 5), v(2)));
|
||||||
|
assertEquals(API_SERVER_TOO_OLD,
|
||||||
|
getHighestCommonMajorVersion(v(1, 3), v(2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MailboxVersion> v(int... ints) {
|
||||||
|
List<MailboxVersion> versions = new ArrayList<>(ints.length);
|
||||||
|
for (int v : ints) {
|
||||||
|
// minor versions should not matter
|
||||||
|
versions.add(new MailboxVersion(v, random.nextInt(42)));
|
||||||
|
}
|
||||||
|
return versions;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -7,7 +7,6 @@ import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
|
|||||||
import org.briarproject.bramble.api.mailbox.MailboxFileId;
|
import org.briarproject.bramble.api.mailbox.MailboxFileId;
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxFolderId;
|
import org.briarproject.bramble.api.mailbox.MailboxFolderId;
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxUpdateManager;
|
|
||||||
import org.briarproject.bramble.api.mailbox.MailboxVersion;
|
import org.briarproject.bramble.api.mailbox.MailboxVersion;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
@@ -19,18 +18,9 @@ import java.util.List;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
import static java.util.Collections.singletonList;
|
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
interface MailboxApi {
|
interface MailboxApi {
|
||||||
|
|
||||||
/**
|
|
||||||
* Mailbox API versions that we support as a client. This is reported to our
|
|
||||||
* contacts by {@link MailboxUpdateManager}.
|
|
||||||
*/
|
|
||||||
List<MailboxVersion> CLIENT_SUPPORTS = singletonList(
|
|
||||||
new MailboxVersion(1, 0));
|
|
||||||
|
|
||||||
List<MailboxVersion> getServerSupports(MailboxProperties properties)
|
List<MailboxVersion> getServerSupports(MailboxProperties properties)
|
||||||
throws IOException, ApiException;
|
throws IOException, ApiException;
|
||||||
|
|
||||||
|
|||||||
@@ -22,10 +22,10 @@ import javax.inject.Singleton;
|
|||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
import dagger.Provides;
|
import dagger.Provides;
|
||||||
|
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS;
|
||||||
import static org.briarproject.bramble.api.mailbox.MailboxUpdateManager.CLIENT_ID;
|
import static org.briarproject.bramble.api.mailbox.MailboxUpdateManager.CLIENT_ID;
|
||||||
import static org.briarproject.bramble.api.mailbox.MailboxUpdateManager.MAJOR_VERSION;
|
import static org.briarproject.bramble.api.mailbox.MailboxUpdateManager.MAJOR_VERSION;
|
||||||
import static org.briarproject.bramble.api.mailbox.MailboxUpdateManager.MINOR_VERSION;
|
import static org.briarproject.bramble.api.mailbox.MailboxUpdateManager.MINOR_VERSION;
|
||||||
import static org.briarproject.bramble.mailbox.MailboxApi.CLIENT_SUPPORTS;
|
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
public class MailboxModule {
|
public class MailboxModule {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import javax.annotation.Nullable;
|
|||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import static java.util.Collections.emptyList;
|
||||||
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@@ -60,15 +61,7 @@ class MailboxSettingsManagerImpl implements MailboxSettingsManager {
|
|||||||
String onion = s.get(SETTINGS_KEY_ONION);
|
String onion = s.get(SETTINGS_KEY_ONION);
|
||||||
String token = s.get(SETTINGS_KEY_TOKEN);
|
String token = s.get(SETTINGS_KEY_TOKEN);
|
||||||
if (isNullOrEmpty(onion) || isNullOrEmpty(token)) return null;
|
if (isNullOrEmpty(onion) || isNullOrEmpty(token)) return null;
|
||||||
int[] ints = s.getIntArray(SETTINGS_KEY_SERVER_SUPPORTS);
|
List<MailboxVersion> serverSupports = parseServerSupports(s);
|
||||||
// We know we were paired, so we must have proper serverSupports
|
|
||||||
if (ints == null || ints.length == 0 || ints.length % 2 != 0) {
|
|
||||||
throw new DbException();
|
|
||||||
}
|
|
||||||
List<MailboxVersion> serverSupports = new ArrayList<>();
|
|
||||||
for (int i = 0; i < ints.length - 1; i += 2) {
|
|
||||||
serverSupports.add(new MailboxVersion(ints[i], ints[i + 1]));
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
MailboxAuthToken tokenId = MailboxAuthToken.fromString(token);
|
MailboxAuthToken tokenId = MailboxAuthToken.fromString(token);
|
||||||
return new MailboxProperties(onion, tokenId, serverSupports);
|
return new MailboxProperties(onion, tokenId, serverSupports);
|
||||||
@@ -115,18 +108,28 @@ class MailboxSettingsManagerImpl implements MailboxSettingsManager {
|
|||||||
long lastAttempt = s.getLong(SETTINGS_KEY_LAST_ATTEMPT, -1);
|
long lastAttempt = s.getLong(SETTINGS_KEY_LAST_ATTEMPT, -1);
|
||||||
long lastSuccess = s.getLong(SETTINGS_KEY_LAST_SUCCESS, -1);
|
long lastSuccess = s.getLong(SETTINGS_KEY_LAST_SUCCESS, -1);
|
||||||
int attempts = s.getInt(SETTINGS_KEY_ATTEMPTS, 0);
|
int attempts = s.getInt(SETTINGS_KEY_ATTEMPTS, 0);
|
||||||
return new MailboxStatus(lastAttempt, lastSuccess, attempts);
|
List<MailboxVersion> serverSupports;
|
||||||
|
try {
|
||||||
|
serverSupports = parseServerSupports(s);
|
||||||
|
} catch (DbException e) {
|
||||||
|
serverSupports = emptyList();
|
||||||
|
}
|
||||||
|
return new MailboxStatus(lastAttempt, lastSuccess, attempts,
|
||||||
|
serverSupports);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void recordSuccessfulConnection(Transaction txn, long now)
|
public void recordSuccessfulConnection(Transaction txn, long now)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
|
Settings oldSettings =
|
||||||
|
settingsManager.getSettings(txn, SETTINGS_NAMESPACE);
|
||||||
Settings s = new Settings();
|
Settings s = new Settings();
|
||||||
s.putLong(SETTINGS_KEY_LAST_ATTEMPT, now);
|
s.putLong(SETTINGS_KEY_LAST_ATTEMPT, now);
|
||||||
s.putLong(SETTINGS_KEY_LAST_SUCCESS, now);
|
s.putLong(SETTINGS_KEY_LAST_SUCCESS, now);
|
||||||
s.putInt(SETTINGS_KEY_ATTEMPTS, 0);
|
s.putInt(SETTINGS_KEY_ATTEMPTS, 0);
|
||||||
settingsManager.mergeSettings(txn, s, SETTINGS_NAMESPACE);
|
settingsManager.mergeSettings(txn, s, SETTINGS_NAMESPACE);
|
||||||
MailboxStatus status = new MailboxStatus(now, now, 0);
|
List<MailboxVersion> serverSupports = parseServerSupports(oldSettings);
|
||||||
|
MailboxStatus status = new MailboxStatus(now, now, 0, serverSupports);
|
||||||
txn.attach(new OwnMailboxConnectionStatusEvent(status));
|
txn.attach(new OwnMailboxConnectionStatusEvent(status));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +144,9 @@ class MailboxSettingsManagerImpl implements MailboxSettingsManager {
|
|||||||
newSettings.putLong(SETTINGS_KEY_LAST_ATTEMPT, now);
|
newSettings.putLong(SETTINGS_KEY_LAST_ATTEMPT, now);
|
||||||
newSettings.putInt(SETTINGS_KEY_ATTEMPTS, newAttempts);
|
newSettings.putInt(SETTINGS_KEY_ATTEMPTS, newAttempts);
|
||||||
settingsManager.mergeSettings(txn, newSettings, SETTINGS_NAMESPACE);
|
settingsManager.mergeSettings(txn, newSettings, SETTINGS_NAMESPACE);
|
||||||
MailboxStatus status = new MailboxStatus(now, lastSuccess, newAttempts);
|
List<MailboxVersion> serverSupports = parseServerSupports(oldSettings);
|
||||||
|
MailboxStatus status = new MailboxStatus(now, lastSuccess, newAttempts,
|
||||||
|
serverSupports);
|
||||||
txn.attach(new OwnMailboxConnectionStatusEvent(status));
|
txn.attach(new OwnMailboxConnectionStatusEvent(status));
|
||||||
if (status.hasProblem(now)) txn.attach(new MailboxProblemEvent());
|
if (status.hasProblem(now)) txn.attach(new MailboxProblemEvent());
|
||||||
}
|
}
|
||||||
@@ -165,4 +170,19 @@ class MailboxSettingsManagerImpl implements MailboxSettingsManager {
|
|||||||
if (isNullOrEmpty(filename)) return null;
|
if (isNullOrEmpty(filename)) return null;
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<MailboxVersion> parseServerSupports(Settings s)
|
||||||
|
throws DbException {
|
||||||
|
if (!s.containsKey(SETTINGS_KEY_SERVER_SUPPORTS)) return emptyList();
|
||||||
|
int[] ints = s.getIntArray(SETTINGS_KEY_SERVER_SUPPORTS);
|
||||||
|
// We know we were paired, so we must have proper serverSupports
|
||||||
|
if (ints == null || ints.length == 0 || ints.length % 2 != 0) {
|
||||||
|
throw new DbException();
|
||||||
|
}
|
||||||
|
List<MailboxVersion> serverSupports = new ArrayList<>();
|
||||||
|
for (int i = 0; i < ints.length - 1; i += 2) {
|
||||||
|
serverSupports.add(new MailboxVersion(ints[i], ints[i + 1]));
|
||||||
|
}
|
||||||
|
return serverSupports;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS;
|
||||||
import static org.briarproject.bramble.mailbox.ConnectivityCheckerImpl.CONNECTIVITY_CHECK_FRESHNESS_MS;
|
import static org.briarproject.bramble.mailbox.ConnectivityCheckerImpl.CONNECTIVITY_CHECK_FRESHNESS_MS;
|
||||||
import static org.briarproject.bramble.mailbox.MailboxApi.CLIENT_SUPPORTS;
|
|
||||||
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
||||||
|
|
||||||
public class ConnectivityCheckerImplTest extends BrambleMockTestCase {
|
public class ConnectivityCheckerImplTest extends BrambleMockTestCase {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import org.junit.Test;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import static org.briarproject.bramble.mailbox.MailboxApi.CLIENT_SUPPORTS;
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import okio.Buffer;
|
|||||||
|
|
||||||
import static java.util.Collections.singletonList;
|
import static java.util.Collections.singletonList;
|
||||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||||
import static org.briarproject.bramble.mailbox.MailboxApi.CLIENT_SUPPORTS;
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getContactId;
|
import static org.briarproject.bramble.test.TestUtils.getContactId;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
|
import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
|
||||||
|
|||||||
@@ -146,12 +146,17 @@ public class MailboxSettingsManagerImplTest extends BrambleMockTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testRecordsSuccess() throws Exception {
|
public void testRecordsSuccess() throws Exception {
|
||||||
Transaction txn = new Transaction(null, false);
|
Transaction txn = new Transaction(null, false);
|
||||||
|
Settings oldSettings = new Settings();
|
||||||
|
oldSettings
|
||||||
|
.putIntArray(SETTINGS_KEY_SERVER_SUPPORTS, serverSupportsInts);
|
||||||
Settings expectedSettings = new Settings();
|
Settings expectedSettings = new Settings();
|
||||||
expectedSettings.putLong(SETTINGS_KEY_LAST_ATTEMPT, now);
|
expectedSettings.putLong(SETTINGS_KEY_LAST_ATTEMPT, now);
|
||||||
expectedSettings.putLong(SETTINGS_KEY_LAST_SUCCESS, now);
|
expectedSettings.putLong(SETTINGS_KEY_LAST_SUCCESS, now);
|
||||||
expectedSettings.putInt(SETTINGS_KEY_ATTEMPTS, 0);
|
expectedSettings.putInt(SETTINGS_KEY_ATTEMPTS, 0);
|
||||||
|
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
|
oneOf(settingsManager).getSettings(txn, SETTINGS_NAMESPACE);
|
||||||
|
will(returnValue(oldSettings));
|
||||||
oneOf(settingsManager).mergeSettings(txn, expectedSettings,
|
oneOf(settingsManager).mergeSettings(txn, expectedSettings,
|
||||||
SETTINGS_NAMESPACE);
|
SETTINGS_NAMESPACE);
|
||||||
}});
|
}});
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import org.junit.Test;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import static org.briarproject.bramble.mailbox.MailboxApi.CLIENT_SUPPORTS;
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.CLIENT_SUPPORTS;
|
||||||
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
import static org.briarproject.bramble.test.TestUtils.getMailboxProperties;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import static android.view.View.VISIBLE;
|
|||||||
import static androidx.core.content.ContextCompat.getColor;
|
import static androidx.core.content.ContextCompat.getColor;
|
||||||
import static androidx.core.widget.ImageViewCompat.setImageTintList;
|
import static androidx.core.widget.ImageViewCompat.setImageTintList;
|
||||||
import static androidx.transition.TransitionManager.beginDelayedTransition;
|
import static androidx.transition.TransitionManager.beginDelayedTransition;
|
||||||
|
import static org.briarproject.bramble.api.mailbox.MailboxConstants.API_CLIENT_TOO_OLD;
|
||||||
import static org.briarproject.briar.android.AppModule.getAndroidComponent;
|
import static org.briarproject.briar.android.AppModule.getAndroidComponent;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.MIN_DATE_RESOLUTION;
|
import static org.briarproject.briar.android.util.UiUtils.MIN_DATE_RESOLUTION;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.formatDate;
|
import static org.briarproject.briar.android.util.UiUtils.formatDate;
|
||||||
@@ -47,7 +48,6 @@ import static org.briarproject.briar.android.util.UiUtils.showFragment;
|
|||||||
public class MailboxStatusFragment extends Fragment {
|
public class MailboxStatusFragment extends Fragment {
|
||||||
|
|
||||||
static final String TAG = MailboxStatusFragment.class.getName();
|
static final String TAG = MailboxStatusFragment.class.getName();
|
||||||
private static final int NUM_FAILURES = 4;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ViewModelProvider.Factory viewModelFactory;
|
ViewModelProvider.Factory viewModelFactory;
|
||||||
@@ -59,8 +59,7 @@ public class MailboxStatusFragment extends Fragment {
|
|||||||
private boolean showUnlinkWarning = true;
|
private boolean showUnlinkWarning = true;
|
||||||
|
|
||||||
private ImageView imageView;
|
private ImageView imageView;
|
||||||
private TextView statusTitleView;
|
private TextView statusTitleView, statusMessageView, statusInfoView;
|
||||||
private TextView statusInfoView;
|
|
||||||
private Button wizardButton;
|
private Button wizardButton;
|
||||||
private Button unlinkButton;
|
private Button unlinkButton;
|
||||||
private ProgressBar unlinkProgress;
|
private ProgressBar unlinkProgress;
|
||||||
@@ -95,6 +94,7 @@ public class MailboxStatusFragment extends Fragment {
|
|||||||
|
|
||||||
imageView = v.findViewById(R.id.imageView);
|
imageView = v.findViewById(R.id.imageView);
|
||||||
statusTitleView = v.findViewById(R.id.statusTitleView);
|
statusTitleView = v.findViewById(R.id.statusTitleView);
|
||||||
|
statusMessageView = v.findViewById(R.id.statusMessageView);
|
||||||
statusInfoView = v.findViewById(R.id.statusInfoView);
|
statusInfoView = v.findViewById(R.id.statusInfoView);
|
||||||
viewModel.getStatus()
|
viewModel.getStatus()
|
||||||
.observe(getViewLifecycleOwner(), this::onMailboxStateChanged);
|
.observe(getViewLifecycleOwner(), this::onMailboxStateChanged);
|
||||||
@@ -133,29 +133,51 @@ public class MailboxStatusFragment extends Fragment {
|
|||||||
@ColorRes int tintRes;
|
@ColorRes int tintRes;
|
||||||
@DrawableRes int iconRes;
|
@DrawableRes int iconRes;
|
||||||
String title;
|
String title;
|
||||||
if (status.getAttemptsSinceSuccess() == 0) {
|
String message = null;
|
||||||
iconRes = R.drawable.ic_check_circle_outline;
|
if (status.hasProblem(System.currentTimeMillis())) {
|
||||||
title = getString(R.string.mailbox_status_connected_title);
|
|
||||||
tintRes = R.color.briar_brand_green;
|
|
||||||
showUnlinkWarning = true;
|
|
||||||
wizardButton.setVisibility(GONE);
|
|
||||||
} 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;
|
|
||||||
showUnlinkWarning = false;
|
|
||||||
wizardButton.setVisibility(VISIBLE);
|
|
||||||
} else {
|
|
||||||
tintRes = R.color.briar_red_500;
|
tintRes = R.color.briar_red_500;
|
||||||
title = getString(R.string.mailbox_status_failure_title);
|
title = getString(R.string.mailbox_status_failure_title);
|
||||||
iconRes = R.drawable.alerts_and_states_error;
|
iconRes = R.drawable.alerts_and_states_error;
|
||||||
showUnlinkWarning = false;
|
showUnlinkWarning = false;
|
||||||
wizardButton.setVisibility(VISIBLE);
|
wizardButton.setVisibility(VISIBLE);
|
||||||
|
} else if (status.getAttemptsSinceSuccess() > 0) {
|
||||||
|
iconRes = R.drawable.ic_help_outline_white;
|
||||||
|
title = getString(R.string.mailbox_status_problem_title);
|
||||||
|
tintRes = R.color.briar_orange_500;
|
||||||
|
showUnlinkWarning = false;
|
||||||
|
wizardButton.setVisibility(VISIBLE);
|
||||||
|
} else if (status.getMailboxCompatibility() < 0) {
|
||||||
|
tintRes = R.color.briar_red_500;
|
||||||
|
if (status.getMailboxCompatibility() == API_CLIENT_TOO_OLD) {
|
||||||
|
title = getString(R.string.mailbox_status_app_too_old_title);
|
||||||
|
message =
|
||||||
|
getString(R.string.mailbox_status_app_too_old_message);
|
||||||
|
} else {
|
||||||
|
title = getString(
|
||||||
|
R.string.mailbox_status_mailbox_too_old_title);
|
||||||
|
message = getString(
|
||||||
|
R.string.mailbox_status_mailbox_too_old_message);
|
||||||
|
}
|
||||||
|
iconRes = R.drawable.alerts_and_states_error;
|
||||||
|
showUnlinkWarning = true;
|
||||||
|
wizardButton.setVisibility(GONE);
|
||||||
|
} else {
|
||||||
|
iconRes = R.drawable.ic_check_circle_outline;
|
||||||
|
title = getString(R.string.mailbox_status_connected_title);
|
||||||
|
tintRes = R.color.briar_brand_green;
|
||||||
|
showUnlinkWarning = true;
|
||||||
|
wizardButton.setVisibility(GONE);
|
||||||
}
|
}
|
||||||
imageView.setImageResource(iconRes);
|
imageView.setImageResource(iconRes);
|
||||||
int color = getColor(requireContext(), tintRes);
|
int color = getColor(requireContext(), tintRes);
|
||||||
setImageTintList(imageView, ColorStateList.valueOf(color));
|
setImageTintList(imageView, ColorStateList.valueOf(color));
|
||||||
statusTitleView.setText(title);
|
statusTitleView.setText(title);
|
||||||
|
if (message == null) {
|
||||||
|
statusMessageView.setVisibility(GONE);
|
||||||
|
} else {
|
||||||
|
statusMessageView.setVisibility(VISIBLE);
|
||||||
|
statusMessageView.setText(message);
|
||||||
|
}
|
||||||
|
|
||||||
long lastSuccess = status.getTimeOfLastSuccess();
|
long lastSuccess = status.getTimeOfLastSuccess();
|
||||||
String lastConnectionText;
|
String lastConnectionText;
|
||||||
|
|||||||
@@ -208,16 +208,12 @@ class MailboxViewModel extends DbViewModel
|
|||||||
|
|
||||||
LiveData<Boolean> checkConnection() {
|
LiveData<Boolean> checkConnection() {
|
||||||
MutableLiveData<Boolean> liveData = new MutableLiveData<>();
|
MutableLiveData<Boolean> liveData = new MutableLiveData<>();
|
||||||
checkConnection(success -> {
|
checkConnection(liveData::postValue);
|
||||||
liveData.postValue(success);
|
|
||||||
if (!success) onConnectionCheckFailure();
|
|
||||||
});
|
|
||||||
return liveData;
|
return liveData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkConnectionFromWizard() {
|
void checkConnectionFromWizard() {
|
||||||
checkConnection(success -> {
|
checkConnection(success -> {
|
||||||
if (!success) onConnectionCheckFailure();
|
|
||||||
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 MailboxState.IsPaired(isOnline));
|
||||||
@@ -234,15 +230,6 @@ class MailboxViewModel extends DbViewModel
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onConnectionCheckFailure() {
|
|
||||||
MailboxStatus lastStatus = status.getValue();
|
|
||||||
long lastSuccess = lastStatus == null ?
|
|
||||||
-1 : lastStatus.getTimeOfLastSuccess();
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
// force failure screen
|
|
||||||
status.postValue(new MailboxStatus(now, lastSuccess, 999));
|
|
||||||
}
|
|
||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
void unlink() {
|
void unlink() {
|
||||||
ioExecutor.execute(() -> {
|
ioExecutor.execute(() -> {
|
||||||
|
|||||||
@@ -31,12 +31,29 @@
|
|||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
|
||||||
app:layout_constrainedWidth="true"
|
app:layout_constrainedWidth="true"
|
||||||
app:layout_constraintBottom_toTopOf="@+id/checkButton"
|
app:layout_constraintBottom_toTopOf="@+id/statusMessageView"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/imageView"
|
app:layout_constraintTop_toBottomOf="@+id/imageView"
|
||||||
tools:text="@string/mailbox_status_problem_title" />
|
tools:text="@string/mailbox_status_problem_title" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/statusMessageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="16dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constrainedWidth="true"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/checkButton"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/statusTitleView"
|
||||||
|
tools:text="@string/mailbox_status_mailbox_too_old_message"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<org.briarproject.briar.android.view.BriarButton
|
<org.briarproject.briar.android.view.BriarButton
|
||||||
android:id="@+id/checkButton"
|
android:id="@+id/checkButton"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
@@ -46,7 +63,7 @@
|
|||||||
app:layout_constraintBottom_toTopOf="@+id/statusInfoView"
|
app:layout_constraintBottom_toTopOf="@+id/statusInfoView"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/statusTitleView"
|
app:layout_constraintTop_toBottomOf="@+id/statusMessageView"
|
||||||
app:text="@string/mailbox_status_check_button" />
|
app:text="@string/mailbox_status_check_button" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
|||||||
@@ -640,6 +640,10 @@
|
|||||||
<string name="mailbox_status_connected_title">Mailbox is running</string>
|
<string name="mailbox_status_connected_title">Mailbox is running</string>
|
||||||
<string name="mailbox_status_problem_title">Briar is having trouble connecting to the Mailbox</string>
|
<string name="mailbox_status_problem_title">Briar is having trouble connecting to the Mailbox</string>
|
||||||
<string name="mailbox_status_failure_title">Mailbox is unavailable</string>
|
<string name="mailbox_status_failure_title">Mailbox is unavailable</string>
|
||||||
|
<string name="mailbox_status_app_too_old_title">Briar is too old</string>
|
||||||
|
<string name="mailbox_status_app_too_old_message">Update Briar to the latest version of the app and try again.</string>
|
||||||
|
<string name="mailbox_status_mailbox_too_old_title">Mailbox is too old</string>
|
||||||
|
<string name="mailbox_status_mailbox_too_old_message">Update your Mailbox to the latest version of the app and try again.</string>
|
||||||
<string name="mailbox_status_check_button">Check Connection</string>
|
<string name="mailbox_status_check_button">Check Connection</string>
|
||||||
<!-- Example for string substitution: Last connection: 3min ago-->
|
<!-- Example for string substitution: Last connection: 3min ago-->
|
||||||
<string name="mailbox_status_connected_info">Last connection: %s</string>
|
<string name="mailbox_status_connected_info">Last connection: %s</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user