Newer
Older
package org.briarproject.android.blogs;
import android.content.Intent;
import android.os.Bundle;
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.ViewGroup;
import android.widget.ProgressBar;
import android.widget.Toast;
import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.BriarActivity;
import org.briarproject.android.blogs.BlogController.BlogPostListener;
import org.briarproject.android.blogs.BlogPostAdapter.OnBlogPostClickListener;
import org.briarproject.android.controller.handler.UiResultHandler;
import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import java.util.Collection;
import java.util.logging.Logger;
import javax.inject.Inject;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.Toast.LENGTH_SHORT;
public class BlogActivity extends BriarActivity implements BlogPostListener,
OnBlogPostClickListener, BaseFragmentListener {
static final int REQUEST_WRITE_POST = 1;
static final String BLOG_NAME = "briar.BLOG_NAME";
static final String IS_MY_BLOG = "briar.IS_MY_BLOG";
static final String IS_NEW_BLOG = "briar.IS_NEW_BLOG";
private static final String BLOG_PAGER_ADAPTER = "briar.BLOG_PAGER_ADAPTER";
private static final Logger LOG =
Logger.getLogger(BlogActivity.class.getName());
private ProgressBar progressBar;
private ViewPager pager;
private BlogPagerAdapter blogPagerAdapter;
private BlogPostPagerAdapter postPagerAdapter;
private String blogName;
private boolean myBlog, isNew;
// Fields that are accessed from background threads must be volatile
private volatile GroupId groupId = null;
@Inject
BlogController blogController;
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
Intent i = getIntent();
byte[] b = i.getByteArrayExtra(GROUP_ID);
if (b == null) throw new IllegalStateException("No Group in intent.");
groupId = new GroupId(b);
// Name of the Blog from Intent
blogName = i.getStringExtra(BLOG_NAME);
if (blogName != null) setTitle(blogName);
// Is this our blog and was it just created?
myBlog = i.getBooleanExtra(IS_MY_BLOG, false);
isNew = i.getBooleanExtra(IS_NEW_BLOG, false);
setContentView(R.layout.activity_blog);
pager = (ViewPager) findViewById(R.id.pager);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
hideLoadingScreen();
blogPagerAdapter = new BlogPagerAdapter(getSupportFragmentManager());
if (state == null || state.getBoolean(BLOG_PAGER_ADAPTER, true)) {
pager.setAdapter(blogPagerAdapter);
// this initializes and restores the postPagerAdapter
loadBlogPosts();
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// remember which adapter we had active
outState.putBoolean(BLOG_PAGER_ADAPTER,
pager.getAdapter() == blogPagerAdapter);
}
@Override
public void onBackPressed() {
if (pager.getAdapter() == postPagerAdapter) {
pager.setAdapter(blogPagerAdapter);
} else {
super.onBackPressed();
}
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
public void showLoadingScreen(boolean isBlocking, int stringId) {
progressBar.setVisibility(VISIBLE);
}
private void showLoadingScreen() {
showLoadingScreen(false, 0);
public void hideLoadingScreen() {
progressBar.setVisibility(GONE);
public void onFragmentCreated(String tag) {
public void onBlogPostClick(final int position) {
loadBlogPosts(position, true);
}
private void loadBlogPosts() {
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
loadBlogPosts(0, false);
}
private void loadBlogPosts(final int position, final boolean setItem) {
showLoadingScreen();
blogController
.loadBlog(groupId, false, new UiResultHandler<Boolean>(this) {
@Override
public void onResultUi(Boolean result) {
if (result) {
Collection<BlogPostItem> posts =
blogController.getBlogPosts();
if (postPagerAdapter == null) {
postPagerAdapter = new BlogPostPagerAdapter(
getSupportFragmentManager(),
posts.size());
} else {
postPagerAdapter.setSize(posts.size());
}
pager.setAdapter(postPagerAdapter);
if (setItem) pager.setCurrentItem(position);
} else {
Toast.makeText(BlogActivity.this,
R.string.blogs_blog_post_failed_to_load,
LENGTH_SHORT).show();
@Override
public void onBlogPostAdded(final BlogPostItem post, final boolean local) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (blogPagerAdapter != null) {
BlogFragment f = blogPagerAdapter.getFragment();
if (f != null && f.isVisible()) {
f.onBlogPostAdded(post, local);
}
}
if (postPagerAdapter != null) {
postPagerAdapter.onBlogPostAdded();
postPagerAdapter.notifyDataSetChanged();
}
}
});
}
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
// The BlogPostAddedEvent arrives when the controller is not listening,
// so we need to manually reload the blog posts :(
if (requestCode == REQUEST_WRITE_POST && resultCode == RESULT_OK) {
BlogFragment f = blogPagerAdapter.getFragment();
if (f != null && f.isVisible()) {
f.reload();
}
}
}
private class BlogPagerAdapter extends FragmentStatePagerAdapter {
private BlogFragment fragment = null;
BlogPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 1;
}
@Override
public Fragment getItem(int position) {
return BlogFragment.newInstance(groupId, blogName, myBlog, isNew);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// save a reference to the single fragment here for later
fragment =
(BlogFragment) super.instantiateItem(container, position);
return fragment;
}
BlogFragment getFragment() {
return fragment;
}
}
private class BlogPostPagerAdapter extends FragmentStatePagerAdapter {
private int size;
BlogPostPagerAdapter(FragmentManager fm, int size) {
super(fm);
this.size = size;
}
@Override
public int getCount() {
return size;
}
@Override
public Fragment getItem(int position) {
MessageId postIdOfPos = blogController.getBlogPostId(position);
return BlogPostFragment.newInstance(groupId, postIdOfPos);
}
void onBlogPostAdded() {
size++;
}
void setSize(int size) {
this.size = size;
}
}