diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BaseViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BaseViewModel.java index 34a04123b..03c02af29 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BaseViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BaseViewModel.java @@ -142,7 +142,7 @@ abstract class BaseViewModel extends DbViewModel implements EventListener { runOnDbThread(true, txn -> { BlogPostItem item = getItem(txn, header); txn.attach(() -> onBlogPostItemAdded(item, local)); - }, e -> logException(LOG, WARNING, e)); + }, this::handleException); } @UiThread @@ -163,7 +163,7 @@ abstract class BaseViewModel extends DbViewModel implements EventListener { BlogPostHeader h = item.getHeader(); blogManager.addLocalComment(a, b.getId(), comment, h); } catch (DbException e) { - logException(LOG, WARNING, e); + handleException(e); } }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java index 68c38d2d9..0ba0d185a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java @@ -39,10 +39,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; @MethodsNotNullByDefault @@ -132,7 +130,7 @@ class BlogViewModel extends BaseViewModel { blog.postValue(new BlogItem(b, ours, removable)); logDuration(LOG, "Loading blog", start); } catch (DbException e) { - logException(LOG, WARNING, e); + handleException(e); } }); } @@ -155,7 +153,7 @@ class BlogViewModel extends BaseViewModel { Collection contacts = blogSharingManager.getSharedWith(txn, groupId); txn.attach(() -> onSharingContactsLoaded(contacts)); - }, e -> logException(LOG, WARNING, e)); + }, this::handleException); } @UiThread @@ -173,7 +171,7 @@ class BlogViewModel extends BaseViewModel { blogManager.removeBlog(b); logDuration(LOG, "Removing blog", start); } catch (DbException e) { - logException(LOG, WARNING, e); + handleException(e); } }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedViewModel.java index d5374a7bc..e4f6cbee5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedViewModel.java @@ -105,7 +105,7 @@ class FeedViewModel extends BaseViewModel { logDuration(LOG, "Loading personal blog", start); personalBlog.postValue(b); } catch (DbException e) { - logException(LOG, WARNING, e); + handleException(e); } }); } 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 1c74d8f66..c99b1acf4 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 @@ -1,6 +1,7 @@ package org.briarproject.briar.android.viewmodel; import android.app.Application; +import android.widget.Toast; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbCallable; @@ -11,6 +12,7 @@ import org.briarproject.bramble.api.db.TransactionManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.system.AndroidExecutor; +import org.briarproject.bramble.util.StringUtils; import java.util.ArrayList; import java.util.Collection; @@ -21,6 +23,7 @@ import java.util.logging.Logger; import javax.annotation.concurrent.Immutable; +import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; @@ -31,6 +34,7 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.recyclerview.widget.RecyclerView; +import static android.widget.Toast.LENGTH_LONG; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logException; @@ -276,4 +280,25 @@ public abstract class DbViewModel extends AndroidViewModel { return new ArrayList<>(list); } + /** + * Logs the exception and shows a Toast to the user. + *

+ * Errors that are likely or expected to happen should not use this method + * and show proper error states in UI. + */ + @AnyThread + protected void handleException(Exception e) { + logException(LOG, WARNING, e); + androidExecutor.runOnUiThread(() -> { + String msg = "Error: " + e.getClass().getSimpleName(); + if (!StringUtils.isNullOrEmpty(e.getMessage())) { + msg += " " + e.getMessage(); + } + if (e.getCause() != null) { + msg += " caused by " + e.getCause().getClass().getSimpleName(); + } + Toast.makeText(getApplication(), msg, LENGTH_LONG).show(); + }); + } + }