Address review issues

This commit is contained in:
Torsten Grote
2016-09-07 13:57:51 -03:00
parent ac325d4423
commit ccc49df08e
16 changed files with 122 additions and 88 deletions

View File

@@ -20,6 +20,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout>
</ScrollView>

View File

@@ -1,6 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout>

View File

@@ -73,6 +73,7 @@
<string name="offline">Offline</string>
<string name="send">Send</string>
<string name="no_data">No data</string>
<string name="ellipsis"></string>
<!-- Contacts and Private Conversations-->
<string name="no_contacts">It seems that you are new here and have no contacts yet.\n\nTap the + icon at the top and follow the instructions to add some friends to your list.\n\nPlease remember: You can only add new contacts face-to-face to prevent anyone from impersonating you or reading your messages in the future.</string>

View File

@@ -59,6 +59,9 @@ abstract class BaseControllerImpl extends DbControllerImpl
@Override
@CallSuper
public void onStart() {
if (listener == null)
throw new IllegalStateException(
"OnBlogPostAddedListener needs to be attached");
eventBus.addListener(this);
}

View File

@@ -3,10 +3,12 @@ package org.briarproject.android.blogs;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import org.briarproject.R;
import org.briarproject.android.fragment.BaseFragment;
@@ -14,6 +16,8 @@ import org.briarproject.api.db.DbException;
import java.util.logging.Logger;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static org.briarproject.android.util.AndroidUtils.MIN_RESOLUTION;
public abstract class BasePostFragment extends BaseFragment {
@@ -22,6 +26,7 @@ public abstract class BasePostFragment extends BaseFragment {
Logger.getLogger(BasePostFragment.class.getName());
private View view;
private ProgressBar progressBar;
private BlogPostViewHolder ui;
private BlogPostItem post;
private Runnable refresher;
@@ -35,6 +40,8 @@ public abstract class BasePostFragment extends BaseFragment {
view = inflater.inflate(R.layout.fragment_blog_post, container,
false);
progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
progressBar.setVisibility(VISIBLE);
ui = new BlogPostViewHolder(view);
return view;
}
@@ -46,6 +53,7 @@ public abstract class BasePostFragment extends BaseFragment {
startPeriodicUpdate();
}
@CallSuper
@Override
public void onStop() {
super.onStop();
@@ -63,12 +71,14 @@ public abstract class BasePostFragment extends BaseFragment {
}
}
@UiThread
protected void onBlogPostLoaded(BlogPostItem post) {
listener.hideLoadingScreen();
progressBar.setVisibility(INVISIBLE);
this.post = post;
ui.bindItem(post);
}
@UiThread
protected void onBlogPostLoadException(DbException exception) {
// TODO: Decide how to handle errors in the UI
finish();

View File

@@ -10,10 +10,10 @@ import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
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;
@@ -24,13 +24,17 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
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 {
static final String POST_ID = "briar.POST_ID";
private ViewPager pager;
private ProgressBar progressBar;
private BlogPostPagerAdapter postPagerAdapter;
private MessageId postId;
@@ -49,9 +53,11 @@ abstract class BasePostPagerFragment extends BaseFragment
View v = inflater.inflate(R.layout.fragment_blog_post_pager, container,
false);
progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
progressBar.setVisibility(VISIBLE);
pager = (ViewPager) v.findViewById(R.id.pager);
postPagerAdapter = new BlogPostPagerAdapter(getChildFragmentManager());
listener.showLoadingScreen(false, R.string.progress_title_please_wait);
return v;
}
@@ -82,7 +88,7 @@ abstract class BasePostPagerFragment extends BaseFragment
abstract void loadBlogPosts(final MessageId select);
abstract BaseController getController();
abstract void loadBlogPost(BlogPostHeader header);
protected void onBlogPostsLoaded(MessageId select,
Collection<BlogPostItem> posts) {
@@ -97,23 +103,6 @@ abstract class BasePostPagerFragment extends BaseFragment
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;
@@ -124,6 +113,7 @@ abstract class BasePostPagerFragment extends BaseFragment
private void selectPost(MessageId m) {
int pos = postPagerAdapter.getPostPosition(m);
if (pos != INVALID_POSITION) {
progressBar.setVisibility(INVISIBLE);
pager.setAdapter(postPagerAdapter);
pager.setCurrentItem(pos);
}

View File

@@ -7,10 +7,8 @@ import android.widget.ProgressBar;
import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.BriarActivity;
import org.briarproject.android.blogs.BaseController.OnBlogPostAddedListener;
import org.briarproject.android.blogs.BlogPostAdapter.OnBlogPostClickListener;
import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
import org.briarproject.api.blogs.BlogPostHeader;
import org.briarproject.api.sync.GroupId;
import javax.inject.Inject;
@@ -19,13 +17,12 @@ import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
public class BlogActivity extends BriarActivity implements
OnBlogPostAddedListener, OnBlogPostClickListener, BaseFragmentListener {
OnBlogPostClickListener, BaseFragmentListener {
static final int REQUEST_WRITE_POST = 1;
static final int REQUEST_SHARE = 2;
static final String BLOG_NAME = "briar.BLOG_NAME";
static final String IS_NEW_BLOG = "briar.IS_NEW_BLOG";
static final String POST_ID = "briar.POST_ID";
private ProgressBar progressBar;
@@ -61,22 +58,11 @@ public class BlogActivity extends BriarActivity implements
}
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
@Override
public void onBlogPostAdded(BlogPostHeader header, boolean local) {
// all our fragments are implementing and registering that hook,
// so we don't need to do that ourselves
}
@Override
public void onBlogPostClick(BlogPostItem post) {
BlogPostPagerFragment f = BlogPostPagerFragment.newInstance(post.getId());

View File

@@ -35,13 +35,6 @@ public class BlogControllerImpl extends BaseControllerImpl
@Override
public void onActivityCreate() {
if (activity instanceof OnBlogPostAddedListener) {
listener = (OnBlogPostAddedListener) activity;
} else {
throw new IllegalStateException(
"An activity that injects the BlogController must " +
"implement the OnBlogPostAddedListener");
}
}
@Override

View File

@@ -13,7 +13,7 @@ import org.briarproject.api.sync.MessageId;
import javax.inject.Inject;
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
import static org.briarproject.android.blogs.BasePostPagerFragment.POST_ID;
public class BlogPostFragment extends BasePostFragment {

View File

@@ -4,6 +4,7 @@ import android.os.Bundle;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.controller.handler.UiResultExceptionHandler;
import org.briarproject.api.blogs.BlogPostHeader;
import org.briarproject.api.db.DbException;
import org.briarproject.api.sync.MessageId;
@@ -11,8 +12,6 @@ import java.util.Collection;
import javax.inject.Inject;
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
public class BlogPostPagerFragment extends BasePostPagerFragment {
@@ -42,10 +41,6 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
return TAG;
}
@Override
BaseController getController() {
return blogController;
}
void loadBlogPosts(final MessageId select) {
blogController.loadBlogPosts(
@@ -63,4 +58,21 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
});
}
void loadBlogPost(BlogPostHeader header) {
blogController.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();
}
});
}
}

View File

@@ -6,13 +6,8 @@ import android.content.Intent;
import android.support.annotation.UiThread;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -32,14 +27,14 @@ import static android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAn
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static org.briarproject.android.BriarActivity.GROUP_ID;
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
import static org.briarproject.android.blogs.BasePostPagerFragment.POST_ID;
import static org.briarproject.android.util.AndroidUtils.TEASER_LENGTH;
import static org.briarproject.android.util.AndroidUtils.getTeaser;
import static org.briarproject.api.blogs.MessageType.POST;
@UiThread
class BlogPostViewHolder extends RecyclerView.ViewHolder {
private static final int TEASER_LENGTH = 240;
private final Context ctx;
private final ViewGroup layout;
private final AuthorView reblogger;
@@ -119,7 +114,7 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
} else {
body.setTextIsSelectable(false);
if (item.getBody().length() > TEASER_LENGTH)
bodyText = getTeaser(item.getBody());
bodyText = getTeaser(ctx, item.getBody());
}
body.setText(bodyText);
@@ -176,20 +171,4 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
commentContainer.addView(v);
}
}
private SpannableStringBuilder getTeaser(String body) {
SpannableStringBuilder builder =
new SpannableStringBuilder(body.substring(0, TEASER_LENGTH));
builder.append("");
Spannable readMore =
new SpannableString(ctx.getString(R.string.read_more) + "");
ForegroundColorSpan fg = new ForegroundColorSpan(
ContextCompat.getColor(ctx, R.color.briar_text_link));
readMore.setSpan(fg, 0, readMore.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(readMore);
return builder;
}
}

View File

@@ -15,7 +15,7 @@ import org.briarproject.api.sync.MessageId;
import javax.inject.Inject;
import static org.briarproject.android.BriarActivity.GROUP_ID;
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
import static org.briarproject.android.blogs.BasePostPagerFragment.POST_ID;
public class FeedPostFragment extends BasePostFragment {

View File

@@ -4,6 +4,7 @@ import android.os.Bundle;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.controller.handler.UiResultExceptionHandler;
import org.briarproject.api.blogs.BlogPostHeader;
import org.briarproject.api.db.DbException;
import org.briarproject.api.sync.MessageId;
@@ -11,8 +12,6 @@ import java.util.Collection;
import javax.inject.Inject;
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
public class FeedPostPagerFragment extends BasePostPagerFragment {
public final static String TAG = FeedPostPagerFragment.class.getName();
@@ -41,10 +40,6 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
return TAG;
}
@Override
BaseController getController() {
return feedController;
}
void loadBlogPosts(final MessageId select) {
feedController.loadBlogPosts(
@@ -62,4 +57,21 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
});
}
void loadBlogPost(BlogPostHeader header) {
feedController.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();
}
});
}
}

View File

@@ -15,7 +15,7 @@ import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
import static org.briarproject.android.blogs.BasePostPagerFragment.POST_ID;
public class ReblogActivity extends BriarActivity implements
BaseFragmentListener {

View File

@@ -27,7 +27,7 @@ import static android.view.View.GONE;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static org.briarproject.android.BriarActivity.GROUP_ID;
import static org.briarproject.android.blogs.BlogActivity.POST_ID;
import static org.briarproject.android.blogs.BasePostPagerFragment.POST_ID;
public class ReblogFragment extends BaseFragment {

View File

@@ -6,7 +6,12 @@ import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.support.design.widget.TextInputLayout;
import android.support.v4.content.ContextCompat;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.format.DateUtils;
import android.text.style.ForegroundColorSpan;
import org.briarproject.R;
import org.briarproject.util.IoUtils;
@@ -31,6 +36,7 @@ import static android.text.format.DateUtils.WEEK_IN_MILLIS;
public class AndroidUtils {
public static final long MIN_RESOLUTION = MINUTE_IN_MILLIS;
public static final int TEASER_LENGTH = 240;
// Fake Bluetooth address returned by BluetoothAdapter on API 23 and later
private static final String FAKE_BLUETOOTH_ADDRESS = "02:00:00:00:00:00";
@@ -115,4 +121,25 @@ public class AndroidUtils {
MIN_RESOLUTION, flags).toString();
}
public static SpannableStringBuilder getTeaser(Context ctx, String body) {
if (body.length() < TEASER_LENGTH)
throw new IllegalArgumentException(
"String is shorter than TEASER_LENGTH");
SpannableStringBuilder builder =
new SpannableStringBuilder(body.substring(0, TEASER_LENGTH));
String ellipsis = ctx.getString(R.string.ellipsis);
builder.append(ellipsis).append(" ");
Spannable readMore = new SpannableString(
ctx.getString(R.string.read_more) + ellipsis);
ForegroundColorSpan fg = new ForegroundColorSpan(
ContextCompat.getColor(ctx, R.color.briar_text_link));
readMore.setSpan(fg, 0, readMore.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(readMore);
return builder;
}
}