From ce2cb015585fc2a1bb9b23ecce0bfea4d5447ee2 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Mon, 1 Aug 2016 12:37:14 -0300 Subject: [PATCH] Show Blog Post times with new timestamp and update it periodically Closes #559 --- .../android/blogs/BlogFragment.java | 12 +++++ .../android/blogs/BlogListAdapter.java | 4 +- .../android/blogs/BlogPostAdapter.java | 4 +- .../android/blogs/BlogPostFragment.java | 52 ++++++++++++++++--- .../android/blogs/FeedFragment.java | 4 +- .../android/util/AndroidUtils.java | 2 +- 6 files changed, 66 insertions(+), 12 deletions(-) diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java index b83d39bdef..ec3762b581 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java @@ -120,6 +120,18 @@ public class BlogFragment extends BaseFragment implements BlogPostListener { loadData(false); } + @Override + public void onResume() { + super.onResume(); + list.startPeriodicUpdate(); + } + + @Override + public void onPause() { + super.onPause(); + list.stopPeriodicUpdate(); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (myBlog) { diff --git a/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java b/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java index 92526387f1..92f9430c42 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogListAdapter.java @@ -16,6 +16,7 @@ import android.view.ViewGroup; import android.widget.TextView; import org.briarproject.R; +import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.TextAvatarView; import org.briarproject.api.blogs.Blog; import org.briarproject.api.sync.GroupId; @@ -121,8 +122,7 @@ class BlogListAdapter extends ui.status.setVisibility(VISIBLE); } else { long timestamp = item.getTimestamp(); - ui.date.setText( - DateUtils.getRelativeTimeSpanString(ctx, timestamp)); + ui.date.setText(AndroidUtils.formatDate(ctx, timestamp)); ui.date.setVisibility(VISIBLE); ui.avatar.setProblem(false); ui.status.setVisibility(GONE); diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostAdapter.java b/briar-android/src/org/briarproject/android/blogs/BlogPostAdapter.java index b1b9f322e7..a0060a1e73 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogPostAdapter.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogPostAdapter.java @@ -11,6 +11,7 @@ import android.widget.ImageView; import android.widget.TextView; import org.briarproject.R; +import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.TrustIndicatorView; import org.briarproject.api.identity.Author; import org.briarproject.util.StringUtils; @@ -88,8 +89,7 @@ class BlogPostAdapter extends ui.trust.setTrustLevel(post.getAuthorStatus()); // date - ui.date.setText( - DateUtils.getRelativeTimeSpanString(ctx, post.getTimestamp())); + ui.date.setText(AndroidUtils.formatDate(ctx, post.getTimestamp())); // post body ui.body.setText(StringUtils.fromUtf8(post.getBody())); diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java index 54ac2cdda5..dbb926493a 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java @@ -3,7 +3,6 @@ package org.briarproject.android.blogs; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; -import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -16,12 +15,15 @@ import org.briarproject.R; import org.briarproject.android.ActivityComponent; import org.briarproject.android.controller.handler.UiResultHandler; import org.briarproject.android.fragment.BaseFragment; +import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.TrustIndicatorView; import org.briarproject.api.identity.Author; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; import org.briarproject.util.StringUtils; +import java.util.logging.Logger; + import javax.inject.Inject; import im.delight.android.identicons.IdenticonDrawable; @@ -29,16 +31,20 @@ import im.delight.android.identicons.IdenticonDrawable; import static android.view.View.GONE; import static android.widget.Toast.LENGTH_SHORT; import static org.briarproject.android.BriarActivity.GROUP_ID; +import static org.briarproject.android.util.AndroidUtils.MIN_RESOLUTION; public class BlogPostFragment extends BaseFragment { public final static String TAG = BlogPostFragment.class.getName(); + private static final Logger LOG = Logger.getLogger(TAG); private final static String BLOG_POST_ID = "briar.BLOG_NAME"; private GroupId groupId; private MessageId postId; private BlogPostViewHolder ui; + private BlogPostItem post = null; + private Runnable refresher = null; @Inject BlogController blogController; @@ -88,10 +94,9 @@ public class BlogPostFragment extends BaseFragment { public void onResultUi(Boolean result) { listener.hideLoadingScreen(); if (result) { - BlogPostItem post = - blogController.getBlogPost(postId); + post = blogController.getBlogPost(postId); if (post != null) { - bind(post); + bind(); } } else { Toast.makeText(getActivity(), @@ -102,6 +107,18 @@ public class BlogPostFragment extends BaseFragment { }); } + @Override + public void onResume() { + super.onResume(); + startPeriodicUpdate(); + } + + @Override + public void onPause() { + super.onPause(); + stopPeriodicUpdate(); + } + @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { @@ -118,14 +135,14 @@ public class BlogPostFragment extends BaseFragment { return TAG; } - private void bind(BlogPostItem post) { + private void bind() { Author author = post.getAuthor(); IdenticonDrawable d = new IdenticonDrawable(author.getId().getBytes()); ui.avatar.setImageDrawable(d); ui.authorName.setText(author.getName()); ui.trust.setTrustLevel(post.getAuthorStatus()); ui.date.setText( - DateUtils.getRelativeTimeSpanString(post.getTimestamp())); + AndroidUtils.formatDate(getActivity(), post.getTimestamp())); if (post.getTitle() != null) { ui.title.setText(post.getTitle()); @@ -154,4 +171,27 @@ public class BlogPostFragment extends BaseFragment { } } + private void startPeriodicUpdate() { + refresher = new Runnable() { + @Override + public void run() { + if (ui == null || post == null) return; + LOG.info("Updating Content..."); + + ui.date.setText(AndroidUtils + .formatDate(getActivity(), post.getTimestamp())); + ui.date.postDelayed(refresher, MIN_RESOLUTION); + } + }; + LOG.info("Adding Handler Callback"); + ui.date.postDelayed(refresher, MIN_RESOLUTION); + } + + private void stopPeriodicUpdate() { + if (refresher != null && ui != null) { + LOG.info("Removing Handler Callback"); + ui.date.removeCallbacks(refresher); + } + } + } diff --git a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java index eff999072c..47d0cc4270 100644 --- a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java @@ -17,7 +17,6 @@ import android.view.ViewGroup; import org.briarproject.R; import org.briarproject.android.ActivityComponent; -import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.android.blogs.BlogPostAdapter.OnBlogPostClickListener; import org.briarproject.android.controller.handler.UiResultHandler; import org.briarproject.android.fragment.BaseFragment; @@ -108,6 +107,7 @@ public class FeedFragment extends BaseFragment implements @Override public void onResume() { super.onResume(); + list.startPeriodicUpdate(); feedController.onResume(); feedController.loadPosts( new UiResultHandler<Collection<BlogPostItem>>(getActivity()) { @@ -127,6 +127,7 @@ public class FeedFragment extends BaseFragment implements @Override public void onPause() { super.onPause(); + list.stopPeriodicUpdate(); feedController.onPause(); // TODO save list position in database/preferences? } @@ -216,4 +217,5 @@ public class FeedFragment extends BaseFragment implements } s.show(); } + } diff --git a/briar-android/src/org/briarproject/android/util/AndroidUtils.java b/briar-android/src/org/briarproject/android/util/AndroidUtils.java index 0488e927f6..fb47a7abe9 100644 --- a/briar-android/src/org/briarproject/android/util/AndroidUtils.java +++ b/briar-android/src/org/briarproject/android/util/AndroidUtils.java @@ -30,7 +30,7 @@ import static android.text.format.DateUtils.WEEK_IN_MILLIS; public class AndroidUtils { - static final long MIN_RESOLUTION = MINUTE_IN_MILLIS; + public 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"; -- GitLab