From c36bb3e60ef2d98cbaaf5d55002084299c6f64ff Mon Sep 17 00:00:00 2001 From: Ernir Erlingsson <ernir@ymirmobile.com> Date: Mon, 7 Nov 2016 11:00:09 +0100 Subject: [PATCH] created runOnUiThreadUnlessDestroyed fragment wrapper --- .../android/blogs/BlogFragment.java | 12 ++++----- .../android/blogs/BlogPostFragment.java | 2 +- .../android/blogs/BlogPostPagerFragment.java | 4 +-- .../android/blogs/FeedFragment.java | 6 ++--- .../android/blogs/FeedPostFragment.java | 2 +- .../android/blogs/FeedPostPagerFragment.java | 4 +-- .../android/blogs/ReblogFragment.java | 4 +-- .../android/contact/ContactListFragment.java | 8 +++--- .../android/forum/ForumListFragment.java | 8 +++--- .../android/fragment/BaseFragment.java | 25 +++++++++++++++---- .../keyagreement/ShowQrCodeFragment.java | 14 +++++------ .../privategroup/list/GroupListFragment.java | 4 +-- 12 files changed, 54 insertions(+), 39 deletions(-) diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java index d93aa05635..35b57773e6 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java @@ -47,7 +47,7 @@ import static org.briarproject.android.blogs.BlogActivity.REQUEST_WRITE_POST; public class BlogFragment extends BaseFragment implements OnBlogPostAddedListener { - public final static String TAG = BlogFragment.class.getName(); + private final static String TAG = BlogFragment.class.getName(); @Inject BlogController blogController; @@ -178,7 +178,7 @@ public class BlogFragment extends BaseFragment implements public void onBlogPostAdded(BlogPostHeader header, final boolean local) { blogController.loadBlogPost(header, new UiResultExceptionHandler<BlogPostItem, DbException>( - listener) { + this) { @Override public void onResultUi(BlogPostItem post) { adapter.add(post); @@ -201,10 +201,10 @@ public class BlogFragment extends BaseFragment implements ); } - void loadBlogPosts(final boolean reload) { + private void loadBlogPosts(final boolean reload) { blogController.loadBlogPosts( new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>( - listener) { + this) { @Override public void onResultUi(Collection<BlogPostItem> posts) { if (posts.isEmpty()) { @@ -225,7 +225,7 @@ public class BlogFragment extends BaseFragment implements private void loadBlog() { blogController.loadBlog( - new UiResultExceptionHandler<BlogItem, DbException>(listener) { + new UiResultExceptionHandler<BlogItem, DbException>(this) { @Override public void onResultUi(BlogItem blog) { setToolbarTitle(blog.getBlog().getAuthor()); @@ -299,7 +299,7 @@ public class BlogFragment extends BaseFragment implements private void deleteBlog() { blogController.deleteBlog( - new UiResultExceptionHandler<Void, DbException>(listener) { + new UiResultExceptionHandler<Void, DbException>(this) { @Override public void onResultUi(Void result) { Toast.makeText(getActivity(), diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java index ac7b4d504e..78b82874fc 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java @@ -62,7 +62,7 @@ public class BlogPostFragment extends BasePostFragment { super.onStart(); blogController.loadBlogPost(postId, new UiResultExceptionHandler<BlogPostItem, DbException>( - listener) { + this) { @Override public void onResultUi(BlogPostItem post) { onBlogPostLoaded(post); diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java index 3db8c4d084..7c63d5c7d8 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java @@ -45,7 +45,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment { void loadBlogPosts(final MessageId select) { blogController.loadBlogPosts( new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>( - listener) { + this) { @Override public void onResultUi(Collection<BlogPostItem> posts) { onBlogPostsLoaded(select, posts); @@ -62,7 +62,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment { void loadBlogPost(BlogPostHeader header) { blogController.loadBlogPost(header, new UiResultExceptionHandler<BlogPostItem, DbException>( - listener) { + this) { @Override public void onResultUi(BlogPostItem post) { addPost(post); diff --git a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java index 5c7bd39494..60d8ed7c3e 100644 --- a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java @@ -114,7 +114,7 @@ public class FeedFragment extends BaseFragment implements private void loadPersonalBlog() { feedController.loadPersonalBlog( - new UiResultExceptionHandler<Blog, DbException>(listener) { + new UiResultExceptionHandler<Blog, DbException>(this) { @Override public void onResultUi(Blog b) { personalBlog = b; @@ -131,7 +131,7 @@ public class FeedFragment extends BaseFragment implements final int revision = adapter.getRevision(); feedController.loadBlogPosts( new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>( - listener) { + this) { @Override public void onResultUi(Collection<BlogPostItem> posts) { if (revision == adapter.getRevision()) { @@ -194,7 +194,7 @@ public class FeedFragment extends BaseFragment implements public void onBlogPostAdded(BlogPostHeader header, final boolean local) { feedController.loadBlogPost(header, new UiResultExceptionHandler<BlogPostItem, DbException>( - listener) { + this) { @Override public void onResultUi(BlogPostItem post) { adapter.incrementRevision(); diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java index 442a85ef98..002f69586d 100644 --- a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java @@ -65,7 +65,7 @@ public class FeedPostFragment extends BasePostFragment { super.onStart(); feedController.loadBlogPost(blogId, postId, new UiResultExceptionHandler<BlogPostItem, DbException>( - listener) { + this) { @Override public void onResultUi(BlogPostItem post) { onBlogPostLoaded(post); diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java index b37d99eefe..381bb5e9b0 100644 --- a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java @@ -44,7 +44,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment { void loadBlogPosts(final MessageId select) { feedController.loadBlogPosts( new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>( - listener) { + this) { @Override public void onResultUi(Collection<BlogPostItem> posts) { onBlogPostsLoaded(select, posts); @@ -61,7 +61,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment { void loadBlogPost(BlogPostHeader header) { feedController.loadBlogPost(header, new UiResultExceptionHandler<BlogPostItem, DbException>( - listener) { + this) { @Override public void onResultUi(BlogPostItem post) { addPost(post); diff --git a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java index 479fecaada..a69e9ce96b 100644 --- a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java @@ -93,7 +93,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener { // TODO: Load blog post when fragment is created. #631 feedController.loadBlogPost(blogId, postId, new UiResultExceptionHandler<BlogPostItem, DbException>( - listener) { + this) { @Override public void onResultUi(BlogPostItem result) { item = result; @@ -130,7 +130,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener { public void onSendClick(String text) { String comment = getComment(); feedController.repeatPost(item, comment, - new UiResultExceptionHandler<Void, DbException>(listener) { + new UiResultExceptionHandler<Void, DbException>(this) { @Override public void onResultUi(Void result) { // do nothing, this fragment is gone already diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java index 2d2a098b37..9582150a0e 100644 --- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java +++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java @@ -226,7 +226,7 @@ public class ContactListFragment extends BaseFragment implements EventListener { private void displayContacts(final int revision, final List<ContactListItem> contacts) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { if (revision == adapter.getRevision()) { @@ -292,7 +292,7 @@ public class ContactListFragment extends BaseFragment implements EventListener { } private void updateItem(final ContactId c, final BaseMessageHeader h) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { adapter.incrementRevision(); @@ -308,7 +308,7 @@ public class ContactListFragment extends BaseFragment implements EventListener { } private void removeItem(final ContactId c) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { adapter.incrementRevision(); @@ -320,7 +320,7 @@ public class ContactListFragment extends BaseFragment implements EventListener { } private void setConnected(final ContactId c, final boolean connected) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { adapter.incrementRevision(); diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java index bb5d1eee0a..2afce83162 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java @@ -178,7 +178,7 @@ public class ForumListFragment extends BaseEventFragment implements private void displayForums(final int revision, final Collection<ForumListItem> forums) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { if (revision == adapter.getRevision()) { @@ -214,7 +214,7 @@ public class ForumListFragment extends BaseEventFragment implements } private void displayAvailableForums(final int availableCount) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { if (availableCount == 0) { @@ -257,7 +257,7 @@ public class ForumListFragment extends BaseEventFragment implements } private void updateItem(final GroupId g, final ForumPostHeader m) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { adapter.incrementRevision(); @@ -272,7 +272,7 @@ public class ForumListFragment extends BaseEventFragment implements } private void removeForum(final GroupId g) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { adapter.incrementRevision(); diff --git a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java index 223c01367e..594cd841fc 100644 --- a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java +++ b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java @@ -1,7 +1,9 @@ package org.briarproject.android.fragment; +import android.app.Activity; import android.content.Context; import android.os.Bundle; +import android.support.annotation.CallSuper; import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.support.v4.app.Fragment; @@ -33,7 +35,6 @@ public abstract class BaseFragment extends Fragment setHasOptionsMenu(true); } - @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -54,10 +55,11 @@ public abstract class BaseFragment extends Fragment @UiThread protected void finish() { - getActivity().supportFinishAfterTransition(); + if (!isDetached()) + getActivity().supportFinishAfterTransition(); } - public interface BaseFragmentListener extends DestroyableContext { + public interface BaseFragmentListener { @Deprecated void runOnDbThread(Runnable runnable); @@ -72,8 +74,21 @@ public abstract class BaseFragment extends Fragment void onFragmentCreated(String tag); } + @CallSuper @Override - public void runOnUiThreadUnlessDestroyed(Runnable r) { - listener.runOnUiThreadUnlessDestroyed(r); + public void runOnUiThreadUnlessDestroyed(final Runnable r) { + final Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + // Note that we don't have to check if the activity has + // been destroyed as the Fragment has not been detached yet + if (!isDetached() && !activity.isFinishing()) { + r.run(); + } + } + }); + } } } diff --git a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java index 0f4704ca9c..6e67eb867a 100644 --- a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java +++ b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java @@ -272,7 +272,7 @@ public class ShowQrCodeFragment extends BaseEventFragment KeyAgreementAbortedEvent event = (KeyAgreementAbortedEvent) e; keyAgreementAborted(event.didRemoteAbort()); } else if (e instanceof KeyAgreementFinishedEvent) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { mainProgressContainer.setVisibility(VISIBLE); @@ -313,7 +313,7 @@ public class ShowQrCodeFragment extends BaseEventFragment } private void setQrCode(final Payload localPayload) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { generateBitmapQR(localPayload); @@ -322,7 +322,7 @@ public class ShowQrCodeFragment extends BaseEventFragment } private void keyAgreementFailed() { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { reset(); @@ -334,7 +334,7 @@ public class ShowQrCodeFragment extends BaseEventFragment } private void keyAgreementWaiting() { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { status.setText(R.string.waiting_for_contact_to_scan); @@ -343,7 +343,7 @@ public class ShowQrCodeFragment extends BaseEventFragment } private void keyAgreementStarted() { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { mainProgressContainer.setVisibility(VISIBLE); @@ -353,7 +353,7 @@ public class ShowQrCodeFragment extends BaseEventFragment } private void keyAgreementAborted(final boolean remoteAborted) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { reset(); @@ -370,7 +370,7 @@ public class ShowQrCodeFragment extends BaseEventFragment @Override public void handleResult(final Result result) { - listener.runOnUiThreadUnlessDestroyed(new Runnable() { + runOnUiThreadUnlessDestroyed(new Runnable() { @Override public void run() { LOG.info("Got result from decoder"); diff --git a/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java b/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java index 64727401dc..ec9f94b9f4 100644 --- a/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java +++ b/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java @@ -126,7 +126,7 @@ public class GroupListFragment extends BaseFragment implements @Override public void onGroupRemoveClick(GroupItem item) { controller.removeGroup(item.getId(), - new UiResultExceptionHandler<Void, DbException>(listener) { + new UiResultExceptionHandler<Void, DbException>(this) { @Override public void onResultUi(Void result) { // handled by GroupRemovedEvent and onGroupRemoved() @@ -173,7 +173,7 @@ public class GroupListFragment extends BaseFragment implements final int revision = adapter.getRevision(); controller.loadGroups( new UiResultExceptionHandler<Collection<GroupItem>, DbException>( - listener) { + this) { @Override public void onResultUi(Collection<GroupItem> groups) { if (revision == adapter.getRevision()) { -- GitLab