From e810785fe2d40cda281ce570c4a4e333589143d1 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Sat, 8 Jun 2019 10:03:45 +0100 Subject: [PATCH 1/2] Retry database tasks after signing in. --- .../org/briarproject/bramble/db/H2Database.java | 5 +++-- .../briarproject/bramble/db/HyperSqlDatabase.java | 5 +++-- .../org/briarproject/bramble/db/JdbcDatabase.java | 3 ++- .../briar/android/activity/BriarActivity.java | 13 ++++++++++--- .../contact/add/remote/AddContactActivity.java | 11 +++++------ .../contact/add/remote/AddContactViewModel.java | 3 +++ .../add/remote/PendingContactListActivity.java | 1 + .../add/remote/PendingContactListViewModel.java | 3 +++ 8 files changed, 30 insertions(+), 14 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java index 5177b163f..9c6bbbe23 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/H2Database.java @@ -2,6 +2,7 @@ package org.briarproject.bramble.db; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseConfig; +import org.briarproject.bramble.api.db.DbClosedException; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.MigrationListener; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -89,9 +90,9 @@ class H2Database extends JdbcDatabase { } @Override - protected Connection createConnection() throws SQLException { + protected Connection createConnection() throws DbException, SQLException { SecretKey key = this.key; - if (key == null) throw new IllegalStateException(); + if (key == null) throw new DbClosedException(); Properties props = new Properties(); props.setProperty("user", "user"); // Separate the file password from the user password with a space diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java index 160fa76a2..610625a61 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/HyperSqlDatabase.java @@ -2,6 +2,7 @@ package org.briarproject.bramble.db; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseConfig; +import org.briarproject.bramble.api.db.DbClosedException; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.MigrationListener; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -87,9 +88,9 @@ class HyperSqlDatabase extends JdbcDatabase { } @Override - protected Connection createConnection() throws SQLException { + protected Connection createConnection() throws DbException, SQLException { SecretKey key = this.key; - if (key == null) throw new IllegalStateException(); + if (key == null) throw new DbClosedException(); String hex = StringUtils.toHexString(key.getBytes()); return DriverManager.getConnection(url + ";crypt_key=" + hex); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index 7b51a6e29..b6e65894e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -347,7 +347,8 @@ abstract class JdbcDatabase implements Database { private int openConnections = 0; // Locking: connectionsLock private boolean closed = false; // Locking: connectionsLock - protected abstract Connection createConnection() throws SQLException; + protected abstract Connection createConnection() + throws DbException, SQLException; protected abstract void compactAndClose() throws DbException; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java index 5315abb6a..8d0019acc 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BriarActivity.java @@ -30,6 +30,7 @@ import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION; import static android.os.Build.VERSION.SDK_INT; +import static java.util.logging.Level.INFO; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_DOZE_WHITELISTING; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_UNLOCK; @@ -66,9 +67,15 @@ public abstract class BriarActivity extends BaseActivity { @Nullable Intent data) { super.onActivityResult(request, result, data); if (request == REQUEST_PASSWORD) { - // We get RESULT_CANCELED when the account gets deleted or - // StartupActivity finishes before entering the password. - if (result == RESULT_OK) briarController.startAndBindService(); + // Recreate the activity so any DB tasks that failed before + // signing in can be retried + if (result == RESULT_OK) { + if (LOG.isLoggable(INFO)) { + LOG.info("Recreating " + getClass().getSimpleName() + + " after signing in"); + } + recreate(); + } } else if (request == REQUEST_UNLOCK && result != RESULT_OK) { // We arrive here, if the user presses 'back' // in the Keyguard unlock screen, because UnlockActivity finishes. diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java index 8650c8233..191f95fc6 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactActivity.java @@ -49,6 +49,7 @@ public class AddContactActivity extends BriarActivity implements viewModel = ViewModelProviders.of(this, viewModelFactory) .get(AddContactViewModel.class); + viewModel.onCreate(); viewModel.getRemoteLinkEntered().observeEvent(this, entered -> { if (entered) { NicknameFragment f = new NicknameFragment(); @@ -93,13 +94,11 @@ public class AddContactActivity extends BriarActivity implements @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - default: - return super.onOptionsItemSelected(item); + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; } + return super.onOptionsItemSelected(item); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java index d51f1547b..cb5b76ba3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java @@ -53,6 +53,9 @@ public class AddContactViewModel extends AndroidViewModel { super(application); this.contactManager = contactManager; this.dbExecutor = dbExecutor; + } + + void onCreate() { loadHandshakeLink(); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java index c3decf51d..dc780d485 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListActivity.java @@ -55,6 +55,7 @@ public class PendingContactListActivity extends BriarActivity viewModel = ViewModelProviders.of(this, viewModelFactory) .get(PendingContactListViewModel.class); + viewModel.onCreate(); viewModel.getPendingContacts() .observe(this, this::onPendingContactsChanged); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java index 5c9ea7491..c4cb7d9e4 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java @@ -61,6 +61,9 @@ public class PendingContactListViewModel extends AndroidViewModel this.rendezvousPoller = rendezvousPoller; this.eventBus = eventBus; this.eventBus.addListener(this); + } + + void onCreate() { loadPendingContacts(); } From 1cf993484de3097a659421e3fb53871c813a8194 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 10 Jun 2019 17:24:58 +0100 Subject: [PATCH 2/2] Avoid unnecessary reloads. --- .../briar/android/contact/add/remote/AddContactViewModel.java | 2 +- .../android/contact/add/remote/PendingContactListViewModel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java index cb5b76ba3..718cdc83d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java @@ -56,7 +56,7 @@ public class AddContactViewModel extends AndroidViewModel { } void onCreate() { - loadHandshakeLink(); + if (handshakeLink.getValue() == null) loadHandshakeLink(); } private void loadHandshakeLink() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java index c4cb7d9e4..a68c4fe4b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java @@ -64,7 +64,7 @@ public class PendingContactListViewModel extends AndroidViewModel } void onCreate() { - loadPendingContacts(); + if (pendingContacts.getValue() == null) loadPendingContacts(); } @Override