diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/ThrowingRunnable.java b/bramble-api/src/main/java/org/briarproject/bramble/api/ThrowingRunnable.java new file mode 100644 index 000000000..b496b782d --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/ThrowingRunnable.java @@ -0,0 +1,6 @@ +package org.briarproject.bramble.api; + +public interface ThrowingRunnable { + + void run() throws T; +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java index 6eed42511..31e6c81be 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.sync; +import org.briarproject.bramble.api.ThrowingRunnable; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseComponent; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java index 1d32ca4ee..e89f24172 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SimplexOutgoingSession.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.sync; +import org.briarproject.bramble.api.ThrowingRunnable; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.event.ContactRemovedEvent; import org.briarproject.bramble.api.db.DatabaseComponent; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ThrowingRunnable.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ThrowingRunnable.java deleted file mode 100644 index 55d966d31..000000000 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ThrowingRunnable.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.briarproject.bramble.sync; - -interface ThrowingRunnable { - - void run() throws T; -} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java index 71a1c5740..570d085b0 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java @@ -45,10 +45,8 @@ import androidx.arch.core.util.Function; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logDuration; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; @NotNullByDefault @@ -173,14 +171,9 @@ class ContactListViewModel extends DbViewModel implements EventListener { } void checkForPendingContacts() { - runOnDbThread(() -> { - try { - boolean hasPending = - !contactManager.getPendingContacts().isEmpty(); - hasPendingContacts.postValue(hasPending); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + boolean hasPending = !contactManager.getPendingContacts().isEmpty(); + hasPendingContacts.postValue(hasPending); }); } 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 b3a7cb122..c79f7c0da 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 @@ -66,15 +66,10 @@ public class AddContactViewModel extends DbViewModel { } private void loadHandshakeLink() { - runOnDbThread(() -> { - try { - handshakeLink.postValue(contactManager.getHandshakeLink()); - } catch (DbException e) { - logException(LOG, WARNING, e); - // the UI should stay disabled in this case, - // leaving the user unable to proceed - } - }); + // If an exception is thrown the UI should stay disabled, + // leaving the user unable to proceed + runOnDbThreadOrLogException(() -> + handshakeLink.postValue(contactManager.getHandshakeLink())); } LiveData getHandshakeLink() { 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 8317214c1..1160c94b0 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 @@ -10,7 +10,6 @@ import org.briarproject.bramble.api.contact.PendingContactState; import org.briarproject.bramble.api.contact.event.PendingContactRemovedEvent; import org.briarproject.bramble.api.contact.event.PendingContactStateChangedEvent; import org.briarproject.bramble.api.db.DatabaseExecutor; -import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; @@ -33,10 +32,8 @@ import javax.inject.Inject; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.contact.PendingContactState.OFFLINE; -import static org.briarproject.bramble.util.LogUtils.logException; @NotNullByDefault public class PendingContactListViewModel extends DbViewModel @@ -90,24 +87,20 @@ public class PendingContactListViewModel extends DbViewModel } private void loadPendingContacts() { - runOnDbThread(() -> { - try { - Collection> pairs = - contactManager.getPendingContacts(); - List items = new ArrayList<>(pairs.size()); - boolean online = pairs.isEmpty(); - for (Pair pair : pairs) { - PendingContact p = pair.getFirst(); - PendingContactState state = pair.getSecond(); - long lastPoll = rendezvousPoller.getLastPollTime(p.getId()); - items.add(new PendingContactItem(p, state, lastPoll)); - online = online || state != OFFLINE; - } - pendingContacts.postValue(items); - hasInternetConnection.postValue(online); - } catch (DbException e) { - logException(LOG, WARNING, e); + runOnDbThreadOrLogException(() -> { + Collection> pairs = + contactManager.getPendingContacts(); + List items = new ArrayList<>(pairs.size()); + boolean online = pairs.isEmpty(); + for (Pair pair : pairs) { + PendingContact p = pair.getFirst(); + PendingContactState state = pair.getSecond(); + long lastPoll = rendezvousPoller.getLastPollTime(p.getId()); + items.add(new PendingContactItem(p, state, lastPoll)); + online = online || state != OFFLINE; } + pendingContacts.postValue(items); + hasInternetConnection.postValue(online); }); } @@ -116,13 +109,8 @@ public class PendingContactListViewModel extends DbViewModel } void removePendingContact(PendingContactId id) { - runOnDbThread(() -> { - try { - contactManager.removePendingContact(id); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + runOnDbThreadOrLogException(() -> + contactManager.removePendingContact(id)); } LiveData getHasInternetConnection() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java index 2a7e23dc7..de17c5a82 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java @@ -212,26 +212,18 @@ public class ConversationViewModel extends DbViewModel } void markMessageRead(GroupId g, MessageId m) { - runOnDbThread(() -> { - try { - long start = now(); - messagingManager.setReadFlag(g, m, true); - logDuration(LOG, "Marking read", start); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + long start = now(); + messagingManager.setReadFlag(g, m, true); + logDuration(LOG, "Marking read", start); }); } void setContactAlias(String alias) { - runOnDbThread(() -> { - try { - contactManager.setContactAlias(requireNonNull(contactId), - alias.isEmpty() ? null : alias); - loadContact(contactId); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + contactManager.setContactAlias(requireNonNull(contactId), + alias.isEmpty() ? null : alias); + loadContact(contactId); }); } @@ -327,21 +319,17 @@ public class ConversationViewModel extends DbViewModel @UiThread private void storeMessage(PrivateMessage m) { attachmentCreator.onAttachmentsSent(m.getMessage().getId()); - runOnDbThread(() -> { - try { - long start = now(); - messagingManager.addLocalMessage(m); - logDuration(LOG, "Storing message", start); - Message message = m.getMessage(); - PrivateMessageHeader h = new PrivateMessageHeader( - message.getId(), message.getGroupId(), - message.getTimestamp(), true, true, false, false, - m.hasText(), m.getAttachmentHeaders()); - // TODO add text to cache when available here - addedHeader.postEvent(h); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + long start = now(); + messagingManager.addLocalMessage(m); + logDuration(LOG, "Storing message", start); + Message message = m.getMessage(); + PrivateMessageHeader h = new PrivateMessageHeader( + message.getId(), message.getGroupId(), + message.getTimestamp(), true, true, false, false, + m.hasText(), m.getAttachmentHeaders()); + // TODO add text to cache when available here + addedHeader.postEvent(h); }); } @@ -383,12 +371,7 @@ public class ConversationViewModel extends DbViewModel @UiThread void recheckFeaturesAndOnboarding(ContactId contactId) { - runOnDbThread(() -> { - try { - checkFeaturesAndOnboarding(contactId); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + runOnDbThreadOrLogException(() -> + checkFeaturesAndOnboarding(contactId)); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java index af86a9d95..012d6e16d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java @@ -40,10 +40,8 @@ import androidx.annotation.UiThread; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logDuration; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID; @@ -164,15 +162,11 @@ class ForumListViewModel extends DbViewModel implements EventListener { } void loadForumInvitations() { - runOnDbThread(() -> { - try { - long start = now(); - int available = forumSharingManager.getInvitations().size(); - logDuration(LOG, "Loading available", start); - numInvitations.postValue(available); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + long start = now(); + int available = forumSharingManager.getInvitations().size(); + logDuration(LOG, "Loading available", start); + numInvitations.postValue(available); }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java index 48dfb7640..b30c2db03 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java @@ -51,10 +51,8 @@ import androidx.lifecycle.MutableLiveData; import static android.widget.Toast.LENGTH_SHORT; import static java.lang.Math.max; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logDuration; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; @MethodsNotNullByDefault @@ -122,14 +120,8 @@ class ForumViewModel extends ThreadListViewModel { LiveData loadForum() { MutableLiveData forum = new MutableLiveData<>(); - runOnDbThread(() -> { - try { - Forum f = forumManager.getForum(groupId); - forum.postValue(f); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + runOnDbThreadOrLogException(() -> + forum.postValue(forumManager.getForum(groupId))); return forum; } @@ -147,16 +139,12 @@ class ForumViewModel extends ThreadListViewModel { @Override public void createAndStoreMessage(String text, @Nullable MessageId parentId) { - runOnDbThread(() -> { - try { - LocalAuthor author = identityManager.getLocalAuthor(); - GroupCount count = forumManager.getGroupCount(groupId); - long timestamp = max(count.getLatestMsgTime() + 1, - clock.currentTimeMillis()); - createMessage(text, timestamp, parentId, author); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + LocalAuthor author = identityManager.getLocalAuthor(); + GroupCount count = forumManager.getGroupCount(groupId); + long timestamp = max(count.getLatestMsgTime() + 1, + clock.currentTimeMillis()); + createMessage(text, timestamp, parentId, author); }); } @@ -171,15 +159,11 @@ class ForumViewModel extends ThreadListViewModel { } private void storePost(ForumPost msg, String text) { - runOnDbThread(() -> { - try { - long start = now(); - ForumPostHeader header = forumManager.addLocalPost(msg); - addItemAsync(buildItem(header, text)); - logDuration(LOG, "Storing forum post", start); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + long start = now(); + ForumPostHeader header = forumManager.addLocalPost(msg); + addItemAsync(buildItem(header, text)); + logDuration(LOG, "Storing forum post", start); }); } @@ -195,39 +179,23 @@ class ForumViewModel extends ThreadListViewModel { @Override protected void markItemRead(ForumPostItem item) { - runOnDbThread(() -> { - try { - forumManager.setReadFlag(groupId, item.getId(), true); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + runOnDbThreadOrLogException(() -> + forumManager.setReadFlag(groupId, item.getId(), true)); } public void loadSharingContacts() { - runOnDbThread(() -> { - try { - Collection contacts = - forumSharingManager.getSharedWith(groupId); - Collection contactIds = - new ArrayList<>(contacts.size()); - for (Contact c : contacts) contactIds.add(c.getId()); - sharingController.addAll(contactIds); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + Collection contacts = + forumSharingManager.getSharedWith(groupId); + Collection contactIds = new ArrayList<>(contacts.size()); + for (Contact c : contacts) contactIds.add(c.getId()); + sharingController.addAll(contactIds); }); } void deleteForum() { - runOnDbThread(() -> { - try { - Forum f = forumManager.getForum(groupId); - forumManager.removeForum(f); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + runOnDbThreadOrLogException(() -> + forumManager.removeForum(forumManager.getForum(groupId))); Toast.makeText(getApplication(), R.string.forum_left_toast, LENGTH_SHORT).show(); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java index 132cc0b9f..fdc2bf45b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java @@ -66,34 +66,27 @@ public class NavDrawerViewModel extends DbViewModel { @UiThread void checkExpiryWarning() { - runOnDbThread(() -> { - try { - Settings settings = - settingsManager.getSettings(SETTINGS_NAMESPACE); - int warningInt = settings.getInt(EXPIRY_DATE_WARNING, 0); + runOnDbThreadOrLogException(() -> { + Settings settings = settingsManager.getSettings(SETTINGS_NAMESPACE); + int warningInt = settings.getInt(EXPIRY_DATE_WARNING, 0); - if (warningInt == 0) { - // we have not warned before + if (warningInt == 0) { + // we have not warned before + showExpiryWarning.postValue(true); + } else { + long warningLong = warningInt * 1000L; + long now = System.currentTimeMillis(); + long daysSinceLastWarning = + (now - warningLong) / DAYS.toMillis(1); + long daysBeforeExpiry = (EXPIRY_DATE - now) / DAYS.toMillis(1); + + if (daysSinceLastWarning >= 30) { + showExpiryWarning.postValue(true); + } else if (daysBeforeExpiry <= 3 && daysSinceLastWarning > 0) { showExpiryWarning.postValue(true); } else { - long warningLong = warningInt * 1000L; - long now = System.currentTimeMillis(); - long daysSinceLastWarning = - (now - warningLong) / DAYS.toMillis(1); - long daysBeforeExpiry = - (EXPIRY_DATE - now) / DAYS.toMillis(1); - - if (daysSinceLastWarning >= 30) { - showExpiryWarning.postValue(true); - } else if (daysBeforeExpiry <= 3 && - daysSinceLastWarning > 0) { - showExpiryWarning.postValue(true); - } else { - showExpiryWarning.postValue(false); - } + showExpiryWarning.postValue(false); } - } catch (DbException e) { - logException(LOG, WARNING, e); } }); } @@ -101,15 +94,11 @@ public class NavDrawerViewModel extends DbViewModel { @UiThread void expiryWarningDismissed() { showExpiryWarning.setValue(false); - runOnDbThread(() -> { - try { - Settings settings = new Settings(); - int date = (int) (System.currentTimeMillis() / 1000L); - settings.putInt(EXPIRY_DATE_WARNING, date); - settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + Settings settings = new Settings(); + int date = (int) (System.currentTimeMillis() / 1000L); + settings.putInt(EXPIRY_DATE_WARNING, date); + settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); }); } @@ -145,30 +134,21 @@ public class NavDrawerViewModel extends DbViewModel { @UiThread void checkTransportsOnboarding() { if (showTransportsOnboarding.getValue() != null) return; - runOnDbThread(() -> { - try { - Settings settings = - settingsManager.getSettings(SETTINGS_NAMESPACE); - boolean show = - settings.getBoolean(SHOW_TRANSPORTS_ONBOARDING, true); - showTransportsOnboarding.postValue(show); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + Settings settings = settingsManager.getSettings(SETTINGS_NAMESPACE); + boolean show = + settings.getBoolean(SHOW_TRANSPORTS_ONBOARDING, true); + showTransportsOnboarding.postValue(show); }); } @UiThread void transportsOnboardingShown() { showTransportsOnboarding.setValue(false); - runOnDbThread(() -> { - try { - Settings settings = new Settings(); - settings.putBoolean(SHOW_TRANSPORTS_ONBOARDING, false); - settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + Settings settings = new Settings(); + settings.putBoolean(SHOW_TRANSPORTS_ONBOARDING, false); + settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE); }); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java index 1de04c570..10aa192c8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java @@ -45,12 +45,10 @@ import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED; import static android.bluetooth.BluetoothAdapter.EXTRA_STATE; import static android.bluetooth.BluetoothAdapter.STATE_ON; import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE; import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING; import static org.briarproject.bramble.util.LogUtils.logDuration; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; @NotNullByDefault @@ -185,20 +183,16 @@ public class PluginViewModel extends DbViewModel implements EventListener { } private void loadSettings() { - runOnDbThread(() -> { - try { - boolean tor = isPluginEnabled(TorConstants.ID, - TorConstants.DEFAULT_PREF_PLUGIN_ENABLE); - torEnabledSetting.postValue(tor); - boolean wifi = isPluginEnabled(LanTcpConstants.ID, - LanTcpConstants.DEFAULT_PREF_PLUGIN_ENABLE); - wifiEnabledSetting.postValue(wifi); - boolean bt = isPluginEnabled(BluetoothConstants.ID, - BluetoothConstants.DEFAULT_PREF_PLUGIN_ENABLE); - btEnabledSetting.postValue(bt); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + boolean tor = isPluginEnabled(TorConstants.ID, + TorConstants.DEFAULT_PREF_PLUGIN_ENABLE); + torEnabledSetting.postValue(tor); + boolean wifi = isPluginEnabled(LanTcpConstants.ID, + LanTcpConstants.DEFAULT_PREF_PLUGIN_ENABLE); + wifiEnabledSetting.postValue(wifi); + boolean bt = isPluginEnabled(BluetoothConstants.ID, + BluetoothConstants.DEFAULT_PREF_PLUGIN_ENABLE); + btEnabledSetting.postValue(bt); }); } @@ -222,14 +216,10 @@ public class PluginViewModel extends DbViewModel implements EventListener { } private void mergeSettings(Settings s, String namespace) { - runOnDbThread(() -> { - try { - long start = now(); - settingsManager.mergeSettings(s, namespace); - logDuration(LOG, "Merging settings", start); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + long start = now(); + settingsManager.mergeSettings(s, namespace); + logDuration(LOG, "Merging settings", start); }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java index bf7b574b6..039e59346 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java @@ -52,10 +52,8 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import static java.lang.Math.max; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logDuration; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; @MethodsNotNullByDefault @@ -143,15 +141,11 @@ class GroupViewModel extends ThreadListViewModel { } private void loadPrivateGroup(GroupId groupId) { - runOnDbThread(() -> { - try { - PrivateGroup g = privateGroupManager.getPrivateGroup(groupId); - privateGroup.postValue(g); - Author author = identityManager.getLocalAuthor(); - isCreator.postValue(g.getCreator().equals(author)); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + PrivateGroup g = privateGroupManager.getPrivateGroup(groupId); + privateGroup.postValue(g); + Author author = identityManager.getLocalAuthor(); + isCreator.postValue(g.getCreator().equals(author)); }); } @@ -190,18 +184,14 @@ class GroupViewModel extends ThreadListViewModel { @Override public void createAndStoreMessage(String text, @Nullable MessageId parentId) { - runOnDbThread(() -> { - try { - LocalAuthor author = identityManager.getLocalAuthor(); - MessageId previousMsgId = - privateGroupManager.getPreviousMsgId(groupId); - GroupCount count = privateGroupManager.getGroupCount(groupId); - long timestamp = count.getLatestMsgTime(); - timestamp = max(clock.currentTimeMillis(), timestamp + 1); - createMessage(text, timestamp, parentId, author, previousMsgId); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + LocalAuthor author = identityManager.getLocalAuthor(); + MessageId previousMsgId = + privateGroupManager.getPreviousMsgId(groupId); + GroupCount count = privateGroupManager.getGroupCount(groupId); + long timestamp = count.getLatestMsgTime(); + timestamp = max(clock.currentTimeMillis(), timestamp + 1); + createMessage(text, timestamp, parentId, author, previousMsgId); }); } @@ -217,55 +207,36 @@ class GroupViewModel extends ThreadListViewModel { } private void storePost(GroupMessage msg, String text) { - runOnDbThread(() -> { - try { - long start = now(); - GroupMessageHeader header = - privateGroupManager.addLocalMessage(msg); - addItemAsync(buildItem(header, text)); - logDuration(LOG, "Storing group message", start); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + long start = now(); + GroupMessageHeader header = + privateGroupManager.addLocalMessage(msg); + addItemAsync(buildItem(header, text)); + logDuration(LOG, "Storing group message", start); }); } @Override protected void markItemRead(GroupMessageItem item) { - runOnDbThread(() -> { - try { - privateGroupManager.setReadFlag(groupId, item.getId(), true); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + runOnDbThreadOrLogException(() -> + privateGroupManager.setReadFlag(groupId, item.getId(), true)); } public void loadSharingContacts() { - runOnDbThread(() -> { - try { - Collection members = - privateGroupManager.getMembers(groupId); - Collection contactIds = new ArrayList<>(); - for (GroupMember m : members) { - if (m.getContactId() != null) - contactIds.add(m.getContactId()); - } - sharingController.addAll(contactIds); - } catch (DbException e) { - logException(LOG, WARNING, e); + runOnDbThreadOrLogException(() -> { + Collection members = + privateGroupManager.getMembers(groupId); + Collection contactIds = new ArrayList<>(); + for (GroupMember m : members) { + if (m.getContactId() != null) contactIds.add(m.getContactId()); } + sharingController.addAll(contactIds); }); } void deletePrivateGroup() { - runOnDbThread(() -> { - try { - privateGroupManager.removePrivateGroup(groupId); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + runOnDbThreadOrLogException(() -> + privateGroupManager.removePrivateGroup(groupId)); } LiveData getPrivateGroup() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java index 041305a37..f7a5715e2 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java @@ -2,7 +2,6 @@ package org.briarproject.briar.android.privategroup.list; import android.app.Application; -import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; @@ -49,10 +48,8 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import static java.util.Objects.requireNonNull; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logDuration; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; @@ -200,25 +197,17 @@ class GroupListViewModel extends DbViewModel implements EventListener { } void removeGroup(GroupId g) { - runOnDbThread(() -> { - try { - long start = now(); - groupManager.removePrivateGroup(g); - logDuration(LOG, "Removing group", start); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + long start = now(); + groupManager.removePrivateGroup(g); + logDuration(LOG, "Removing group", start); }); } void loadNumInvitations() { - runOnDbThread(() -> { - try { - int i = groupInvitationManager.getInvitations().size(); - numInvitations.postValue(i); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + runOnDbThreadOrLogException(() -> { + int i = groupInvitationManager.getInvitations().size(); + numInvitations.postValue(i); }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java index 422f0a564..790ca6bc4 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java @@ -44,10 +44,8 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logDuration; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; @MethodsNotNullByDefault @@ -145,16 +143,11 @@ public abstract class ThreadListViewModel } private void loadStoredMessageId() { - runOnDbThread(() -> { - try { - storedMessageId - .set(messageTracker.loadStoredMessageId(groupId)); - if (LOG.isLoggable(INFO)) { - LOG.info("Loaded last top visible message id " + - storedMessageId); - } - } catch (DbException e) { - logException(LOG, WARNING, e); + runOnDbThreadOrLogException(() -> { + storedMessageId.set(messageTracker.loadStoredMessageId(groupId)); + if (LOG.isLoggable(INFO)) { + LOG.info("Loaded last top visible message id " + + storedMessageId); } }); } @@ -229,13 +222,10 @@ public abstract class ThreadListViewModel } void storeMessageId(@Nullable MessageId messageId) { - if (messageId != null) runOnDbThread(() -> { - try { - messageTracker.storeMessageId(groupId, messageId); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); + if (messageId != null) { + runOnDbThreadOrLogException(() -> + messageTracker.storeMessageId(groupId, messageId)); + } } protected abstract void markItemRead(I item); 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..3507b1a9b 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 @@ -2,6 +2,7 @@ package org.briarproject.briar.android.viewmodel; import android.app.Application; +import org.briarproject.bramble.api.ThrowingRunnable; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbCallable; import org.briarproject.bramble.api.db.DbException; @@ -76,6 +77,30 @@ public abstract class DbViewModel extends AndroidViewModel { }); } + /** + * Runs the given task on the {@link DatabaseExecutor} + * and waits for the DB to open. If the task throws a {@link DbException} + * it's caught and logged. + *

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