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 5177b163f9e0379aa04ae7b14a086cee5655f7d1..9c6bbbe2343c673b9f5f1c3ad71d7e6896c0c493 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 160fa76a24ea9590f70e952c3efc9eaaa88f5c64..610625a612bed9bb88ca9c76ac0ef9d94a41b263 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 7b51a6e29815e9f076bace97b8ab360d2bb9931e..b6e65894e55648dc7135ee1fac549a31dd90806b 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<Connection> { 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 5315abb6ab312bfbc4350b9ccc59558ed648c60f..8d0019acc0b17d897188c981cdff1712c2dcfa34 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 8650c8233d711790c6d45f4a8a1883819dbe077d..191f95fc6f2f8002cd4decc411d63eed7fd5d3c2 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 d51f1547bc44de3d30329cf38eb7acf7037864bf..718cdc83da5528f6b6899af004417dc2b35a9650 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,7 +53,10 @@ public class AddContactViewModel extends AndroidViewModel { super(application); this.contactManager = contactManager; this.dbExecutor = dbExecutor; - loadHandshakeLink(); + } + + void onCreate() { + if (handshakeLink.getValue() == null) loadHandshakeLink(); } private void 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 c3decf51d3997e2f21e38061806aa7d9ee348478..dc780d4850e179df6a4116e03fc2234358c1d8dd 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 5c9ea749171d1f4ffeecd7c0f3edad68f463619a..a68c4fe4b4e71efb0d36c04e9cb110db6bd35998 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,7 +61,10 @@ public class PendingContactListViewModel extends AndroidViewModel this.rendezvousPoller = rendezvousPoller; this.eventBus = eventBus; this.eventBus.addListener(this); - loadPendingContacts(); + } + + void onCreate() { + if (pendingContacts.getValue() == null) loadPendingContacts(); } @Override