diff --git a/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/DbViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/DbViewModel.java index b6966c95a..e237b3962 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/DbViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/viewmodel/DbViewModel.java @@ -5,6 +5,7 @@ import android.app.Application; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbCallable; import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.DbRunnable; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; @@ -23,6 +24,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; import androidx.arch.core.util.Function; +import androidx.core.util.Consumer; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.recyclerview.widget.RecyclerView; @@ -57,8 +59,8 @@ public abstract class DbViewModel extends AndroidViewModel { } /** - * Runs the given task on the {@link DatabaseExecutor} - * and waits for the DB to open. + * Waits for the DB to open and runs the given task on the + * {@link DatabaseExecutor}. *

* If you need a list of items to be displayed in a * {@link RecyclerView.Adapter}, @@ -76,6 +78,29 @@ public abstract class DbViewModel extends AndroidViewModel { }); } + /** + * Waits for the DB to open and runs the given task on the + * {@link DatabaseExecutor}. + *

+ * If you need a list of items to be displayed in a + * {@link RecyclerView.Adapter}, + * use {@link #loadList(DbCallable, UiConsumer)} instead. + */ + protected void runOnDbThread(boolean readOnly, + DbRunnable task, Consumer err) { + dbExecutor.execute(() -> { + try { + lifecycleManager.waitForDatabase(); + db.transaction(readOnly, task); + } catch (InterruptedException e) { + LOG.warning("Interrupted while waiting for database"); + Thread.currentThread().interrupt(); + } catch (Exception e) { + err.accept(e); + } + }); + } + /** * Loads a list of items on the {@link DatabaseExecutor} within a single * {@link Transaction} and publishes it as a {@link LiveResult}