mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 18:59:06 +01:00
Make the blog post pager usable for the feed and individual blogs
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
package org.briarproject.android.blogs;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.UiThread;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.briarproject.R;
|
||||
import org.briarproject.android.blogs.BaseController.OnBlogPostAddedListener;
|
||||
import org.briarproject.android.controller.handler.UiResultExceptionHandler;
|
||||
import org.briarproject.android.fragment.BaseFragment;
|
||||
import org.briarproject.api.blogs.BlogPostHeader;
|
||||
import org.briarproject.api.db.DbException;
|
||||
import org.briarproject.api.sync.MessageId;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.briarproject.android.blogs.BasePostPagerFragment.BlogPostPagerAdapter.INVALID_POSITION;
|
||||
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
|
||||
|
||||
abstract class BasePostPagerFragment extends BaseFragment
|
||||
implements OnBlogPostAddedListener {
|
||||
|
||||
private ViewPager pager;
|
||||
private BlogPostPagerAdapter postPagerAdapter;
|
||||
private MessageId postId;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle state) {
|
||||
|
||||
Bundle args;
|
||||
if (state == null) args = getArguments();
|
||||
else args = state;
|
||||
byte[] p = args.getByteArray(POST_ID);
|
||||
if (p == null)
|
||||
throw new IllegalStateException("No post ID in args");
|
||||
postId = new MessageId(p);
|
||||
|
||||
View v = inflater.inflate(R.layout.fragment_blog_post_pager, container,
|
||||
false);
|
||||
pager = (ViewPager) v.findViewById(R.id.pager);
|
||||
postPagerAdapter = new BlogPostPagerAdapter(getChildFragmentManager());
|
||||
listener.showLoadingScreen(false, R.string.progress_title_please_wait);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (postId == null) {
|
||||
MessageId selected = getSelectedPost();
|
||||
if (selected != null) loadBlogPosts(selected);
|
||||
} else {
|
||||
loadBlogPosts(postId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
MessageId selected = getSelectedPost();
|
||||
if (selected != null)
|
||||
outState.putByteArray(POST_ID, selected.getBytes());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlogPostAdded(BlogPostHeader header, boolean local) {
|
||||
loadBlogPost(header);
|
||||
}
|
||||
|
||||
abstract void loadBlogPosts(final MessageId select);
|
||||
|
||||
abstract BaseController getController();
|
||||
|
||||
protected void onBlogPostsLoaded(MessageId select,
|
||||
Collection<BlogPostItem> posts) {
|
||||
|
||||
postId = null;
|
||||
postPagerAdapter.setPosts(posts);
|
||||
selectPost(select);
|
||||
}
|
||||
|
||||
protected void onBlogPostsLoadedException(DbException exception) {
|
||||
// TODO: Decide how to handle errors in the UI
|
||||
finish();
|
||||
}
|
||||
|
||||
private void loadBlogPost(BlogPostHeader header) {
|
||||
getController().loadBlogPost(header,
|
||||
new UiResultExceptionHandler<BlogPostItem, DbException>(
|
||||
getActivity()) {
|
||||
@Override
|
||||
public void onResultUi(BlogPostItem post) {
|
||||
addPost(post);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExceptionUi(DbException exception) {
|
||||
// TODO: Decide how to handle errors in the UI
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private MessageId getSelectedPost() {
|
||||
if (postPagerAdapter.getCount() == 0) return null;
|
||||
int position = pager.getCurrentItem();
|
||||
return postPagerAdapter.getPost(position).getId();
|
||||
}
|
||||
|
||||
private void selectPost(MessageId m) {
|
||||
int pos = postPagerAdapter.getPostPosition(m);
|
||||
if (pos != INVALID_POSITION) {
|
||||
pager.setAdapter(postPagerAdapter);
|
||||
pager.setCurrentItem(pos);
|
||||
}
|
||||
}
|
||||
|
||||
protected void addPost(BlogPostItem post) {
|
||||
MessageId selected = getSelectedPost();
|
||||
postPagerAdapter.addPost(post);
|
||||
if (selected != null) selectPost(selected);
|
||||
}
|
||||
|
||||
@UiThread
|
||||
static class BlogPostPagerAdapter extends FragmentStatePagerAdapter {
|
||||
|
||||
static final int INVALID_POSITION = -1;
|
||||
private final List<BlogPostItem> posts = new ArrayList<>();
|
||||
|
||||
private BlogPostPagerAdapter(FragmentManager fm) {
|
||||
super(fm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return posts.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
BlogPostItem post = posts.get(position);
|
||||
return FeedPostFragment.newInstance(post.getGroupId(), post.getId());
|
||||
}
|
||||
|
||||
private BlogPostItem getPost(int position) {
|
||||
return posts.get(position);
|
||||
}
|
||||
|
||||
private void setPosts(Collection<BlogPostItem> posts) {
|
||||
this.posts.clear();
|
||||
this.posts.addAll(posts);
|
||||
Collections.sort(this.posts);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void addPost(BlogPostItem post) {
|
||||
posts.add(post);
|
||||
Collections.sort(posts);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private int getPostPosition(MessageId m) {
|
||||
int count = getCount();
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (getPost(i).getId().equals(m)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return INVALID_POSITION;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user