Always check whether context has been destroyed.

This commit is contained in:
akwizgran
2016-09-29 14:52:00 +01:00
parent f1730aa7d9
commit cb983f02c2
49 changed files with 310 additions and 340 deletions

View File

@@ -3,6 +3,7 @@ package org.briarproject.android.blogs;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import org.briarproject.android.DestroyableContext;
import org.briarproject.android.controller.handler.ResultExceptionHandler;
import org.briarproject.api.blogs.BlogPostHeader;
import org.briarproject.api.db.DbException;
@@ -33,9 +34,13 @@ interface BaseController {
void setOnBlogPostAddedListener(OnBlogPostAddedListener listener);
interface OnBlogPostAddedListener {
interface OnBlogPostAddedListener extends DestroyableContext {
@UiThread
void onBlogPostAdded(BlogPostHeader header, boolean local);
@UiThread
void onBlogRemoved();
}
}

View File

@@ -1,6 +1,5 @@
package org.briarproject.android.blogs;
import android.app.Activity;
import android.support.annotation.CallSuper;
import android.support.annotation.Nullable;
@@ -39,16 +38,14 @@ abstract class BaseControllerImpl extends DbControllerImpl
Logger.getLogger(BaseControllerImpl.class.getName());
@Inject
protected Activity activity;
EventBus eventBus;
@Inject
protected EventBus eventBus;
AndroidNotificationManager notificationManager;
@Inject
protected AndroidNotificationManager notificationManager;
@Inject
protected IdentityManager identityManager;
IdentityManager identityManager;
@Inject
protected volatile BlogManager blogManager;
volatile BlogManager blogManager;
private final Map<MessageId, String> bodyCache = new ConcurrentHashMap<>();
private final Map<MessageId, BlogPostHeader> headerCache =
@@ -75,12 +72,12 @@ abstract class BaseControllerImpl extends DbControllerImpl
@CallSuper
public void eventOccurred(Event e) {
if (e instanceof BlogPostAddedEvent) {
final BlogPostAddedEvent m = (BlogPostAddedEvent) e;
final BlogPostAddedEvent b = (BlogPostAddedEvent) e;
LOG.info("New blog post added");
activity.runOnUiThread(new Runnable() {
listener.runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
listener.onBlogPostAdded(m.getHeader(), m.isLocal());
listener.onBlogPostAdded(b.getHeader(), b.isLocal());
}
});
}
@@ -110,8 +107,7 @@ abstract class BaseControllerImpl extends DbControllerImpl
});
}
protected Collection<BlogPostItem> loadItems(GroupId groupId)
throws DbException {
Collection<BlogPostItem> loadItems(GroupId groupId) throws DbException {
long now = System.currentTimeMillis();
Collection<BlogPostHeader> headers =
blogManager.getPostHeaders(groupId);

View File

@@ -22,7 +22,7 @@ import static org.briarproject.android.util.AndroidUtils.MIN_RESOLUTION;
abstract class BasePostFragment extends BaseFragment {
private final Logger LOG =
private static final Logger LOG =
Logger.getLogger(BasePostFragment.class.getName());
private View view;

View File

@@ -90,6 +90,7 @@ abstract class BasePostPagerFragment extends BaseFragment
abstract void loadBlogPost(BlogPostHeader header);
@UiThread
protected void onBlogPostsLoaded(MessageId select,
Collection<BlogPostItem> posts) {
@@ -98,6 +99,7 @@ abstract class BasePostPagerFragment extends BaseFragment
selectPost(select);
}
@UiThread
protected void onBlogPostsLoadedException(DbException exception) {
// TODO: Decide how to handle errors in the UI
finish();
@@ -174,4 +176,8 @@ abstract class BasePostPagerFragment extends BaseFragment
}
}
@Override
public void onBlogRemoved() {
finish();
}
}

View File

@@ -1,5 +1,7 @@
package org.briarproject.android.blogs;
import android.app.Activity;
import org.briarproject.android.controller.ActivityLifecycleController;
import org.briarproject.android.controller.handler.ResultExceptionHandler;
import org.briarproject.api.blogs.Blog;
@@ -32,7 +34,7 @@ public class BlogControllerImpl extends BaseControllerImpl
}
@Override
public void onActivityCreate() {
public void onActivityCreate(Activity activity) {
}
@Override
@@ -69,11 +71,10 @@ public class BlogControllerImpl extends BaseControllerImpl
GroupRemovedEvent s = (GroupRemovedEvent) e;
if (s.getGroup().getId().equals(groupId)) {
LOG.info("Blog removed");
activity.runOnUiThread(new Runnable() {
listener.runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
// TODO: Not the controller's job, add a listener method
activity.finish();
listener.onBlogRemoved();
}
});
}

View File

@@ -160,8 +160,8 @@ public class BlogFragment extends BaseFragment implements
getActivity().onBackPressed();
return true;
case R.id.action_write_blog_post:
Intent i =
new Intent(getActivity(), WriteBlogPostActivity.class);
Intent i = new Intent(getActivity(),
WriteBlogPostActivity.class);
i.putExtra(GROUP_ID, groupId.getBytes());
i.putExtra(BLOG_NAME, blogName);
startActivityForResult(i, REQUEST_WRITE_POST,
@@ -224,7 +224,7 @@ public class BlogFragment extends BaseFragment implements
@Override
public void onExceptionUi(DbException exception) {
// TODO: Decide how to handle errors in the UI
getActivity().finish();
finish();
}
}
);
@@ -338,7 +338,7 @@ public class BlogFragment extends BaseFragment implements
Toast.makeText(getActivity(),
R.string.blogs_blog_removed, LENGTH_SHORT)
.show();
getActivity().supportFinishAfterTransition();
finish();
}
@Override
@@ -349,4 +349,8 @@ public class BlogFragment extends BaseFragment implements
});
}
@Override
public void onBlogRemoved() {
finish();
}
}

View File

@@ -41,6 +41,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
}
@Override
void loadBlogPosts(final MessageId select) {
blogController.loadBlogPosts(
new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
@@ -57,6 +58,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
});
}
@Override
void loadBlogPost(BlogPostHeader header) {
blogController.loadBlogPost(header,
new UiResultExceptionHandler<BlogPostItem, DbException>(
@@ -73,5 +75,4 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
}
});
}
}

View File

@@ -231,4 +231,9 @@ public class FeedFragment extends BaseFragment implements
}
s.show();
}
@Override
public void onBlogRemoved() {
finish();
}
}

View File

@@ -74,5 +74,4 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
}
});
}
}

View File

@@ -65,12 +65,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (BaseFragmentListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(
"Using class must implement BaseFragmentListener");
}
listener = (BaseFragmentListener) context;
}
@Override
@@ -93,12 +88,6 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
listener.getActivityComponent().inject(this);
}
@Override
public void onStart() {
super.onStart();

View File

@@ -42,10 +42,11 @@ public class RssFeedImportActivity extends BriarActivity {
@Inject
@IoExecutor
protected Executor ioExecutor;
Executor ioExecutor;
// Fields that are accessed from background threads must be volatile
private volatile GroupId groupId = null;
@Inject
@SuppressWarnings("WeakerAccess")
volatile FeedManager feedManager;
@@ -139,7 +140,7 @@ public class RssFeedImportActivity extends BriarActivity {
}
private void feedImported() {
runOnUiThread(new Runnable() {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
supportFinishAfterTransition();
@@ -148,11 +149,9 @@ public class RssFeedImportActivity extends BriarActivity {
}
private void importFailed() {
runOnUiThread(new Runnable() {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
if (RssFeedImportActivity.this.hasBeenDestroyed()) return;
// hide progress bar, show publish button
progressBar.setVisibility(GONE);
importButton.setVisibility(VISIBLE);

View File

@@ -40,6 +40,7 @@ public class RssFeedManageActivity extends BriarActivity
// Fields that are accessed from background threads must be volatile
private volatile GroupId groupId = null;
@Inject
@SuppressWarnings("WeakerAccess")
volatile FeedManager feedManager;
@@ -135,7 +136,7 @@ public class RssFeedManageActivity extends BriarActivity
}
private void addFeeds(final List<Feed> feeds) {
runOnUiThread(new Runnable() {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
if (feeds.size() == 0) list.showData();
@@ -145,7 +146,7 @@ public class RssFeedManageActivity extends BriarActivity
}
private void onFeedDeleted(final Feed feed) {
runOnUiThread(new Runnable() {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
adapter.remove(feed);
@@ -154,7 +155,7 @@ public class RssFeedManageActivity extends BriarActivity
}
private void onDeleteError() {
runOnUiThread(new Runnable() {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
Snackbar.make(list,

View File

@@ -44,7 +44,7 @@ public class WriteBlogPostActivity extends BriarActivity
Logger.getLogger(WriteBlogPostActivity.class.getName());
@Inject
protected AndroidNotificationManager notificationManager;
AndroidNotificationManager notificationManager;
private TextInputView input;
private ProgressBar progressBar;
@@ -52,7 +52,7 @@ public class WriteBlogPostActivity extends BriarActivity
// Fields that are accessed from background threads must be volatile
private volatile GroupId groupId;
@Inject
protected volatile IdentityManager identityManager;
volatile IdentityManager identityManager;
@Inject
volatile BlogPostFactory blogPostFactory;
@Inject
@@ -168,7 +168,7 @@ public class WriteBlogPostActivity extends BriarActivity
}
private void postPublished() {
runOnUiThread(new Runnable() {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
setResult(RESULT_OK);
@@ -178,7 +178,7 @@ public class WriteBlogPostActivity extends BriarActivity
}
private void postFailedToPublish() {
runOnUiThread(new Runnable() {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
// hide progress bar, show publish button