diff --git a/briar-android/res/drawable/chevron48dp_down.xml b/briar-android/res/drawable/chevron48dp_down.xml index 16dd3cd9d..6f1f305df 100644 --- a/briar-android/res/drawable/chevron48dp_down.xml +++ b/briar-android/res/drawable/chevron48dp_down.xml @@ -1,4 +1,9 @@ - - + + diff --git a/briar-android/res/drawable/chevron48dp_up.xml b/briar-android/res/drawable/chevron48dp_up.xml index 7d59523a9..50894206e 100644 --- a/briar-android/res/drawable/chevron48dp_up.xml +++ b/briar-android/res/drawable/chevron48dp_up.xml @@ -1,4 +1,9 @@ - - + + diff --git a/briar-android/res/drawable/selector_chevron.xml b/briar-android/res/drawable/selector_chevron.xml index bc08694ba..f3a72a87d 100644 --- a/briar-android/res/drawable/selector_chevron.xml +++ b/briar-android/res/drawable/selector_chevron.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/briar-android/res/layout/forum_discussion_cell.xml b/briar-android/res/layout/forum_discussion_cell.xml index c8dd79dd6..fc6e1a20a 100644 --- a/briar-android/res/layout/forum_discussion_cell.xml +++ b/briar-android/res/layout/forum_discussion_cell.xml @@ -148,9 +148,7 @@ android:layout_marginRight="@dimen/margin_medium" android:layout_marginTop="@dimen/margin_small" android:clickable="true" - android:src="@drawable/selector_chevron" - android:tint="@color/briar_button_positive" - /> + android:src="@drawable/selector_chevron"/> (this) { - @Override - public void onResultUi(Boolean result) { - if (result) { - Forum forum = forumController.getForum(); - if (forum != null) setTitle(forum.getName()); - forumAdapter = new ForumAdapter( - forumController.getForumEntries()); - recyclerView.setAdapter(forumAdapter); - recyclerView.periodicallyUpdateContent(); - if (state != null) { - byte[] replyId = - state.getByteArray(KEY_REPLY_ID); - if (replyId != null) { - forumAdapter.setReplyEntryById(replyId); - } - } - recyclerView.showData(); - } else { - // TODO Maybe an error dialog ? - finish(); - } + forumController.loadForum(groupId, new UiResultHandler(this) { + @Override + public void onResultUi(Boolean result) { + if (result) { + Forum forum = forumController.getForum(); + if (forum != null) setTitle(forum.getName()); + forumAdapter.setEntries(forumController.getForumEntries()); + if (state != null) { + byte[] replyId = state.getByteArray(KEY_REPLY_ID); + if (replyId != null) + forumAdapter.setReplyEntryById(replyId); } - }); + recyclerView.showData(); + } else { + // TODO Maybe an error dialog ? + finish(); + } + } + }); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); - inputContainer - .setVisibility( - savedInstanceState.getBoolean(KEY_INPUT_VISIBILITY) ? - VISIBLE : GONE); + inputContainer.setVisibility( + savedInstanceState.getBoolean(KEY_INPUT_VISIBILITY) ? + VISIBLE : GONE); } @@ -250,12 +246,14 @@ public class ForumActivity extends BriarActivity implements super.onResume(); notificationManager.blockNotification(groupId); notificationManager.clearForumPostNotification(groupId); + recyclerView.startPeriodicUpdate(); } @Override public void onPause() { super.onPause(); notificationManager.unblockNotification(groupId); + recyclerView.stopPeriodicUpdate(); } public void sendMessage(View view) { @@ -367,23 +365,25 @@ public class ForumActivity extends BriarActivity implements public class ForumAdapter extends RecyclerView.Adapter { - private final List forumEntries; + private final List forumEntries = new ArrayList<>(); + private final Map animatingEntries = + new HashMap<>(); + // highlight not dependant on time private ForumEntry replyEntry; // temporary highlight private ForumEntry addedEntry; - Map animatingEntries = new HashMap<>(); - - ForumAdapter(@NonNull List forumEntries) { - this.forumEntries = forumEntries; - } private ForumEntry getReplyEntry() { return replyEntry; } - void addEntry(int index, ForumEntry entry, - boolean isScrolling) { + void setEntries(List entries) { + forumEntries.clear(); + forumEntries.addAll(entries); + } + + void addEntry(int index, ForumEntry entry, boolean isScrolling) { forumEntries.add(index, entry); boolean isShowingDescendants = false; if (entry.getLevel() > 0) { @@ -553,7 +553,7 @@ public class ForumActivity extends BriarActivity implements return null; } - @TargetApi(Build.VERSION_CODES.HONEYCOMB) + @TargetApi(11) private void animateFadeOut(final ForumViewHolder ui, final ForumEntry addedEntry) { ui.setIsRecyclable(false); @@ -599,8 +599,8 @@ public class ForumActivity extends BriarActivity implements } @Override - public ForumViewHolder onCreateViewHolder( - ViewGroup parent, int viewType) { + public ForumViewHolder onCreateViewHolder(ViewGroup parent, + int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.forum_discussion_cell, parent, false); return new ForumViewHolder(v); @@ -724,5 +724,4 @@ public class ForumActivity extends BriarActivity implements } } - } diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java index 1916bce32..cca381a80 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java @@ -84,7 +84,6 @@ public class ForumListFragment extends BaseEventFragment implements list.setLayoutManager(new LinearLayoutManager(getActivity())); list.setAdapter(adapter); list.setEmptyText(getString(R.string.no_forums)); - list.periodicallyUpdateContent(); snackbar = Snackbar.make(list, "", LENGTH_INDEFINITE); snackbar.getView().setBackgroundResource(R.color.briar_primary); @@ -111,6 +110,7 @@ public class ForumListFragment extends BaseEventFragment implements loadForumHeaders(); loadAvailableForums(); + list.startPeriodicUpdate(); } @Override @@ -118,6 +118,7 @@ public class ForumListFragment extends BaseEventFragment implements super.onPause(); adapter.clear(); + list.stopPeriodicUpdate(); } @Override diff --git a/briar-android/src/org/briarproject/android/util/AndroidUtils.java b/briar-android/src/org/briarproject/android/util/AndroidUtils.java index 077dc8aa5..0488e927f 100644 --- a/briar-android/src/org/briarproject/android/util/AndroidUtils.java +++ b/briar-android/src/org/briarproject/android/util/AndroidUtils.java @@ -30,6 +30,8 @@ import static android.text.format.DateUtils.WEEK_IN_MILLIS; public class AndroidUtils { + static final long MIN_RESOLUTION = MINUTE_IN_MILLIS; + // Fake Bluetooth address returned by BluetoothAdapter on API 23 and later private static final String FAKE_BLUETOOTH_ADDRESS = "02:00:00:00:00:00"; @@ -97,22 +99,20 @@ public class AndroidUtils { } public static String formatDate(Context ctx, long time) { - // update BriarRecyclerView#DEFAULT_REFRESH_INTERVAL along with this - long minResolution = MINUTE_IN_MILLIS; int flags = FORMAT_ABBREV_RELATIVE | FORMAT_SHOW_DATE | FORMAT_ABBREV_TIME | FORMAT_ABBREV_MONTH; long diff = System.currentTimeMillis() - time; - if (diff < minResolution) return ctx.getString(R.string.now); + if (diff < MIN_RESOLUTION) return ctx.getString(R.string.now); if (diff >= DAY_IN_MILLIS && diff < WEEK_IN_MILLIS) { // also show time when older than a day, but newer than a week - return DateUtils.getRelativeDateTimeString(ctx, time, minResolution, - WEEK_IN_MILLIS, flags).toString(); + return DateUtils.getRelativeDateTimeString(ctx, time, + MIN_RESOLUTION, WEEK_IN_MILLIS, flags).toString(); } // otherwise just show "...ago" or date string return DateUtils .getRelativeTimeSpanString(time, System.currentTimeMillis(), - minResolution, flags).toString(); + MIN_RESOLUTION, flags).toString(); } } diff --git a/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java b/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java index 6cd36dd6b..6c403747f 100644 --- a/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java +++ b/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java @@ -16,10 +16,14 @@ import org.briarproject.R; import java.util.logging.Logger; -import static android.text.format.DateUtils.MINUTE_IN_MILLIS; +import static org.briarproject.android.util.AndroidUtils.MIN_RESOLUTION; public class BriarRecyclerView extends FrameLayout { + private static final long DEFAULT_REFRESH_INTERVAL = MIN_RESOLUTION; + private static final Logger LOG = + Logger.getLogger(BriarRecyclerView.class.getName()); + private RecyclerView recyclerView; private TextView emptyView; private ProgressBar progressBar; @@ -27,9 +31,6 @@ public class BriarRecyclerView extends FrameLayout { private Runnable refresher = null; private boolean isScrollingToEnd = false; - private final Logger LOG = Logger.getLogger(getClass().getName()); - private final long DEFAULT_REFRESH_INTERVAL = MINUTE_IN_MILLIS; - public BriarRecyclerView(Context context) { this(context, null, 0); } @@ -52,10 +53,7 @@ public class BriarRecyclerView extends FrameLayout { @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (refresher != null) { - LOG.info("Removing Handler Callback"); - removeCallbacks(refresher); - } + stopPeriodicUpdate(); } private void initViews() { @@ -172,7 +170,7 @@ public class BriarRecyclerView extends FrameLayout { return this.recyclerView; } - public void periodicallyUpdateContent() { + public void startPeriodicUpdate() { if (recyclerView == null || recyclerView.getAdapter() == null) { throw new IllegalStateException("Need to call setAdapter() first!"); } @@ -188,4 +186,11 @@ public class BriarRecyclerView extends FrameLayout { postDelayed(refresher, DEFAULT_REFRESH_INTERVAL); } + public void stopPeriodicUpdate() { + if (refresher != null) { + LOG.info("Removing Handler Callback"); + removeCallbacks(refresher); + } + } + } diff --git a/briar-android/test/java/briarproject/activity/TestForumActivity.java b/briar-android/test/java/briarproject/activity/TestForumActivity.java index f73d83e18..9455ace7e 100644 --- a/briar-android/test/java/briarproject/activity/TestForumActivity.java +++ b/briar-android/test/java/briarproject/activity/TestForumActivity.java @@ -9,7 +9,7 @@ import org.briarproject.android.forum.ForumControllerImpl; import org.mockito.Mockito; /** - * This class exposes the SetupController and offers the possibility to + * This class exposes the ForumController and offers the possibility to * override it. */ public class TestForumActivity extends ForumActivity {