From bdaf85a5ac15164ad989c675ad71bb5c6cdca440 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 11:57:25 -0400 Subject: [PATCH 01/41] Added separate routines for requesting local/global related posts --- .../ui/reader/ReaderPostDetailFragment.java | 2 +- .../ui/reader/actions/ReaderPostActions.java | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 9e8d6d77a174..404de035debc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -436,7 +436,7 @@ private void replacePost(long blogId, long postId) { */ private void requestRelatedPosts() { if (hasPost() && mPost.isWP()) { - ReaderPostActions.requestRelatedPosts(mPost); + ReaderPostActions.requestGlobalRelatedPosts(mPost); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index f7d66e1d2d82..401b6e8fc7b7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -39,6 +39,7 @@ public class ReaderPostActions { private static final String TRACKING_REFERRER = "https://wordpress.com/"; private static final Random mRandom = new Random(); + private static final int NUM_RELATED_POSTS_TO_REQUEST = 2; private ReaderPostActions() { throw new AssertionError(); @@ -340,9 +341,17 @@ public Map getHeaders() throws AuthFailureError { } /* - * request posts related to the passed one + * request posts related to the passed one, use requestGlobalRelatedPosts() to return related + * posts from any site, or requestLocalRelatedPosts() to return related posts from the same + * site as the passed post */ - public static void requestRelatedPosts(final ReaderPost sourcePost) { + public static void requestGlobalRelatedPosts(ReaderPost sourcePost) { + requestRelatedPosts(sourcePost, 0, NUM_RELATED_POSTS_TO_REQUEST); + } + public static void requestLocalRelatedPosts(ReaderPost sourcePost) { + requestRelatedPosts(sourcePost, NUM_RELATED_POSTS_TO_REQUEST, 0); + } + private static void requestRelatedPosts(final ReaderPost sourcePost, int numLocal, int numGlobal) { if (sourcePost == null) return; RestRequest.Listener listener = new RestRequest.Listener() { @@ -360,7 +369,11 @@ public void onErrorResponse(VolleyError volleyError) { } }; - String path = "/read/site/" + sourcePost.blogId + "/post/" + sourcePost.postId + "/related"; + String path = "/read/site/" + sourcePost.blogId + + "/post/" + sourcePost.postId + + "/related?meta=site" + + "&size_local=" + numLocal + + "&size_global=" + numGlobal; WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); } From c29a20ac162ba48e51741b2735939aa4007cc7a6 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 12:10:30 -0400 Subject: [PATCH 02/41] Separate container views for local/global --- .../android/ui/reader/ReaderEvents.java | 10 ++++++- .../ui/reader/ReaderPostDetailFragment.java | 15 +++++++---- .../ui/reader/actions/ReaderPostActions.java | 27 ++++++++++--------- .../layout/reader_fragment_post_detail.xml | 24 ++++++++++++++--- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java index 676e40588ec5..c0618d45579a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java @@ -6,6 +6,7 @@ import org.wordpress.android.models.ReaderPostList; import org.wordpress.android.models.ReaderTag; import org.wordpress.android.ui.reader.actions.ReaderActions; +import org.wordpress.android.ui.reader.actions.ReaderPostActions.RelatedPostsType; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.ui.reader.services.ReaderPostService; import org.wordpress.android.util.StringUtils; @@ -121,9 +122,13 @@ public ReaderActions.UpdateResult getResult() { public static class RelatedPostsUpdated { private final ReaderPost mSourcePost; private final ReaderRelatedPostList mRelatedPosts; - public RelatedPostsUpdated(@NonNull ReaderPost sourcePost, @NonNull ReaderPostList relatedPosts) { + private final RelatedPostsType mRelatedPostsType; + public RelatedPostsUpdated(@NonNull ReaderPost sourcePost, + @NonNull ReaderPostList relatedPosts, + @NonNull RelatedPostsType relatedPostsType) { mSourcePost = sourcePost; mRelatedPosts = new ReaderRelatedPostList(relatedPosts); + mRelatedPostsType = relatedPostsType; } public ReaderPost getSourcePost() { return mSourcePost; @@ -131,5 +136,8 @@ public ReaderPost getSourcePost() { public ReaderRelatedPostList getRelatedPosts() { return mRelatedPosts; } + public RelatedPostsType getRelatedPostsType() { + return mRelatedPostsType; + } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 404de035debc..64a193bdf286 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -436,7 +436,8 @@ private void replacePost(long blogId, long postId) { */ private void requestRelatedPosts() { if (hasPost() && mPost.isWP()) { - ReaderPostActions.requestGlobalRelatedPosts(mPost); + ReaderPostActions.requestRelatedPosts(mPost, ReaderPostActions.RelatedPostsType.GLOBAL); + ReaderPostActions.requestRelatedPosts(mPost, ReaderPostActions.RelatedPostsType.LOCAL); } } @@ -448,14 +449,18 @@ public void onEventMainThread(ReaderEvents.RelatedPostsUpdated event) { if (!isAdded() || !hasPost()) return; // make sure this is for the current post - if (event.getSourcePost().postId == mPost.postId && event.getSourcePost().blogId == mPost.blogId) { - showRelatedPosts(event.getRelatedPosts()); + if (event.getSourcePost().postId == mPost.postId + && event.getSourcePost().blogId == mPost.blogId) { + showRelatedPosts(event.getRelatedPosts(), event.getRelatedPostsType()); } } - private void showRelatedPosts(@NonNull ReaderRelatedPostList relatedPosts) { + private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActions.RelatedPostsType relatedPostsType) { // locate the related posts container and remove any existing related post views - ViewGroup container = (ViewGroup) getView().findViewById(R.id.container_related_posts); + int containerId = (relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL + ? R.id.container_global_related_posts + : R.id.container_local_related_posts); + ViewGroup container = (ViewGroup) getView().findViewById(containerId); container.removeAllViews(); // add a separate view for each related post diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index 401b6e8fc7b7..47db80d85864 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -39,6 +39,10 @@ public class ReaderPostActions { private static final String TRACKING_REFERRER = "https://wordpress.com/"; private static final Random mRandom = new Random(); + + public enum RelatedPostsType { + LOCAL, GLOBAL + } private static final int NUM_RELATED_POSTS_TO_REQUEST = 2; private ReaderPostActions() { @@ -341,23 +345,17 @@ public Map getHeaders() throws AuthFailureError { } /* - * request posts related to the passed one, use requestGlobalRelatedPosts() to return related - * posts from any site, or requestLocalRelatedPosts() to return related posts from the same + * request posts related to the passed one, use RelatedPostsType.GLOBAL to return related + * posts from any site, or RelatedPostsType.LOCAL to return related posts from the same * site as the passed post */ - public static void requestGlobalRelatedPosts(ReaderPost sourcePost) { - requestRelatedPosts(sourcePost, 0, NUM_RELATED_POSTS_TO_REQUEST); - } - public static void requestLocalRelatedPosts(ReaderPost sourcePost) { - requestRelatedPosts(sourcePost, NUM_RELATED_POSTS_TO_REQUEST, 0); - } - private static void requestRelatedPosts(final ReaderPost sourcePost, int numLocal, int numGlobal) { + public static void requestRelatedPosts(final ReaderPost sourcePost, final RelatedPostsType relatedPostsType) { if (sourcePost == null) return; RestRequest.Listener listener = new RestRequest.Listener() { @Override public void onResponse(JSONObject jsonObject) { - handleRelatedPostsResponse(sourcePost, jsonObject); + handleRelatedPostsResponse(sourcePost, jsonObject, relatedPostsType); } }; RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() { @@ -369,6 +367,9 @@ public void onErrorResponse(VolleyError volleyError) { } }; + int numLocal = relatedPostsType == RelatedPostsType.LOCAL ? NUM_RELATED_POSTS_TO_REQUEST : 0; + int numGlobal = relatedPostsType == RelatedPostsType.GLOBAL ? NUM_RELATED_POSTS_TO_REQUEST : 0; + String path = "/read/site/" + sourcePost.blogId + "/post/" + sourcePost.postId + "/related?meta=site" @@ -377,7 +378,9 @@ public void onErrorResponse(VolleyError volleyError) { WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); } - private static void handleRelatedPostsResponse(final ReaderPost sourcePost, final JSONObject jsonObject) { + private static void handleRelatedPostsResponse(final ReaderPost sourcePost, + final JSONObject jsonObject, + final RelatedPostsType relatedPostsType) { if (jsonObject == null) return; new Thread() { @@ -386,7 +389,7 @@ public void run() { ReaderPostList relatedPosts = ReaderPostList.fromJson(jsonObject); if (relatedPosts != null && relatedPosts.size() > 0) { ReaderPostTable.addOrUpdatePosts(null, relatedPosts); - EventBus.getDefault().post(new ReaderEvents.RelatedPostsUpdated(sourcePost, relatedPosts)); + EventBus.getDefault().post(new ReaderEvents.RelatedPostsUpdated(sourcePost, relatedPosts, relatedPostsType)); } } }.start(); diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index e421e7e04c12..e0fcfe4ee2bf 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -70,10 +70,26 @@ android:layout_alignLeft="@+id/layout_post_detail_content" android:layout_alignRight="@+id/layout_post_detail_content" android:layout_below="@+id/text_related_posts_label" - android:background="@drawable/reader_related_posts_background" - android:orientation="vertical" - android:visibility="gone" - tools:visibility="visible" /> + android:orientation="vertical"> + + + + + Date: Fri, 7 Oct 2016 12:19:26 -0400 Subject: [PATCH 03/41] Separate label views for local/global --- .../ui/reader/ReaderPostDetailFragment.java | 15 +++--- .../layout/reader_fragment_post_detail.xml | 47 ++++++++++++------- WordPress/src/main/res/values/strings.xml | 3 +- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 64a193bdf286..a950e36dcd39 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; @@ -413,8 +412,10 @@ private void replacePost(long blogId, long postId) { // hide views that would show info for the previous post - these will be re-displayed // with the correct info once the new post loads - getView().findViewById(R.id.container_related_posts).setVisibility(View.GONE); - getView().findViewById(R.id.text_related_posts_label).setVisibility(View.GONE); + getView().findViewById(R.id.container_local_related_posts).setVisibility(View.GONE); + getView().findViewById(R.id.text_local_related_posts_label).setVisibility(View.GONE); + getView().findViewById(R.id.container_global_related_posts).setVisibility(View.GONE); + getView().findViewById(R.id.text_global_related_posts_label).setVisibility(View.GONE); mLikingUsersView.setVisibility(View.GONE); mLikingUsersDivider.setVisibility(View.GONE); @@ -457,9 +458,8 @@ public void onEventMainThread(ReaderEvents.RelatedPostsUpdated event) { private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActions.RelatedPostsType relatedPostsType) { // locate the related posts container and remove any existing related post views - int containerId = (relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL - ? R.id.container_global_related_posts - : R.id.container_local_related_posts); + boolean isGlobal = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL; + int containerId = isGlobal ? R.id.container_global_related_posts : R.id.container_local_related_posts; ViewGroup container = (ViewGroup) getView().findViewById(containerId); container.removeAllViews(); @@ -501,7 +501,8 @@ public void onClick(View view) { } } - View label = getView().findViewById(R.id.text_related_posts_label); + int labelId = isGlobal ? R.id.text_global_related_posts_label : R.id.text_local_related_posts_label; + View label = getView().findViewById(labelId); if (label.getVisibility() != View.VISIBLE) { AniUtils.fadeIn(label, AniUtils.Duration.MEDIUM); } diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index e0fcfe4ee2bf..89c3dbccfcc0 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -46,32 +46,29 @@ android:layout_marginLeft="@dimen/reader_detail_margin" android:layout_marginRight="@dimen/reader_detail_margin" /> - - + + + + Load more posts Search all public WordPress.com blogs Searching… - Related Reading + Related Reading + More on WordPress.com View Gallery 1 image %d images From 3dcc500a4afc9c8e7bb35590ed1175d83c6192e1 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 12:30:38 -0400 Subject: [PATCH 04/41] Reduce font size --- WordPress/src/main/res/layout/reader_fragment_post_detail.xml | 4 ++-- WordPress/src/main/res/layout/reader_related_post.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index 89c3dbccfcc0..2d1c224a72e4 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -64,7 +64,7 @@ android:text="@string/reader_label_local_related_posts" android:textAllCaps="true" android:textColor="@color/grey" - android:textSize="@dimen/text_sz_large" + android:textSize="@dimen/text_sz_medium" android:textStyle="bold" android:visibility="gone" tools:visibility="visible" /> @@ -87,7 +87,7 @@ android:text="@string/reader_label_global_related_posts" android:textAllCaps="true" android:textColor="@color/grey" - android:textSize="@dimen/text_sz_large" + android:textSize="@dimen/text_sz_medium" android:textStyle="bold" android:visibility="gone" tools:visibility="visible" /> diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 6f64e009f5eb..5fab75c0f79b 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -21,7 +21,7 @@ android:ellipsize="end" android:maxLines="2" android:textColor="@color/grey_dark" - android:textSize="@dimen/text_sz_large" + android:textSize="@dimen/text_sz_medium" android:textStyle="bold" app:wpFontFamily="merriweather" tools:text="text_related_post_title" /> @@ -33,7 +33,7 @@ android:ellipsize="end" android:maxLines="4" android:textColor="@color/grey_darken_10" - android:textSize="@dimen/text_sz_medium" + android:textSize="@dimen/text_sz_small" tools:text="text_related_post_byline" /> From bd55106d411afa119ea74a9ed739512f6b2d06f7 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 12:37:45 -0400 Subject: [PATCH 05/41] Show site name in local related posts --- .../android/ui/reader/ReaderPostDetailFragment.java | 6 +++++- WordPress/src/main/res/values/dimens.xml | 2 +- WordPress/src/main/res/values/strings.xml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index a950e36dcd39..d48ea8c5c242 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -501,8 +501,12 @@ public void onClick(View view) { } } + // make sure the label for these related posts is showing int labelId = isGlobal ? R.id.text_global_related_posts_label : R.id.text_local_related_posts_label; - View label = getView().findViewById(labelId); + TextView label = (TextView) getView().findViewById(labelId); + if (!isGlobal) { + label.setText(String.format(getString(R.string.reader_label_local_related_posts), mPost.getBlogName())); + } if (label.getVisibility() != View.VISIBLE) { AniUtils.fadeIn(label, AniUtils.Duration.MEDIUM); } diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index db202b68d6fd..9adfe6a82c51 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -87,7 +87,7 @@ 56dp 64dp - @dimen/margin_extra_large + @dimen/margin_large 48dp 48dp diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 6a866cab9494..504b2de77f55 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -1143,7 +1143,7 @@ Load more posts Search all public WordPress.com blogs Searching… - Related Reading + More in %s More on WordPress.com View Gallery 1 image From 6b0fa7b52e59a32ecd5999b3717de13177085946 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 12:41:27 -0400 Subject: [PATCH 06/41] No divider between related posts --- .../android/ui/reader/ReaderPostDetailFragment.java | 6 ------ .../src/main/res/layout/reader_related_post_divider.xml | 5 ----- 2 files changed, 11 deletions(-) delete mode 100644 WordPress/src/main/res/layout/reader_related_post_divider.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index d48ea8c5c242..f7459865562a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -493,12 +493,6 @@ public void onClick(View view) { }); container.addView(postView); - - // add a divider below all but the last related post - if (index < relatedPosts.size() - 1) { - View dividerView = inflater.inflate(R.layout.reader_related_post_divider, container, false); - container.addView(dividerView); - } } // make sure the label for these related posts is showing diff --git a/WordPress/src/main/res/layout/reader_related_post_divider.xml b/WordPress/src/main/res/layout/reader_related_post_divider.xml deleted file mode 100644 index 488260748d8a..000000000000 --- a/WordPress/src/main/res/layout/reader_related_post_divider.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file From 7f593dfd70d44763046516fb841c5c68cd1f4ca9 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 12:53:00 -0400 Subject: [PATCH 07/41] Show excerpt rather than byline --- .../android/ui/reader/ReaderPostDetailFragment.java | 4 ++-- .../android/ui/reader/models/ReaderRelatedPost.java | 10 ++++++++++ .../src/main/res/layout/reader_related_post.xml | 12 +++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index f7459865562a..54064812aee1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -471,11 +471,11 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi View postView = inflater.inflate(R.layout.reader_related_post, container, false); TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); - TextView txtByline = (TextView) postView.findViewById(R.id.text_related_post_byline); + TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_related_post); txtTitle.setText(relatedPost.getTitle()); - txtByline.setText(relatedPost.getByline()); + txtExcerpt.setText(relatedPost.getExcerpt()); imgFeatured.setVisibility(relatedPost.hasFeaturedImage() ? View.VISIBLE : View.GONE); if (relatedPost.hasFeaturedImage()) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index e959689087b3..54c7c977874c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -14,6 +14,7 @@ public class ReaderRelatedPost { private final long mBlogId; private final String mTitle; private final String mByline; + private final String mExcerpt; private final String mFeaturedImage; public ReaderRelatedPost(@NonNull ReaderPost post) { @@ -22,6 +23,7 @@ public ReaderRelatedPost(@NonNull ReaderPost post) { mTitle = post.getTitle(); mFeaturedImage = post.getFeaturedImage(); + mExcerpt = post.getExcerpt(); /* * we want to include the blog name in the byline when it's available, and most sites @@ -72,6 +74,14 @@ public String getTitle() { return mTitle; } + public String getExcerpt() { + return mExcerpt; + } + + public boolean hasExcerpt() { + return !TextUtils.isEmpty(mExcerpt); + } + public String getByline() { return mByline; } diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 5fab75c0f79b..caf3e5bbc71d 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -27,14 +27,16 @@ tools:text="text_related_post_title" /> + android:maxLines="3" + android:textColor="@color/grey_darken_20" + android:textSize="@dimen/text_sz_medium" + app:wpFontFamily="merriweather" + tools:text="text_related_post_excerpt" /> Date: Fri, 7 Oct 2016 13:01:53 -0400 Subject: [PATCH 08/41] Show byline only for global --- .../android/ui/reader/ReaderPostDetailFragment.java | 8 ++++++++ WordPress/src/main/res/layout/reader_related_post.xml | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 54064812aee1..6f22cfadfa59 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -472,11 +472,19 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi View postView = inflater.inflate(R.layout.reader_related_post, container, false); TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); + TextView txtByline = (TextView) postView.findViewById(R.id.text_related_post_byline); WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_related_post); txtTitle.setText(relatedPost.getTitle()); txtExcerpt.setText(relatedPost.getExcerpt()); + if (isGlobal) { + txtByline.setText(relatedPost.getByline()); + txtByline.setVisibility(View.VISIBLE); + } else { + txtByline.setVisibility(View.GONE); + } + imgFeatured.setVisibility(relatedPost.hasFeaturedImage() ? View.VISIBLE : View.GONE); if (relatedPost.hasFeaturedImage()) { String imageUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImage(), imageSize, imageSize); diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index caf3e5bbc71d..a1c6ed4f99ef 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -26,6 +26,16 @@ app:wpFontFamily="merriweather" tools:text="text_related_post_title" /> + + Date: Fri, 7 Oct 2016 15:31:11 -0400 Subject: [PATCH 09/41] Simplify related posts by only requesting & parsing necessary fields --- .../android/ui/reader/ReaderEvents.java | 5 +- .../ui/reader/ReaderPostDetailFragment.java | 11 +- .../ui/reader/actions/ReaderPostActions.java | 12 +-- .../ui/reader/models/ReaderRelatedPost.java | 101 ++++++++---------- .../reader/models/ReaderRelatedPostList.java | 22 ++-- .../layout/reader_fragment_post_detail.xml | 4 +- .../reader_include_post_detail_content.xml | 2 +- .../main/res/layout/reader_related_post.xml | 10 -- WordPress/src/main/res/values/dimens.xml | 2 +- 9 files changed, 75 insertions(+), 94 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java index c0618d45579a..9ad62a541778 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java @@ -3,7 +3,6 @@ import android.support.annotation.NonNull; import org.wordpress.android.models.ReaderPost; -import org.wordpress.android.models.ReaderPostList; import org.wordpress.android.models.ReaderTag; import org.wordpress.android.ui.reader.actions.ReaderActions; import org.wordpress.android.ui.reader.actions.ReaderPostActions.RelatedPostsType; @@ -124,10 +123,10 @@ public static class RelatedPostsUpdated { private final ReaderRelatedPostList mRelatedPosts; private final RelatedPostsType mRelatedPostsType; public RelatedPostsUpdated(@NonNull ReaderPost sourcePost, - @NonNull ReaderPostList relatedPosts, + @NonNull ReaderRelatedPostList relatedPosts, @NonNull RelatedPostsType relatedPostsType) { mSourcePost = sourcePost; - mRelatedPosts = new ReaderRelatedPostList(relatedPosts); + mRelatedPosts = relatedPosts; mRelatedPostsType = relatedPostsType; } public ReaderPost getSourcePost() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 6f22cfadfa59..c1d9dec2be56 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -472,24 +472,17 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi View postView = inflater.inflate(R.layout.reader_related_post, container, false); TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); - TextView txtByline = (TextView) postView.findViewById(R.id.text_related_post_byline); WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_related_post); txtTitle.setText(relatedPost.getTitle()); txtExcerpt.setText(relatedPost.getExcerpt()); - if (isGlobal) { - txtByline.setText(relatedPost.getByline()); - txtByline.setVisibility(View.VISIBLE); - } else { - txtByline.setVisibility(View.GONE); - } - - imgFeatured.setVisibility(relatedPost.hasFeaturedImage() ? View.VISIBLE : View.GONE); if (relatedPost.hasFeaturedImage()) { String imageUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImage(), imageSize, imageSize); imgFeatured.setImageUrl(imageUrl, WPNetworkImageView.ImageType.PHOTO_ROUNDED); imgFeatured.setVisibility(View.VISIBLE); + } else { + imgFeatured.setVisibility(View.GONE); } // tapping this view should open the related post detail diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index 47db80d85864..597f944f9b8b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -17,12 +17,12 @@ import org.wordpress.android.datasets.ReaderPostTable; import org.wordpress.android.datasets.ReaderUserTable; import org.wordpress.android.models.ReaderPost; -import org.wordpress.android.models.ReaderPostList; import org.wordpress.android.models.ReaderUserIdList; import org.wordpress.android.models.ReaderUserList; import org.wordpress.android.ui.reader.ReaderEvents; import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResult; import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResultListener; +import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; import org.wordpress.android.util.JSONUtils; @@ -372,9 +372,10 @@ public void onErrorResponse(VolleyError volleyError) { String path = "/read/site/" + sourcePost.blogId + "/post/" + sourcePost.postId - + "/related?meta=site" - + "&size_local=" + numLocal - + "&size_global=" + numGlobal; + + "/related" + + "?size_local=" + numLocal + + "&size_global=" + numGlobal + + "&fields=ID,site_ID,title,excerpt,URL,author,date,site_name,site_URL,attachments"; WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); } @@ -386,9 +387,8 @@ private static void handleRelatedPostsResponse(final ReaderPost sourcePost, new Thread() { @Override public void run() { - ReaderPostList relatedPosts = ReaderPostList.fromJson(jsonObject); + ReaderRelatedPostList relatedPosts = ReaderRelatedPostList.fromJson(jsonObject); if (relatedPosts != null && relatedPosts.size() > 0) { - ReaderPostTable.addOrUpdatePosts(null, relatedPosts); EventBus.getDefault().post(new ReaderEvents.RelatedPostsUpdated(sourcePost, relatedPosts, relatedPostsType)); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index 54c7c977874c..b11f408c4f78 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -3,63 +3,50 @@ import android.support.annotation.NonNull; import android.text.TextUtils; -import org.wordpress.android.models.ReaderPost; -import org.wordpress.android.util.UrlUtils; +import org.json.JSONObject; +import org.wordpress.android.ui.reader.ReaderConstants; +import org.wordpress.android.ui.reader.utils.ImageSizeMap; +import org.wordpress.android.util.HtmlUtils; +import org.wordpress.android.util.JSONUtils; /** * simplified version of a reader post that contains only the fields necessary for a related post */ public class ReaderRelatedPost { - private final long mPostId; - private final long mBlogId; - private final String mTitle; - private final String mByline; - private final String mExcerpt; - private final String mFeaturedImage; - - public ReaderRelatedPost(@NonNull ReaderPost post) { - mPostId = post.postId; - mBlogId = post.blogId; - - mTitle = post.getTitle(); - mFeaturedImage = post.getFeaturedImage(); - mExcerpt = post.getExcerpt(); - - /* - * we want to include the blog name in the byline when it's available, and most sites - * will have a name, but in rare cases there isn't one so we show the domain instead - */ - String blogNameOrDomain; - boolean hasBlogNameOrDomain; - if (post.hasBlogName()) { - blogNameOrDomain = post.getBlogName(); - hasBlogNameOrDomain = true; - } else if (post.hasBlogUrl()) { - blogNameOrDomain = UrlUtils.getHost(post.getBlogUrl()); - hasBlogNameOrDomain = true; - } else { - blogNameOrDomain = null; - hasBlogNameOrDomain = false; + private long mPostId; + private long mBlogId; + private String mTitle; + private String mAuthorName; + private String mExcerpt; + private String mFeaturedImage; + private String mSiteName; + private String mPubDate; + + public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { + ReaderRelatedPost post = new ReaderRelatedPost(); + + post.mPostId = json.optLong("ID"); + post.mBlogId = json.optLong("site_ID"); + + post.mTitle = JSONUtils.getStringDecoded(json, "title"); + post.mExcerpt = HtmlUtils.fastStripHtml(JSONUtils.getString(json, "excerpt")).trim(); + post.mFeaturedImage = JSONUtils.getString(json, "featured_image"); + post.mSiteName = JSONUtils.getStringDecoded(json, "site_name"); + post.mPubDate = JSONUtils.getString(json, "date"); + + JSONObject jsonAuthor = json.optJSONObject("author"); + if (jsonAuthor != null) { + post.mAuthorName = JSONUtils.getStringDecoded(jsonAuthor, "name"); } - /* - * The byline should show the author name and blog name if both are available, but if - * they're the same (which happens frequently) we only need to show the blog name. - * Otherwise, show either the blog name or author name depending on which is available. - */ - if (post.hasAuthorName() && hasBlogNameOrDomain) { - if (post.getAuthorName().equalsIgnoreCase(blogNameOrDomain)) { - mByline = blogNameOrDomain; - } else { - mByline = post.getAuthorName() + ", " + blogNameOrDomain; - } - } else if (post.hasAuthorName()) { - mByline = post.getAuthorName(); - } else if (hasBlogNameOrDomain) { - mByline = blogNameOrDomain; - } else { - mByline = ""; + // if we don't have a featured image, check whethe we can find a suitable image from the attachments + if (!post.hasFeaturedImage() && json.has("attachments")) { + JSONObject jsonAttachments = json.optJSONObject("attachments"); + post.mFeaturedImage = new ImageSizeMap(jsonAttachments.toString()) + .getLargestImageUrl(ReaderConstants.MIN_FEATURED_IMAGE_WIDTH); } + + return post; } public long getPostId() { @@ -78,19 +65,23 @@ public String getExcerpt() { return mExcerpt; } - public boolean hasExcerpt() { - return !TextUtils.isEmpty(mExcerpt); - } - - public String getByline() { - return mByline; + public String getAuthorName() { + return mAuthorName; } public String getFeaturedImage() { return mFeaturedImage; } + public boolean hasExcerpt() { + return !TextUtils.isEmpty(mExcerpt); + } + public boolean hasFeaturedImage() { return !TextUtils.isEmpty(mFeaturedImage); } + + public boolean hasAuthorName() { + return !TextUtils.isEmpty(mAuthorName); + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPostList.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPostList.java index 94c1d5b5aace..acba8eaf30c3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPostList.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPostList.java @@ -1,18 +1,26 @@ package org.wordpress.android.ui.reader.models; -import android.support.annotation.NonNull; - -import org.wordpress.android.models.ReaderPost; -import org.wordpress.android.models.ReaderPostList; +import org.json.JSONArray; +import org.json.JSONObject; import java.util.ArrayList; public class ReaderRelatedPostList extends ArrayList { - public ReaderRelatedPostList(@NonNull ReaderPostList posts) { - for (ReaderPost post: posts) { - add(new ReaderRelatedPost(post)); + public static ReaderRelatedPostList fromJson(JSONObject json) { + if (json == null) { + throw new IllegalArgumentException("null json related post list"); + } + + ReaderRelatedPostList posts = new ReaderRelatedPostList(); + JSONArray jsonPosts = json.optJSONArray("posts"); + if (jsonPosts != null) { + for (int i = 0; i < jsonPosts.length(); i++) { + posts.add(ReaderRelatedPost.fromJson(jsonPosts.optJSONObject(i))); + } } + + return posts; } } diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index 2d1c224a72e4..afc1b224852d 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -59,7 +59,7 @@ android:id="@+id/text_local_related_posts_label" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/reader_related_post_margin" + android:layout_marginBottom="@dimen/margin_large" android:layout_marginTop="@dimen/reader_related_post_margin" android:text="@string/reader_label_local_related_posts" android:textAllCaps="true" @@ -82,7 +82,7 @@ android:id="@+id/text_global_related_posts_label" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/reader_related_post_margin" + android:layout_marginBottom="@dimen/margin_large" android:layout_marginTop="@dimen/reader_related_post_margin" android:text="@string/reader_label_global_related_posts" android:textAllCaps="true" diff --git a/WordPress/src/main/res/layout/reader_include_post_detail_content.xml b/WordPress/src/main/res/layout/reader_include_post_detail_content.xml index 0bf45250381f..b9a43aa29622 100644 --- a/WordPress/src/main/res/layout/reader_include_post_detail_content.xml +++ b/WordPress/src/main/res/layout/reader_include_post_detail_content.xml @@ -46,7 +46,7 @@ android:text="@string/reader_label_liked_by" android:textAllCaps="true" android:textColor="@color/grey" - android:textSize="@dimen/text_sz_large" + android:textSize="@dimen/text_sz_medium" android:textStyle="bold" android:visibility="gone" tools:visibility="visible" /> diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index a1c6ed4f99ef..caf3e5bbc71d 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -26,16 +26,6 @@ app:wpFontFamily="merriweather" tools:text="text_related_post_title" /> - - 56dp 64dp - @dimen/margin_large + @dimen/margin_extra_large 48dp 48dp From d65c1244e40b32703e5d6d65595d29f3146ba312 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 15:38:15 -0400 Subject: [PATCH 10/41] Flattened heirarchy or related post view --- .../main/res/layout/reader_related_post.xml | 51 ++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index caf3e5bbc71d..85afefe696d5 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -7,44 +7,37 @@ android:background="?android:selectableItemBackground" android:padding="@dimen/reader_related_post_margin"> - - - + android:ellipsize="end" + android:maxLines="2" + android:textColor="@color/grey_dark" + android:textSize="@dimen/text_sz_medium" + android:textStyle="bold" + app:wpFontFamily="merriweather" + tools:text="text_related_post_title" /> - - + Date: Fri, 7 Oct 2016 16:06:20 -0400 Subject: [PATCH 11/41] First pass at site header for global related posts --- .../ui/reader/ReaderPostDetailFragment.java | 31 +++++++++- .../ui/reader/models/ReaderRelatedPost.java | 14 +++++ .../main/res/layout/reader_related_post.xml | 61 +++++++++++++++---- 3 files changed, 93 insertions(+), 13 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index c1d9dec2be56..3e81dbd91de1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -463,9 +463,11 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi ViewGroup container = (ViewGroup) getView().findViewById(containerId); container.removeAllViews(); + int imageSize = DisplayUtils.dpToPx(getActivity(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_size)); + int avatarSize = DisplayUtils.dpToPx(getActivity(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small)); + // add a separate view for each related post LayoutInflater inflater = LayoutInflater.from(getActivity()); - int imageSize = DisplayUtils.dpToPx(getActivity(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_size)); for (int index = 0; index < relatedPosts.size(); index++) { final ReaderRelatedPost relatedPost = relatedPosts.get(index); @@ -473,9 +475,16 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_related_post); + View siteHeader = postView.findViewById(R.id.layout_related_post_site_header); txtTitle.setText(relatedPost.getTitle()); - txtExcerpt.setText(relatedPost.getExcerpt()); + + if (relatedPost.hasExcerpt()) { + txtExcerpt.setText(relatedPost.getExcerpt()); + txtExcerpt.setVisibility(View.VISIBLE); + } else { + txtExcerpt.setVisibility(View.GONE); + } if (relatedPost.hasFeaturedImage()) { String imageUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImage(), imageSize, imageSize); @@ -485,6 +494,24 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi imgFeatured.setVisibility(View.GONE); } + // site header only appears for global posts + if (isGlobal) { + WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); + TextView txtSiteName = (TextView) siteHeader.findViewById(R.id.text_site_name); + TextView txtAuthorName = (TextView) siteHeader.findViewById(R.id.text_author_name); + txtSiteName.setText(relatedPost.getSiteName()); + txtAuthorName.setText(relatedPost.getAuthorName()); + if (relatedPost.hasAuthorAvatarUrl()) { + String avatarUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getAuthorAvatarUrl(), avatarSize, avatarSize); + imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); + } else { + imgAvatar.showDefaultGravatarImage(); + } + siteHeader.setVisibility(View.VISIBLE); + } else { + siteHeader.setVisibility(View.GONE); + } + // tapping this view should open the related post detail postView.setOnClickListener(new View.OnClickListener() { @Override diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index b11f408c4f78..7c8554e7fbae 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -17,6 +17,7 @@ public class ReaderRelatedPost { private long mBlogId; private String mTitle; private String mAuthorName; + private String mAuthorAvatarUrl; private String mExcerpt; private String mFeaturedImage; private String mSiteName; @@ -37,6 +38,7 @@ public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { JSONObject jsonAuthor = json.optJSONObject("author"); if (jsonAuthor != null) { post.mAuthorName = JSONUtils.getStringDecoded(jsonAuthor, "name"); + post.mAuthorAvatarUrl = JSONUtils.getString(jsonAuthor, "avatar_URL"); } // if we don't have a featured image, check whethe we can find a suitable image from the attachments @@ -65,10 +67,18 @@ public String getExcerpt() { return mExcerpt; } + public String getSiteName() { + return mSiteName; + } + public String getAuthorName() { return mAuthorName; } + public String getAuthorAvatarUrl() { + return mAuthorAvatarUrl; + } + public String getFeaturedImage() { return mFeaturedImage; } @@ -84,4 +94,8 @@ public boolean hasFeaturedImage() { public boolean hasAuthorName() { return !TextUtils.isEmpty(mAuthorName); } + + public boolean hasAuthorAvatarUrl() { + return !TextUtils.isEmpty(mAuthorAvatarUrl); + } } diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 85afefe696d5..1c76b4982d37 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -7,10 +7,58 @@ android:background="?android:selectableItemBackground" android:padding="@dimen/reader_related_post_margin"> + + + + + + + + + + + + - \ No newline at end of file From acd35fdd43784a223da69d044736b8474dea4023 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 16:15:40 -0400 Subject: [PATCH 12/41] Removed featured image --- .../ui/reader/ReaderPostDetailFragment.java | 12 +------- .../ui/reader/actions/ReaderPostActions.java | 2 +- .../ui/reader/models/ReaderRelatedPost.java | 30 +++---------------- .../main/res/layout/reader_related_post.xml | 13 -------- 4 files changed, 6 insertions(+), 51 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 3e81dbd91de1..6bfe63089b3e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -463,7 +463,6 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi ViewGroup container = (ViewGroup) getView().findViewById(containerId); container.removeAllViews(); - int imageSize = DisplayUtils.dpToPx(getActivity(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_size)); int avatarSize = DisplayUtils.dpToPx(getActivity(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small)); // add a separate view for each related post @@ -474,7 +473,6 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi View postView = inflater.inflate(R.layout.reader_related_post, container, false); TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); - WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_related_post); View siteHeader = postView.findViewById(R.id.layout_related_post_site_header); txtTitle.setText(relatedPost.getTitle()); @@ -486,14 +484,6 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi txtExcerpt.setVisibility(View.GONE); } - if (relatedPost.hasFeaturedImage()) { - String imageUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImage(), imageSize, imageSize); - imgFeatured.setImageUrl(imageUrl, WPNetworkImageView.ImageType.PHOTO_ROUNDED); - imgFeatured.setVisibility(View.VISIBLE); - } else { - imgFeatured.setVisibility(View.GONE); - } - // site header only appears for global posts if (isGlobal) { WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); @@ -516,7 +506,7 @@ private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActi postView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - showRelatedPostDetail(relatedPost.getBlogId(), relatedPost.getPostId()); + showRelatedPostDetail(relatedPost.getSiteId(), relatedPost.getPostId()); } }); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index 597f944f9b8b..96a2ce66b6ea 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -375,7 +375,7 @@ public void onErrorResponse(VolleyError volleyError) { + "/related" + "?size_local=" + numLocal + "&size_global=" + numGlobal - + "&fields=ID,site_ID,title,excerpt,URL,author,date,site_name,site_URL,attachments"; + + "&fields=ID,site_ID,title,excerpt,URL,author,site_name,site_URL"; WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index 7c8554e7fbae..55c8db6d18c8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -4,8 +4,6 @@ import android.text.TextUtils; import org.json.JSONObject; -import org.wordpress.android.ui.reader.ReaderConstants; -import org.wordpress.android.ui.reader.utils.ImageSizeMap; import org.wordpress.android.util.HtmlUtils; import org.wordpress.android.util.JSONUtils; @@ -14,26 +12,21 @@ */ public class ReaderRelatedPost { private long mPostId; - private long mBlogId; + private long mSiteId; private String mTitle; private String mAuthorName; private String mAuthorAvatarUrl; private String mExcerpt; - private String mFeaturedImage; private String mSiteName; - private String mPubDate; public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { ReaderRelatedPost post = new ReaderRelatedPost(); post.mPostId = json.optLong("ID"); - post.mBlogId = json.optLong("site_ID"); - + post.mSiteId = json.optLong("site_ID"); post.mTitle = JSONUtils.getStringDecoded(json, "title"); post.mExcerpt = HtmlUtils.fastStripHtml(JSONUtils.getString(json, "excerpt")).trim(); - post.mFeaturedImage = JSONUtils.getString(json, "featured_image"); post.mSiteName = JSONUtils.getStringDecoded(json, "site_name"); - post.mPubDate = JSONUtils.getString(json, "date"); JSONObject jsonAuthor = json.optJSONObject("author"); if (jsonAuthor != null) { @@ -41,13 +34,6 @@ public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { post.mAuthorAvatarUrl = JSONUtils.getString(jsonAuthor, "avatar_URL"); } - // if we don't have a featured image, check whethe we can find a suitable image from the attachments - if (!post.hasFeaturedImage() && json.has("attachments")) { - JSONObject jsonAttachments = json.optJSONObject("attachments"); - post.mFeaturedImage = new ImageSizeMap(jsonAttachments.toString()) - .getLargestImageUrl(ReaderConstants.MIN_FEATURED_IMAGE_WIDTH); - } - return post; } @@ -55,8 +41,8 @@ public long getPostId() { return mPostId; } - public long getBlogId() { - return mBlogId; + public long getSiteId() { + return mSiteId; } public String getTitle() { @@ -79,18 +65,10 @@ public String getAuthorAvatarUrl() { return mAuthorAvatarUrl; } - public String getFeaturedImage() { - return mFeaturedImage; - } - public boolean hasExcerpt() { return !TextUtils.isEmpty(mExcerpt); } - public boolean hasFeaturedImage() { - return !TextUtils.isEmpty(mFeaturedImage); - } - public boolean hasAuthorName() { return !TextUtils.isEmpty(mAuthorName); } diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 1c76b4982d37..eb7c44ea1368 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -7,21 +7,11 @@ android:background="?android:selectableItemBackground" android:padding="@dimen/reader_related_post_margin"> - - @@ -58,7 +48,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/layout_related_post_site_header" - android:layout_toRightOf="@+id/image_related_post" android:ellipsize="end" android:maxLines="2" android:textColor="@color/grey_dark" @@ -73,7 +62,6 @@ android:layout_height="wrap_content" android:layout_below="@+id/text_related_post_title" android:layout_marginTop="@dimen/margin_small" - android:layout_toRightOf="@+id/image_related_post" android:ellipsize="end" android:maxLines="3" android:textColor="@color/grey_darken_20" @@ -81,5 +69,4 @@ app:wpFontFamily="merriweather" tools:text="text_related_post_excerpt" /> - \ No newline at end of file From 515b8173f814f46d34f1e8d34d7ec46e77291919 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 16:37:09 -0400 Subject: [PATCH 13/41] Moved related posts to a separate view object --- .../ui/reader/ReaderPostDetailFragment.java | 82 ++---------- .../reader/views/ReaderRelatedPostsView.java | 126 ++++++++++++++++++ .../layout/reader_fragment_post_detail.xml | 39 +----- .../main/res/layout/reader_related_post.xml | 5 + .../res/layout/reader_related_posts_view.xml | 30 +++++ 5 files changed, 174 insertions(+), 108 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java create mode 100644 WordPress/src/main/res/layout/reader_related_posts_view.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 6bfe63089b3e..0eede35f1a4a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -33,13 +33,13 @@ import org.wordpress.android.ui.reader.actions.ReaderActions; import org.wordpress.android.ui.reader.actions.ReaderPostActions; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId; -import org.wordpress.android.ui.reader.models.ReaderRelatedPost; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.ui.reader.utils.ReaderUtils; import org.wordpress.android.ui.reader.utils.ReaderVideoUtils; import org.wordpress.android.ui.reader.views.ReaderIconCountView; import org.wordpress.android.ui.reader.views.ReaderLikingUsersView; import org.wordpress.android.ui.reader.views.ReaderPostDetailHeaderView; +import org.wordpress.android.ui.reader.views.ReaderRelatedPostsView; import org.wordpress.android.ui.reader.views.ReaderTagStrip; import org.wordpress.android.ui.reader.views.ReaderWebView; import org.wordpress.android.ui.reader.views.ReaderWebView.ReaderCustomViewListener; @@ -50,9 +50,7 @@ import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; import org.wordpress.android.util.DateTimeUtils; -import org.wordpress.android.util.DisplayUtils; import org.wordpress.android.util.NetworkUtils; -import org.wordpress.android.util.PhotonUtils; import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.UrlUtils; import org.wordpress.android.util.helpers.SwipeToRefreshHelper; @@ -412,10 +410,8 @@ private void replacePost(long blogId, long postId) { // hide views that would show info for the previous post - these will be re-displayed // with the correct info once the new post loads - getView().findViewById(R.id.container_local_related_posts).setVisibility(View.GONE); - getView().findViewById(R.id.text_local_related_posts_label).setVisibility(View.GONE); - getView().findViewById(R.id.container_global_related_posts).setVisibility(View.GONE); - getView().findViewById(R.id.text_global_related_posts_label).setVisibility(View.GONE); + getView().findViewById(R.id.related_posts_view_local).setVisibility(View.GONE); + getView().findViewById(R.id.related_posts_view_global).setVisibility(View.GONE); mLikingUsersView.setVisibility(View.GONE); mLikingUsersDivider.setVisibility(View.GONE); @@ -457,73 +453,13 @@ public void onEventMainThread(ReaderEvents.RelatedPostsUpdated event) { } private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActions.RelatedPostsType relatedPostsType) { - // locate the related posts container and remove any existing related post views - boolean isGlobal = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL; - int containerId = isGlobal ? R.id.container_global_related_posts : R.id.container_local_related_posts; - ViewGroup container = (ViewGroup) getView().findViewById(containerId); - container.removeAllViews(); + int id = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL + ? R.id.related_posts_view_global : R.id.related_posts_view_local; + ReaderRelatedPostsView view = (ReaderRelatedPostsView) getView().findViewById(id); + view.showRelatedPosts(relatedPosts, relatedPostsType, mPost.getBlogName()); - int avatarSize = DisplayUtils.dpToPx(getActivity(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small)); - - // add a separate view for each related post - LayoutInflater inflater = LayoutInflater.from(getActivity()); - for (int index = 0; index < relatedPosts.size(); index++) { - final ReaderRelatedPost relatedPost = relatedPosts.get(index); - - View postView = inflater.inflate(R.layout.reader_related_post, container, false); - TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); - TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); - View siteHeader = postView.findViewById(R.id.layout_related_post_site_header); - - txtTitle.setText(relatedPost.getTitle()); - - if (relatedPost.hasExcerpt()) { - txtExcerpt.setText(relatedPost.getExcerpt()); - txtExcerpt.setVisibility(View.VISIBLE); - } else { - txtExcerpt.setVisibility(View.GONE); - } - - // site header only appears for global posts - if (isGlobal) { - WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); - TextView txtSiteName = (TextView) siteHeader.findViewById(R.id.text_site_name); - TextView txtAuthorName = (TextView) siteHeader.findViewById(R.id.text_author_name); - txtSiteName.setText(relatedPost.getSiteName()); - txtAuthorName.setText(relatedPost.getAuthorName()); - if (relatedPost.hasAuthorAvatarUrl()) { - String avatarUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getAuthorAvatarUrl(), avatarSize, avatarSize); - imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); - } else { - imgAvatar.showDefaultGravatarImage(); - } - siteHeader.setVisibility(View.VISIBLE); - } else { - siteHeader.setVisibility(View.GONE); - } - - // tapping this view should open the related post detail - postView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - showRelatedPostDetail(relatedPost.getSiteId(), relatedPost.getPostId()); - } - }); - - container.addView(postView); - } - - // make sure the label for these related posts is showing - int labelId = isGlobal ? R.id.text_global_related_posts_label : R.id.text_local_related_posts_label; - TextView label = (TextView) getView().findViewById(labelId); - if (!isGlobal) { - label.setText(String.format(getString(R.string.reader_label_local_related_posts), mPost.getBlogName())); - } - if (label.getVisibility() != View.VISIBLE) { - AniUtils.fadeIn(label, AniUtils.Duration.MEDIUM); - } - if (container.getVisibility() != View.VISIBLE) { - AniUtils.fadeIn(container, AniUtils.Duration.MEDIUM); + if (view.getVisibility() != View.VISIBLE) { + AniUtils.fadeIn(view, AniUtils.Duration.MEDIUM); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java new file mode 100644 index 000000000000..671a6ff29cd2 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -0,0 +1,126 @@ +package org.wordpress.android.ui.reader.views; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.ui.reader.actions.ReaderPostActions; +import org.wordpress.android.ui.reader.actions.ReaderPostActions.RelatedPostsType; +import org.wordpress.android.ui.reader.models.ReaderRelatedPost; +import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; +import org.wordpress.android.util.DisplayUtils; +import org.wordpress.android.util.PhotonUtils; +import org.wordpress.android.widgets.WPNetworkImageView; + +/** + * used by the detail view to display related posts, which can be either local (related posts + * from the same site as the source posts) or global (related posts from across wp.com) + */ +public class ReaderRelatedPostsView extends LinearLayout { + + public ReaderRelatedPostsView(Context context) { + super(context); + initView(context); + } + + public ReaderRelatedPostsView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + public ReaderRelatedPostsView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public ReaderRelatedPostsView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + initView(context); + } + + private void initView(Context context) { + inflate(context, R.layout.reader_related_posts_view, this); + } + + public void showRelatedPosts(ReaderRelatedPostList relatedPosts, + RelatedPostsType relatedPostsType, + String siteName) { + + if (relatedPosts.size() == 0) { + setVisibility(View.GONE); + return; + } + + ViewGroup container = (ViewGroup) findViewById(R.id.container_related_posts); + container.removeAllViews(); + + int avatarSize = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small)); + boolean isGlobal = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL; + + // add a separate view for each related post + LayoutInflater inflater = LayoutInflater.from(getContext()); + for (int index = 0; index < relatedPosts.size(); index++) { + final ReaderRelatedPost relatedPost = relatedPosts.get(index); + + View postView = inflater.inflate(R.layout.reader_related_post, container, false); + TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); + TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); + View siteHeader = postView.findViewById(R.id.layout_related_post_site_header); + + txtTitle.setText(relatedPost.getTitle()); + + if (relatedPost.hasExcerpt()) { + txtExcerpt.setText(relatedPost.getExcerpt()); + txtExcerpt.setVisibility(View.VISIBLE); + } else { + txtExcerpt.setVisibility(View.GONE); + } + + // site header only appears for global posts + if (isGlobal) { + WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); + TextView txtSiteName = (TextView) siteHeader.findViewById(R.id.text_site_name); + TextView txtAuthorName = (TextView) siteHeader.findViewById(R.id.text_author_name); + txtSiteName.setText(relatedPost.getSiteName()); + txtAuthorName.setText(relatedPost.getAuthorName()); + if (relatedPost.hasAuthorAvatarUrl()) { + String avatarUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getAuthorAvatarUrl(), avatarSize, avatarSize); + imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); + } else { + imgAvatar.showDefaultGravatarImage(); + } + siteHeader.setVisibility(View.VISIBLE); + } else { + siteHeader.setVisibility(View.GONE); + } + + // tapping this view should open the related post detail + postView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + // TODO + //showRelatedPostDetail(relatedPost.getSiteId(), relatedPost.getPostId()); + } + }); + + container.addView(postView); + } + + // make sure the label for these related posts is showing + TextView label = (TextView) findViewById(R.id.text_related_posts_label); + if (isGlobal) { + label.setText(getContext().getString(R.string.reader_label_global_related_posts)); + } else { + label.setText(String.format(getContext().getString(R.string.reader_label_local_related_posts), siteName)); + } + } + +} diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index afc1b224852d..82036600aefb 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -55,51 +55,20 @@ android:layout_below="@+id/layout_post_detail_content" android:orientation="vertical"> - - - - - + + + + + + + + + + + \ No newline at end of file From de88c29ebc8fd10f4722a4604fee24bc1ed2d6b3 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 16:46:44 -0400 Subject: [PATCH 14/41] Re-implemented click listener --- .../ui/reader/ReaderPostDetailFragment.java | 27 +++++++++++-------- .../reader/views/ReaderRelatedPostsView.java | 16 ++++++++--- .../layout/reader_fragment_post_detail.xml | 2 ++ .../res/layout/reader_related_posts_view.xml | 4 +-- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 0eede35f1a4a..5bb3e420a524 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -33,7 +33,6 @@ import org.wordpress.android.ui.reader.actions.ReaderActions; import org.wordpress.android.ui.reader.actions.ReaderPostActions; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId; -import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.ui.reader.utils.ReaderUtils; import org.wordpress.android.ui.reader.utils.ReaderVideoUtils; import org.wordpress.android.ui.reader.views.ReaderIconCountView; @@ -446,20 +445,26 @@ public void onEventMainThread(ReaderEvents.RelatedPostsUpdated event) { if (!isAdded() || !hasPost()) return; // make sure this is for the current post - if (event.getSourcePost().postId == mPost.postId - && event.getSourcePost().blogId == mPost.blogId) { - showRelatedPosts(event.getRelatedPosts(), event.getRelatedPostsType()); + if (event.getSourcePost().postId != mPost.postId || event.getSourcePost().blogId != mPost.blogId) { + return; } - } - private void showRelatedPosts(ReaderRelatedPostList relatedPosts, ReaderPostActions.RelatedPostsType relatedPostsType) { - int id = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL + // different container views for global/local related posts + int id = event.getRelatedPostsType() == ReaderPostActions.RelatedPostsType.GLOBAL ? R.id.related_posts_view_global : R.id.related_posts_view_local; - ReaderRelatedPostsView view = (ReaderRelatedPostsView) getView().findViewById(id); - view.showRelatedPosts(relatedPosts, relatedPostsType, mPost.getBlogName()); + ReaderRelatedPostsView relatedPostsView = (ReaderRelatedPostsView) getView().findViewById(id); + relatedPostsView.showRelatedPosts(event.getRelatedPosts(), event.getRelatedPostsType(), mPost.getBlogName()); + + // tapping a related posts should open the related post detail + relatedPostsView.setOnRelatedPostClickListener(new ReaderRelatedPostsView.OnRelatedPostClickListener() { + @Override + public void onRelatedPostClick(View v, long siteId, long postId) { + showRelatedPostDetail(siteId, postId); + } + }); - if (view.getVisibility() != View.VISIBLE) { - AniUtils.fadeIn(view, AniUtils.Duration.MEDIUM); + if (relatedPostsView.getVisibility() != View.VISIBLE) { + AniUtils.fadeIn(relatedPostsView, AniUtils.Duration.MEDIUM); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index 671a6ff29cd2..8a7b3de316e9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -25,6 +25,12 @@ */ public class ReaderRelatedPostsView extends LinearLayout { + public interface OnRelatedPostClickListener { + void onRelatedPostClick(View v, long siteId, long postId); + } + + private OnRelatedPostClickListener mClickListener; + public ReaderRelatedPostsView(Context context) { super(context); initView(context); @@ -50,6 +56,10 @@ private void initView(Context context) { inflate(context, R.layout.reader_related_posts_view, this); } + public void setOnRelatedPostClickListener(OnRelatedPostClickListener listener) { + mClickListener = listener; + } + public void showRelatedPosts(ReaderRelatedPostList relatedPosts, RelatedPostsType relatedPostsType, String siteName) { @@ -102,12 +112,12 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, siteHeader.setVisibility(View.GONE); } - // tapping this view should open the related post detail postView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - // TODO - //showRelatedPostDetail(relatedPost.getSiteId(), relatedPost.getPostId()); + if (mClickListener != null) { + mClickListener.onRelatedPostClick(view, relatedPost.getSiteId(), relatedPost.getPostId()); + } } }); diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index 82036600aefb..c823224f558b 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -59,6 +59,7 @@ android:id="@+id/related_posts_view_local" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/reader_related_post_margin" android:visibility="gone" tools:visibility="visible" /> @@ -66,6 +67,7 @@ android:id="@+id/related_posts_view_global" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/reader_related_post_margin" android:visibility="gone" tools:visibility="visible" /> diff --git a/WordPress/src/main/res/layout/reader_related_posts_view.xml b/WordPress/src/main/res/layout/reader_related_posts_view.xml index f7338dba6e4a..d03f4c4885f3 100644 --- a/WordPress/src/main/res/layout/reader_related_posts_view.xml +++ b/WordPress/src/main/res/layout/reader_related_posts_view.xml @@ -5,15 +5,13 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="@dimen/reader_related_post_margin"> + android:orientation="vertical"> Date: Fri, 7 Oct 2016 17:11:05 -0400 Subject: [PATCH 15/41] Removed background & padding, added dividers --- .../android/ui/reader/views/ReaderRelatedPostsView.java | 3 +-- .../src/main/res/layout/reader_fragment_post_detail.xml | 3 +-- WordPress/src/main/res/layout/reader_related_post.xml | 6 +++--- .../src/main/res/layout/reader_related_posts_view.xml | 7 ++++++- WordPress/src/main/res/values/dimens.xml | 3 --- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index 8a7b3de316e9..4f8fe31900cd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -21,7 +21,7 @@ /** * used by the detail view to display related posts, which can be either local (related posts - * from the same site as the source posts) or global (related posts from across wp.com) + * from the same site as the source post) or global (related posts from across wp.com) */ public class ReaderRelatedPostsView extends LinearLayout { @@ -65,7 +65,6 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, String siteName) { if (relatedPosts.size() == 0) { - setVisibility(View.GONE); return; } diff --git a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml index c823224f558b..a3abeb5adcb5 100644 --- a/WordPress/src/main/res/layout/reader_fragment_post_detail.xml +++ b/WordPress/src/main/res/layout/reader_fragment_post_detail.xml @@ -59,7 +59,7 @@ android:id="@+id/related_posts_view_local" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/reader_related_post_margin" + android:layout_marginTop="@dimen/margin_extra_large" android:visibility="gone" tools:visibility="visible" /> @@ -67,7 +67,6 @@ android:id="@+id/related_posts_view_global" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/reader_related_post_margin" android:visibility="gone" tools:visibility="visible" /> diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index c22a2eff2624..bd0ffd85e824 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -1,7 +1,7 @@ + android:layout_marginBottom="@dimen/margin_extra_large" + android:background="?android:selectableItemBackground"> + + \ No newline at end of file diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index db202b68d6fd..481efe547ec8 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -87,9 +87,6 @@ 56dp 64dp - @dimen/margin_extra_large - 48dp - 48dp From 20b661cdf1be3e1f225dd1be1ef500e33e279875 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 17:22:26 -0400 Subject: [PATCH 16/41] Margin cleanup, fixed gravatar bug --- .../android/ui/reader/views/ReaderRelatedPostsView.java | 4 ++-- WordPress/src/main/res/layout/reader_related_posts_view.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index 4f8fe31900cd..c8f7701c800b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -16,7 +16,7 @@ import org.wordpress.android.ui.reader.models.ReaderRelatedPost; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.util.DisplayUtils; -import org.wordpress.android.util.PhotonUtils; +import org.wordpress.android.util.GravatarUtils; import org.wordpress.android.widgets.WPNetworkImageView; /** @@ -101,7 +101,7 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, txtSiteName.setText(relatedPost.getSiteName()); txtAuthorName.setText(relatedPost.getAuthorName()); if (relatedPost.hasAuthorAvatarUrl()) { - String avatarUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getAuthorAvatarUrl(), avatarSize, avatarSize); + String avatarUrl = GravatarUtils.fixGravatarUrl(relatedPost.getAuthorAvatarUrl(), avatarSize); imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); } else { imgAvatar.showDefaultGravatarImage(); diff --git a/WordPress/src/main/res/layout/reader_related_posts_view.xml b/WordPress/src/main/res/layout/reader_related_posts_view.xml index d142ca3337b5..4bebb9a42474 100644 --- a/WordPress/src/main/res/layout/reader_related_posts_view.xml +++ b/WordPress/src/main/res/layout/reader_related_posts_view.xml @@ -10,14 +10,14 @@ Date: Fri, 7 Oct 2016 17:58:14 -0400 Subject: [PATCH 17/41] Added back featured image --- .../ui/reader/actions/ReaderPostActions.java | 2 +- .../ui/reader/models/ReaderRelatedPost.java | 19 +++++++++++++++++++ .../reader/views/ReaderRelatedPostsView.java | 12 ++++++++++++ .../main/res/layout/reader_related_post.xml | 15 ++++++++++++++- WordPress/src/main/res/values/dimens.xml | 3 +++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index 96a2ce66b6ea..12ae629c7d08 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -375,7 +375,7 @@ public void onErrorResponse(VolleyError volleyError) { + "/related" + "?size_local=" + numLocal + "&size_global=" + numGlobal - + "&fields=ID,site_ID,title,excerpt,URL,author,site_name,site_URL"; + + "&fields=ID,site_ID,title,excerpt,URL,author,site_name,site_URL,featured_image,attachments"; WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index 55c8db6d18c8..5c6c1e659754 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -4,6 +4,8 @@ import android.text.TextUtils; import org.json.JSONObject; +import org.wordpress.android.ui.reader.ReaderConstants; +import org.wordpress.android.ui.reader.utils.ImageSizeMap; import org.wordpress.android.util.HtmlUtils; import org.wordpress.android.util.JSONUtils; @@ -18,6 +20,7 @@ public class ReaderRelatedPost { private String mAuthorAvatarUrl; private String mExcerpt; private String mSiteName; + private String mFeaturedImageUrl; public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { ReaderRelatedPost post = new ReaderRelatedPost(); @@ -27,6 +30,7 @@ public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { post.mTitle = JSONUtils.getStringDecoded(json, "title"); post.mExcerpt = HtmlUtils.fastStripHtml(JSONUtils.getString(json, "excerpt")).trim(); post.mSiteName = JSONUtils.getStringDecoded(json, "site_name"); + post.mFeaturedImageUrl = JSONUtils.getString(json, "featured_image"); JSONObject jsonAuthor = json.optJSONObject("author"); if (jsonAuthor != null) { @@ -34,6 +38,13 @@ public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { post.mAuthorAvatarUrl = JSONUtils.getString(jsonAuthor, "avatar_URL"); } + // if the post doesn't have an assigned featured image, try to guess one from its attachments + if (!post.hasFeaturedImageUrl() && json.has("attachments")) { + JSONObject jsonAttachments = json.optJSONObject("attachments"); + post.mFeaturedImageUrl = new ImageSizeMap(jsonAttachments.toString()) + .getLargestImageUrl(ReaderConstants.MIN_FEATURED_IMAGE_WIDTH); + } + return post; } @@ -65,6 +76,10 @@ public String getAuthorAvatarUrl() { return mAuthorAvatarUrl; } + public String getFeaturedImageUrl() { + return mFeaturedImageUrl; + } + public boolean hasExcerpt() { return !TextUtils.isEmpty(mExcerpt); } @@ -76,4 +91,8 @@ public boolean hasAuthorName() { public boolean hasAuthorAvatarUrl() { return !TextUtils.isEmpty(mAuthorAvatarUrl); } + + public boolean hasFeaturedImageUrl() { + return !TextUtils.isEmpty(mFeaturedImageUrl); + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index c8f7701c800b..bf25ab1a667b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -17,6 +17,7 @@ import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.util.DisplayUtils; import org.wordpress.android.util.GravatarUtils; +import org.wordpress.android.util.PhotonUtils; import org.wordpress.android.widgets.WPNetworkImageView; /** @@ -71,6 +72,8 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, ViewGroup container = (ViewGroup) findViewById(R.id.container_related_posts); container.removeAllViews(); + int imageWidth = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_width)); + int imageHeight = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_height)); int avatarSize = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small)); boolean isGlobal = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL; @@ -82,6 +85,7 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, View postView = inflater.inflate(R.layout.reader_related_post, container, false); TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); + WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_featured); View siteHeader = postView.findViewById(R.id.layout_related_post_site_header); txtTitle.setText(relatedPost.getTitle()); @@ -93,6 +97,14 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, txtExcerpt.setVisibility(View.GONE); } + if (relatedPost.hasFeaturedImageUrl()) { + String imageUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImageUrl(), imageWidth, imageHeight); + imgFeatured.setImageUrl(imageUrl, WPNetworkImageView.ImageType.PHOTO); + imgFeatured.setVisibility(View.VISIBLE); + } else { + imgFeatured.setVisibility(View.GONE); + } + // site header only appears for global posts if (isGlobal) { WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index bd0ffd85e824..a6cb92273a1c 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -48,11 +48,23 @@ + + + tools:text="text_related_post_excerpt\ntext_related_post_excerpt\ntext_related_post_excerpt" /> \ No newline at end of file diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index 481efe547ec8..698e2d040436 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -122,6 +122,9 @@ 340dp @dimen/reader_featured_image_height_default + 72dp + 48dp + 24dp From 0fefbfd90f706b564f7d0573f1da0c59c5a5c609 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 18:13:04 -0400 Subject: [PATCH 18/41] Reversed author name & site name in the header --- .../main/res/layout/reader_related_post.xml | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index a6cb92273a1c..01b655b0f65b 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -28,23 +28,23 @@ tools:src="@drawable/gravatar_placeholder" /> + tools:text="text_author_name" /> + tools:text="text_site_name" /> @@ -52,39 +52,40 @@ android:id="@+id/image_featured" android:layout_width="@dimen/reader_related_post_image_width" android:layout_height="@dimen/reader_related_post_image_height" - android:scaleType="centerCrop" + android:layout_alignParentRight="true" android:layout_below="@+id/layout_related_post_site_header" - android:layout_marginRight="@dimen/margin_large" + android:layout_marginLeft="@dimen/margin_large" + android:scaleType="centerCrop" android:visibility="gone" tools:src="@drawable/gravatar_placeholder" tools:visibility="visible" /> - + - + - \ No newline at end of file + \ No newline at end of file From 0ca61a5bdf77e28cdac1412450241cb16b5f73e4 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 18:15:39 -0400 Subject: [PATCH 19/41] Don't show featured image unless there's an excerpt --- .../android/ui/reader/views/ReaderRelatedPostsView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index bf25ab1a667b..a0d5172ec8a6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -97,7 +97,7 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, txtExcerpt.setVisibility(View.GONE); } - if (relatedPost.hasFeaturedImageUrl()) { + if (relatedPost.hasFeaturedImageUrl() && relatedPost.hasExcerpt()) { String imageUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImageUrl(), imageWidth, imageHeight); imgFeatured.setImageUrl(imageUrl, WPNetworkImageView.ImageType.PHOTO); imgFeatured.setVisibility(View.VISIBLE); From 6b84144704f9bb146c99d893d6dec09f94b26001 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 18:34:41 -0400 Subject: [PATCH 20/41] Added RELATED_POST_FIELDS constant --- .../wordpress/android/ui/reader/actions/ReaderPostActions.java | 3 ++- .../wordpress/android/ui/reader/models/ReaderRelatedPost.java | 3 +++ WordPress/src/main/res/values/dimens.xml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index 12ae629c7d08..4b8257bee309 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -22,6 +22,7 @@ import org.wordpress.android.ui.reader.ReaderEvents; import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResult; import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResultListener; +import org.wordpress.android.ui.reader.models.ReaderRelatedPost; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; @@ -375,7 +376,7 @@ public void onErrorResponse(VolleyError volleyError) { + "/related" + "?size_local=" + numLocal + "&size_global=" + numGlobal - + "&fields=ID,site_ID,title,excerpt,URL,author,site_name,site_URL,featured_image,attachments"; + + "&fields=" + ReaderRelatedPost.RELATED_POST_FIELDS; WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index 5c6c1e659754..17aba1135549 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -22,6 +22,9 @@ public class ReaderRelatedPost { private String mSiteName; private String mFeaturedImageUrl; + // these are the specific fields we should ask for when requesting related posts from the endpoint + public static final String RELATED_POST_FIELDS = "ID,site_ID,title,excerpt,site_name,featured_image,author,attachments"; + public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { ReaderRelatedPost post = new ReaderRelatedPost(); diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index 698e2d040436..1386e2871284 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -123,7 +123,7 @@ @dimen/reader_featured_image_height_default 72dp - 48dp + 56dp 24dp From d72b4cfe06935d5a5dc80cea1c9ccc69fab67bee Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 19:05:26 -0400 Subject: [PATCH 21/41] Moved featured image to the left --- .../main/res/layout/reader_related_post.xml | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 01b655b0f65b..7dba4c7b9799 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -52,40 +52,39 @@ android:id="@+id/image_featured" android:layout_width="@dimen/reader_related_post_image_width" android:layout_height="@dimen/reader_related_post_image_height" - android:layout_alignParentRight="true" android:layout_below="@+id/layout_related_post_site_header" - android:layout_marginLeft="@dimen/margin_large" + android:layout_marginRight="@dimen/margin_large" android:scaleType="centerCrop" android:visibility="gone" tools:src="@drawable/gravatar_placeholder" tools:visibility="visible" /> - + - + - \ No newline at end of file + \ No newline at end of file From b8e579cbe5b8fc3f8289d744f3160a68f22dfea2 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 7 Oct 2016 20:11:51 -0400 Subject: [PATCH 22/41] Removed unused background drawable --- .../main/res/drawable/reader_related_posts_background.xml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 WordPress/src/main/res/drawable/reader_related_posts_background.xml diff --git a/WordPress/src/main/res/drawable/reader_related_posts_background.xml b/WordPress/src/main/res/drawable/reader_related_posts_background.xml deleted file mode 100644 index f4a6cbd94434..000000000000 --- a/WordPress/src/main/res/drawable/reader_related_posts_background.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file From cab591f830d2029adbddc2ec9aeffdfe42671515 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 09:09:34 -0400 Subject: [PATCH 23/41] Make featured image fit the height of the related post view --- .../reader/views/ReaderRelatedPostsView.java | 37 ++++++++++++++----- .../main/res/layout/reader_related_post.xml | 22 +++++------ WordPress/src/main/res/values/dimens.xml | 1 - 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index a0d5172ec8a6..9b360415c926 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -7,6 +7,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.TextView; @@ -31,6 +32,7 @@ public interface OnRelatedPostClickListener { } private OnRelatedPostClickListener mClickListener; + private int mFeaturedImageWidth; public ReaderRelatedPostsView(Context context) { super(context); @@ -55,6 +57,7 @@ public ReaderRelatedPostsView(Context context, AttributeSet attrs, int defStyleA private void initView(Context context) { inflate(context, R.layout.reader_related_posts_view, this); + mFeaturedImageWidth = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_width)); } public void setOnRelatedPostClickListener(OnRelatedPostClickListener listener) { @@ -72,8 +75,6 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, ViewGroup container = (ViewGroup) findViewById(R.id.container_related_posts); container.removeAllViews(); - int imageWidth = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_width)); - int imageHeight = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.reader_related_post_image_height)); int avatarSize = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small)); boolean isGlobal = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL; @@ -97,14 +98,6 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, txtExcerpt.setVisibility(View.GONE); } - if (relatedPost.hasFeaturedImageUrl() && relatedPost.hasExcerpt()) { - String imageUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImageUrl(), imageWidth, imageHeight); - imgFeatured.setImageUrl(imageUrl, WPNetworkImageView.ImageType.PHOTO); - imgFeatured.setVisibility(View.VISIBLE); - } else { - imgFeatured.setVisibility(View.GONE); - } - // site header only appears for global posts if (isGlobal) { WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); @@ -123,6 +116,8 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, siteHeader.setVisibility(View.GONE); } + showFeaturedImage(relatedPost, postView); + postView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -144,4 +139,26 @@ public void onClick(View view) { } } + private void showFeaturedImage(final ReaderRelatedPost relatedPost, final View postView) { + final WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_featured); + + // post must have an excerpt in order to show featured image + if (!relatedPost.hasFeaturedImageUrl() || !relatedPost.hasExcerpt()) { + imgFeatured.setVisibility(View.GONE); + return; + } + + // featured image has height set to MATCH_PARENT so wait for parent's layout to complete + // before loading image so we can set the image height correctly + postView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + postView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + String photonUrl = PhotonUtils.getPhotonImageUrl(relatedPost.getFeaturedImageUrl(), mFeaturedImageWidth, postView.getHeight()); + imgFeatured.setImageUrl(photonUrl, WPNetworkImageView.ImageType.PHOTO); + } + }); + imgFeatured.setVisibility(View.VISIBLE); + } + } diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 7dba4c7b9799..9a871e0ce367 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -12,11 +12,22 @@ android:layout_marginBottom="@dimen/margin_extra_large" android:background="?android:selectableItemBackground"> + + @@ -48,17 +59,6 @@ - - 340dp @dimen/reader_featured_image_height_default - 72dp 56dp From 7d5e08fddfc0d4339e4ac0dfa72fb1db38db8016 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 09:28:57 -0400 Subject: [PATCH 24/41] First pass at follow button --- .../ui/reader/models/ReaderRelatedPost.java | 12 +++++- .../reader/views/ReaderRelatedPostsView.java | 40 +++++++++++++++++++ .../main/res/layout/reader_related_post.xml | 9 +++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index 17aba1135549..b4ec63c352c8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -21,9 +21,10 @@ public class ReaderRelatedPost { private String mExcerpt; private String mSiteName; private String mFeaturedImageUrl; + private boolean mIsFollowing; // these are the specific fields we should ask for when requesting related posts from the endpoint - public static final String RELATED_POST_FIELDS = "ID,site_ID,title,excerpt,site_name,featured_image,author,attachments"; + public static final String RELATED_POST_FIELDS = "ID,site_ID,title,excerpt,site_name,featured_image,is_following,author,attachments"; public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { ReaderRelatedPost post = new ReaderRelatedPost(); @@ -34,6 +35,7 @@ public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { post.mExcerpt = HtmlUtils.fastStripHtml(JSONUtils.getString(json, "excerpt")).trim(); post.mSiteName = JSONUtils.getStringDecoded(json, "site_name"); post.mFeaturedImageUrl = JSONUtils.getString(json, "featured_image"); + post.mIsFollowing = JSONUtils.getBool(json, "is_following"); JSONObject jsonAuthor = json.optJSONObject("author"); if (jsonAuthor != null) { @@ -83,6 +85,14 @@ public String getFeaturedImageUrl() { return mFeaturedImageUrl; } + public boolean isFollowing() { + return mIsFollowing; + } + + public void setIsFollowing(boolean isFollowing) { + mIsFollowing = isFollowing; + } + public boolean hasExcerpt() { return !TextUtils.isEmpty(mExcerpt); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index 9b360415c926..102328555836 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -12,13 +12,17 @@ import android.widget.TextView; import org.wordpress.android.R; +import org.wordpress.android.ui.reader.actions.ReaderActions; +import org.wordpress.android.ui.reader.actions.ReaderBlogActions; import org.wordpress.android.ui.reader.actions.ReaderPostActions; import org.wordpress.android.ui.reader.actions.ReaderPostActions.RelatedPostsType; import org.wordpress.android.ui.reader.models.ReaderRelatedPost; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.util.DisplayUtils; import org.wordpress.android.util.GravatarUtils; +import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.PhotonUtils; +import org.wordpress.android.util.ToastUtils; import org.wordpress.android.widgets.WPNetworkImageView; /** @@ -116,6 +120,15 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, siteHeader.setVisibility(View.GONE); } + final ReaderFollowButton btnFollow = (ReaderFollowButton) postView.findViewById(R.id.related_post_follow_button); + btnFollow.setIsFollowed(relatedPost.isFollowing()); + setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + toggleFollowStatus(btnFollow, relatedPost); + } + }); + showFeaturedImage(relatedPost, postView); postView.setOnClickListener(new View.OnClickListener() { @@ -139,6 +152,33 @@ public void onClick(View view) { } } + private void toggleFollowStatus(final ReaderFollowButton btnFollow, ReaderRelatedPost relatedPost) { + if (!NetworkUtils.checkConnection(getContext())) return; + + final boolean isAskingToFollow = !relatedPost.isFollowing(); + + ReaderActions.ActionListener listener = new ReaderActions.ActionListener() { + @Override + public void onActionResult(boolean succeeded) { + if (getContext() == null) return; + + btnFollow.setEnabled(true); + if (!succeeded) { + int errResId = isAskingToFollow ? R.string.reader_toast_err_follow_blog : R.string.reader_toast_err_unfollow_blog; + ToastUtils.showToast(getContext(), errResId); + btnFollow.setIsFollowed(!isAskingToFollow); + } + } + }; + + // disable follow button until API call returns + btnFollow.setEnabled(false); + boolean result = ReaderBlogActions.followBlogById(relatedPost.getSiteId(), isAskingToFollow, listener); + if (result) { + btnFollow.setIsFollowedAnimated(isAskingToFollow); + } + } + private void showFeaturedImage(final ReaderRelatedPost relatedPost, final View postView) { final WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_featured); diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 9a871e0ce367..5df8ad3c562f 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -31,6 +31,13 @@ android:visibility="gone" tools:visibility="visible"> + + Date: Sat, 8 Oct 2016 10:09:47 -0400 Subject: [PATCH 25/41] 2nd pass at follow button --- .../reader/views/ReaderRelatedPostsView.java | 70 ++++++++++++------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index 102328555836..c40fc2c47369 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -37,6 +37,7 @@ public interface OnRelatedPostClickListener { private OnRelatedPostClickListener mClickListener; private int mFeaturedImageWidth; + private ReaderRelatedPostList mRelatedPostList; public ReaderRelatedPostsView(Context context) { super(context); @@ -68,11 +69,12 @@ public void setOnRelatedPostClickListener(OnRelatedPostClickListener listener) { mClickListener = listener; } - public void showRelatedPosts(ReaderRelatedPostList relatedPosts, + public void showRelatedPosts(ReaderRelatedPostList posts, RelatedPostsType relatedPostsType, String siteName) { - if (relatedPosts.size() == 0) { + mRelatedPostList = posts; + if (mRelatedPostList.size() == 0) { return; } @@ -84,13 +86,13 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, // add a separate view for each related post LayoutInflater inflater = LayoutInflater.from(getContext()); - for (int index = 0; index < relatedPosts.size(); index++) { - final ReaderRelatedPost relatedPost = relatedPosts.get(index); + for (int index = 0; index < mRelatedPostList.size(); index++) { + final int position = index; + ReaderRelatedPost relatedPost = mRelatedPostList.get(position); View postView = inflater.inflate(R.layout.reader_related_post, container, false); TextView txtTitle = (TextView) postView.findViewById(R.id.text_related_post_title); TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_related_post_excerpt); - WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_featured); View siteHeader = postView.findViewById(R.id.layout_related_post_site_header); txtTitle.setText(relatedPost.getTitle()); @@ -115,27 +117,30 @@ public void showRelatedPosts(ReaderRelatedPostList relatedPosts, } else { imgAvatar.showDefaultGravatarImage(); } + + final ReaderFollowButton btnFollow = (ReaderFollowButton) siteHeader.findViewById(R.id.related_post_follow_button); + btnFollow.setIsFollowed(relatedPost.isFollowing()); + btnFollow.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + toggleFollowStatus(btnFollow, position); + } + }); + siteHeader.setVisibility(View.VISIBLE); } else { siteHeader.setVisibility(View.GONE); } - final ReaderFollowButton btnFollow = (ReaderFollowButton) postView.findViewById(R.id.related_post_follow_button); - btnFollow.setIsFollowed(relatedPost.isFollowing()); - setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - toggleFollowStatus(btnFollow, relatedPost); - } - }); - - showFeaturedImage(relatedPost, postView); + showFeaturedImage(postView, relatedPost); postView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mClickListener != null) { - mClickListener.onRelatedPostClick(view, relatedPost.getSiteId(), relatedPost.getPostId()); + mClickListener.onRelatedPostClick(view, + mRelatedPostList.get(position).getSiteId(), + mRelatedPostList.get(position).getPostId()); } } }); @@ -152,10 +157,15 @@ public void onClick(View view) { } } - private void toggleFollowStatus(final ReaderFollowButton btnFollow, ReaderRelatedPost relatedPost) { + /** + * user tapped follow button on a global related post + * @param btnFollow Follow button for the site to follow + * @param position index of the related post in mRelatedPosts + */ + private void toggleFollowStatus(final ReaderFollowButton btnFollow, final int position) { if (!NetworkUtils.checkConnection(getContext())) return; - final boolean isAskingToFollow = !relatedPost.isFollowing(); + final boolean isAskingToFollow = !mRelatedPostList.get(position).isFollowing(); ReaderActions.ActionListener listener = new ReaderActions.ActionListener() { @Override @@ -163,7 +173,9 @@ public void onActionResult(boolean succeeded) { if (getContext() == null) return; btnFollow.setEnabled(true); - if (!succeeded) { + if (succeeded) { + mRelatedPostList.get(position).setIsFollowing(isAskingToFollow); + } else { int errResId = isAskingToFollow ? R.string.reader_toast_err_follow_blog : R.string.reader_toast_err_unfollow_blog; ToastUtils.showToast(getContext(), errResId); btnFollow.setIsFollowed(!isAskingToFollow); @@ -171,24 +183,28 @@ public void onActionResult(boolean succeeded) { } }; - // disable follow button until API call returns + // disable follow button until call completes btnFollow.setEnabled(false); - boolean result = ReaderBlogActions.followBlogById(relatedPost.getSiteId(), isAskingToFollow, listener); - if (result) { - btnFollow.setIsFollowedAnimated(isAskingToFollow); - } + + ReaderBlogActions.followBlogById(mRelatedPostList.get(position).getSiteId(), isAskingToFollow, listener); + btnFollow.setIsFollowedAnimated(isAskingToFollow); } - private void showFeaturedImage(final ReaderRelatedPost relatedPost, final View postView) { + /** + * shows the featured image for the passed related post, if available + * @param postView parent view which contains the featured image and other related post views + * @param relatedPost related post to operate on + */ + private void showFeaturedImage(final View postView, final ReaderRelatedPost relatedPost) { final WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_featured); - // post must have an excerpt in order to show featured image + // post must have an excerpt in order to show featured image (not enough space otherwise) if (!relatedPost.hasFeaturedImageUrl() || !relatedPost.hasExcerpt()) { imgFeatured.setVisibility(View.GONE); return; } - // featured image has height set to MATCH_PARENT so wait for parent's layout to complete + // featured image has height set to MATCH_PARENT so wait for parent view's layout to complete // before loading image so we can set the image height correctly postView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override From fabbe9d3d89be4310e2e9b515871741c00ef6afc Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 10:22:41 -0400 Subject: [PATCH 26/41] Modify follow button to have no caption --- .../ui/reader/views/ReaderFollowButton.java | 28 +++++++++++++++---- .../reader/views/ReaderRelatedPostsView.java | 2 +- .../main/res/layout/reader_related_post.xml | 3 +- WordPress/src/main/res/values/attrs.xml | 7 +++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java index efd5484b82c6..48dfc76634e6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java @@ -6,6 +6,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; @@ -22,31 +23,48 @@ public class ReaderFollowButton extends LinearLayout { private TextView mTextFollow; private ImageView mImageFollow; private boolean mIsFollowed; + private boolean mShowCaption; public ReaderFollowButton(Context context){ super(context); - initView(context); + initView(context, null); } public ReaderFollowButton(Context context, AttributeSet attrs) { super(context, attrs); - initView(context); + initView(context, attrs); } public ReaderFollowButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - initView(context); + initView(context, attrs); } - private void initView(Context context) { + private void initView(Context context, AttributeSet attrs) { inflate(context, R.layout.reader_follow_button, this); mTextFollow = (TextView) findViewById(R.id.text_follow_button); mImageFollow = (ImageView) findViewById(R.id.image_follow_button); + + // default to showing caption, then read the value from passed attributes + mShowCaption = true; + if (attrs != null) { + TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ReaderFollowButton, 0, 0); + if (array != null) { + mShowCaption = array.getBoolean(R.styleable.ReaderFollowButton_wpShowCaption, true); + } + } + + if (!mShowCaption) { + mTextFollow.setText(null); + mTextFollow.setVisibility(View.GONE); + } } private void updateFollowText() { + if (mShowCaption) { + mTextFollow.setText(mIsFollowed ? R.string.reader_btn_unfollow : R.string.reader_btn_follow); + } mTextFollow.setSelected(mIsFollowed); - mTextFollow.setText(mIsFollowed ? R.string.reader_btn_unfollow : R.string.reader_btn_follow); mImageFollow.setImageResource(mIsFollowed ? R.drawable.reader_following : R.drawable.reader_follow); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index c40fc2c47369..a96af6697be2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -105,7 +105,7 @@ public void showRelatedPosts(ReaderRelatedPostList posts, } // site header only appears for global posts - if (isGlobal) { + if (isGlobal || !isGlobal) { WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); TextView txtSiteName = (TextView) siteHeader.findViewById(R.id.text_site_name); TextView txtAuthorName = (TextView) siteHeader.findViewById(R.id.text_author_name); diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 5df8ad3c562f..3125add56391 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -36,7 +36,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" - android:layout_centerVertical="true" /> + android:layout_centerVertical="true" + app:wpShowCaption="false" /> + + + + + From e018e61b1e05bcf1d2b94609b6c037834fa5da59 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 10:23:29 -0400 Subject: [PATCH 27/41] Correct bug that caused site header on local related posts --- .../android/ui/reader/views/ReaderRelatedPostsView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index a96af6697be2..c40fc2c47369 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -105,7 +105,7 @@ public void showRelatedPosts(ReaderRelatedPostList posts, } // site header only appears for global posts - if (isGlobal || !isGlobal) { + if (isGlobal) { WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); TextView txtSiteName = (TextView) siteHeader.findViewById(R.id.text_site_name); TextView txtAuthorName = (TextView) siteHeader.findViewById(R.id.text_author_name); From 68454e730cb99ca39add814375788e6d7a6b9fc0 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 13:06:14 -0400 Subject: [PATCH 28/41] Increased featured image width --- WordPress/src/main/res/values/dimens.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/res/values/dimens.xml b/WordPress/src/main/res/values/dimens.xml index 0b03098987f1..fd7f0705b1ff 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -122,7 +122,7 @@ 340dp @dimen/reader_featured_image_height_default - 56dp + 72dp 24dp From ed23a6bd79c97b81029d1fedcc5b757b551aa023 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 15:08:50 -0400 Subject: [PATCH 29/41] Request local related posts first --- .../wordpress/android/ui/reader/ReaderPostDetailFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 5bb3e420a524..b1793f325509 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -432,8 +432,8 @@ private void replacePost(long blogId, long postId) { */ private void requestRelatedPosts() { if (hasPost() && mPost.isWP()) { - ReaderPostActions.requestRelatedPosts(mPost, ReaderPostActions.RelatedPostsType.GLOBAL); ReaderPostActions.requestRelatedPosts(mPost, ReaderPostActions.RelatedPostsType.LOCAL); + ReaderPostActions.requestRelatedPosts(mPost, ReaderPostActions.RelatedPostsType.GLOBAL); } } From c6c065fdee6ca439630ad498a82c2b4ee40b6a2d Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 18:31:30 -0400 Subject: [PATCH 30/41] Use single call to get all related posts at once --- .../android/ui/reader/ReaderEvents.java | 33 ++++++++++++------- .../ui/reader/ReaderPostDetailFragment.java | 19 ++++++++--- .../ui/reader/actions/ReaderPostActions.java | 24 +++++--------- .../reader/views/ReaderRelatedPostsView.java | 12 ++----- 4 files changed, 46 insertions(+), 42 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java index 9ad62a541778..7dd55379f579 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java @@ -5,7 +5,7 @@ import org.wordpress.android.models.ReaderPost; import org.wordpress.android.models.ReaderTag; import org.wordpress.android.ui.reader.actions.ReaderActions; -import org.wordpress.android.ui.reader.actions.ReaderPostActions.RelatedPostsType; +import org.wordpress.android.ui.reader.models.ReaderRelatedPost; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.ui.reader.services.ReaderPostService; import org.wordpress.android.util.StringUtils; @@ -120,23 +120,34 @@ public ReaderActions.UpdateResult getResult() { public static class RelatedPostsUpdated { private final ReaderPost mSourcePost; - private final ReaderRelatedPostList mRelatedPosts; - private final RelatedPostsType mRelatedPostsType; + private final ReaderRelatedPostList mLocalRelatedPosts = new ReaderRelatedPostList(); + private final ReaderRelatedPostList mGlobalRelatedPosts = new ReaderRelatedPostList(); public RelatedPostsUpdated(@NonNull ReaderPost sourcePost, - @NonNull ReaderRelatedPostList relatedPosts, - @NonNull RelatedPostsType relatedPostsType) { + @NonNull ReaderRelatedPostList relatedPosts) { mSourcePost = sourcePost; - mRelatedPosts = relatedPosts; - mRelatedPostsType = relatedPostsType; + // split into posts from the passed site (local) and from across wp.com (global) + for (ReaderRelatedPost relatedPost : relatedPosts) { + if (relatedPost.getSiteId() == sourcePost.blogId) { + mLocalRelatedPosts.add(relatedPost); + } else { + mGlobalRelatedPosts.add(relatedPost); + } + } } public ReaderPost getSourcePost() { return mSourcePost; } - public ReaderRelatedPostList getRelatedPosts() { - return mRelatedPosts; + public ReaderRelatedPostList getLocalRelatedPosts() { + return mLocalRelatedPosts; } - public RelatedPostsType getRelatedPostsType() { - return mRelatedPostsType; + public ReaderRelatedPostList getGlobalRelatedPosts() { + return mGlobalRelatedPosts; + } + public boolean hasLocalRelatedPosts() { + return mLocalRelatedPosts.size() > 0; + } + public boolean hasGlobalRelatedPosts() { + return mGlobalRelatedPosts.size() > 0; } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index b1793f325509..4eb55e5f3750 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; @@ -33,6 +34,7 @@ import org.wordpress.android.ui.reader.actions.ReaderActions; import org.wordpress.android.ui.reader.actions.ReaderPostActions; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId; +import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.ui.reader.utils.ReaderUtils; import org.wordpress.android.ui.reader.utils.ReaderVideoUtils; import org.wordpress.android.ui.reader.views.ReaderIconCountView; @@ -432,8 +434,7 @@ private void replacePost(long blogId, long postId) { */ private void requestRelatedPosts() { if (hasPost() && mPost.isWP()) { - ReaderPostActions.requestRelatedPosts(mPost, ReaderPostActions.RelatedPostsType.LOCAL); - ReaderPostActions.requestRelatedPosts(mPost, ReaderPostActions.RelatedPostsType.GLOBAL); + ReaderPostActions.requestRelatedPosts(mPost); } } @@ -449,11 +450,19 @@ public void onEventMainThread(ReaderEvents.RelatedPostsUpdated event) { return; } + if (event.hasLocalRelatedPosts()) { + showRelatedPosts(event.getLocalRelatedPosts(), false); + } + if (event.hasGlobalRelatedPosts()) { + showRelatedPosts(event.getGlobalRelatedPosts(), true); + } + } + + private void showRelatedPosts(@NonNull ReaderRelatedPostList relatedPosts, boolean isGlobal) { // different container views for global/local related posts - int id = event.getRelatedPostsType() == ReaderPostActions.RelatedPostsType.GLOBAL - ? R.id.related_posts_view_global : R.id.related_posts_view_local; + int id = isGlobal ? R.id.related_posts_view_global : R.id.related_posts_view_local; ReaderRelatedPostsView relatedPostsView = (ReaderRelatedPostsView) getView().findViewById(id); - relatedPostsView.showRelatedPosts(event.getRelatedPosts(), event.getRelatedPostsType(), mPost.getBlogName()); + relatedPostsView.showRelatedPosts(relatedPosts, mPost.getBlogName(), isGlobal); // tapping a related posts should open the related post detail relatedPostsView.setOnRelatedPostClickListener(new ReaderRelatedPostsView.OnRelatedPostClickListener() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index 4b8257bee309..982e2ed95602 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -41,9 +41,6 @@ public class ReaderPostActions { private static final String TRACKING_REFERRER = "https://wordpress.com/"; private static final Random mRandom = new Random(); - public enum RelatedPostsType { - LOCAL, GLOBAL - } private static final int NUM_RELATED_POSTS_TO_REQUEST = 2; private ReaderPostActions() { @@ -346,17 +343,16 @@ public Map getHeaders() throws AuthFailureError { } /* - * request posts related to the passed one, use RelatedPostsType.GLOBAL to return related - * posts from any site, or RelatedPostsType.LOCAL to return related posts from the same - * site as the passed post + * request posts related to the passed one, endpoint returns a combined list of related posts + * posts from across wp.com and related posts from the same site as the passed post */ - public static void requestRelatedPosts(final ReaderPost sourcePost, final RelatedPostsType relatedPostsType) { + public static void requestRelatedPosts(final ReaderPost sourcePost) { if (sourcePost == null) return; RestRequest.Listener listener = new RestRequest.Listener() { @Override public void onResponse(JSONObject jsonObject) { - handleRelatedPostsResponse(sourcePost, jsonObject, relatedPostsType); + handleRelatedPostsResponse(sourcePost, jsonObject); } }; RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() { @@ -368,21 +364,17 @@ public void onErrorResponse(VolleyError volleyError) { } }; - int numLocal = relatedPostsType == RelatedPostsType.LOCAL ? NUM_RELATED_POSTS_TO_REQUEST : 0; - int numGlobal = relatedPostsType == RelatedPostsType.GLOBAL ? NUM_RELATED_POSTS_TO_REQUEST : 0; - String path = "/read/site/" + sourcePost.blogId + "/post/" + sourcePost.postId + "/related" - + "?size_local=" + numLocal - + "&size_global=" + numGlobal + + "?size_local=" + NUM_RELATED_POSTS_TO_REQUEST + + "&size_global=" + NUM_RELATED_POSTS_TO_REQUEST + "&fields=" + ReaderRelatedPost.RELATED_POST_FIELDS; WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); } private static void handleRelatedPostsResponse(final ReaderPost sourcePost, - final JSONObject jsonObject, - final RelatedPostsType relatedPostsType) { + final JSONObject jsonObject) { if (jsonObject == null) return; new Thread() { @@ -390,7 +382,7 @@ private static void handleRelatedPostsResponse(final ReaderPost sourcePost, public void run() { ReaderRelatedPostList relatedPosts = ReaderRelatedPostList.fromJson(jsonObject); if (relatedPosts != null && relatedPosts.size() > 0) { - EventBus.getDefault().post(new ReaderEvents.RelatedPostsUpdated(sourcePost, relatedPosts, relatedPostsType)); + EventBus.getDefault().post(new ReaderEvents.RelatedPostsUpdated(sourcePost, relatedPosts)); } } }.start(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index c40fc2c47369..b69357059a97 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -14,8 +14,6 @@ import org.wordpress.android.R; import org.wordpress.android.ui.reader.actions.ReaderActions; import org.wordpress.android.ui.reader.actions.ReaderBlogActions; -import org.wordpress.android.ui.reader.actions.ReaderPostActions; -import org.wordpress.android.ui.reader.actions.ReaderPostActions.RelatedPostsType; import org.wordpress.android.ui.reader.models.ReaderRelatedPost; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.util.DisplayUtils; @@ -69,20 +67,14 @@ public void setOnRelatedPostClickListener(OnRelatedPostClickListener listener) { mClickListener = listener; } - public void showRelatedPosts(ReaderRelatedPostList posts, - RelatedPostsType relatedPostsType, - String siteName) { - + public void showRelatedPosts(ReaderRelatedPostList posts, String siteName, boolean isGlobal) { mRelatedPostList = posts; - if (mRelatedPostList.size() == 0) { - return; - } + if (mRelatedPostList.size() == 0) return; ViewGroup container = (ViewGroup) findViewById(R.id.container_related_posts); container.removeAllViews(); int avatarSize = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small)); - boolean isGlobal = relatedPostsType == ReaderPostActions.RelatedPostsType.GLOBAL; // add a separate view for each related post LayoutInflater inflater = LayoutInflater.from(getContext()); From 64973a549c64f04b3d8012123296a65ade33ebab Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 19:00:27 -0400 Subject: [PATCH 31/41] Split related posts in the action --- .../android/ui/reader/ReaderEvents.java | 18 +++++--------- .../ui/reader/ReaderPostDetailFragment.java | 24 ++++++++++--------- .../ui/reader/actions/ReaderPostActions.java | 14 ++++++++--- .../reader/views/ReaderRelatedPostsView.java | 5 ++-- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java index 7dd55379f579..f4b299175a41 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java @@ -5,7 +5,6 @@ import org.wordpress.android.models.ReaderPost; import org.wordpress.android.models.ReaderTag; import org.wordpress.android.ui.reader.actions.ReaderActions; -import org.wordpress.android.ui.reader.models.ReaderRelatedPost; import org.wordpress.android.ui.reader.models.ReaderRelatedPostList; import org.wordpress.android.ui.reader.services.ReaderPostService; import org.wordpress.android.util.StringUtils; @@ -120,19 +119,14 @@ public ReaderActions.UpdateResult getResult() { public static class RelatedPostsUpdated { private final ReaderPost mSourcePost; - private final ReaderRelatedPostList mLocalRelatedPosts = new ReaderRelatedPostList(); - private final ReaderRelatedPostList mGlobalRelatedPosts = new ReaderRelatedPostList(); + private final ReaderRelatedPostList mLocalRelatedPosts; + private final ReaderRelatedPostList mGlobalRelatedPosts; public RelatedPostsUpdated(@NonNull ReaderPost sourcePost, - @NonNull ReaderRelatedPostList relatedPosts) { + @NonNull ReaderRelatedPostList localRelatedPosts, + @NonNull ReaderRelatedPostList globalRelatedPosts) { mSourcePost = sourcePost; - // split into posts from the passed site (local) and from across wp.com (global) - for (ReaderRelatedPost relatedPost : relatedPosts) { - if (relatedPost.getSiteId() == sourcePost.blogId) { - mLocalRelatedPosts.add(relatedPost); - } else { - mGlobalRelatedPosts.add(relatedPost); - } - } + mLocalRelatedPosts = localRelatedPosts; + mGlobalRelatedPosts = globalRelatedPosts; } public ReaderPost getSourcePost() { return mSourcePost; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 4eb55e5f3750..7a11411dd1a2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -439,25 +439,27 @@ private void requestRelatedPosts() { } /* - * related posts were retrieved, so show them + * related posts were retrieved */ @SuppressWarnings("unused") public void onEventMainThread(ReaderEvents.RelatedPostsUpdated event) { if (!isAdded() || !hasPost()) return; - // make sure this is for the current post - if (event.getSourcePost().postId != mPost.postId || event.getSourcePost().blogId != mPost.blogId) { - return; - } - - if (event.hasLocalRelatedPosts()) { - showRelatedPosts(event.getLocalRelatedPosts(), false); - } - if (event.hasGlobalRelatedPosts()) { - showRelatedPosts(event.getGlobalRelatedPosts(), true); + // make sure this event is for the current post + if (event.getSourcePost().postId == mPost.postId && event.getSourcePost().blogId == mPost.blogId) { + if (event.hasLocalRelatedPosts()) { + showRelatedPosts(event.getLocalRelatedPosts(), false); + } + if (event.hasGlobalRelatedPosts()) { + showRelatedPosts(event.getGlobalRelatedPosts(), true); + } } } + /* + * show the passed list of related posts - can be either global (related posts from + * across wp.com) or local (related posts from the same site as the current post) + */ private void showRelatedPosts(@NonNull ReaderRelatedPostList relatedPosts, boolean isGlobal) { // different container views for global/local related posts int id = isGlobal ? R.id.related_posts_view_global : R.id.related_posts_view_local; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index 982e2ed95602..d1f0a1132efa 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -380,10 +380,18 @@ private static void handleRelatedPostsResponse(final ReaderPost sourcePost, new Thread() { @Override public void run() { - ReaderRelatedPostList relatedPosts = ReaderRelatedPostList.fromJson(jsonObject); - if (relatedPosts != null && relatedPosts.size() > 0) { - EventBus.getDefault().post(new ReaderEvents.RelatedPostsUpdated(sourcePost, relatedPosts)); + ReaderRelatedPostList allRelatedPosts = ReaderRelatedPostList.fromJson(jsonObject); + // split into posts from the passed site (local) and from across wp.com (global) + ReaderRelatedPostList localRelatedPosts = new ReaderRelatedPostList(); + ReaderRelatedPostList globalRelatedPosts = new ReaderRelatedPostList(); + for (ReaderRelatedPost relatedPost : allRelatedPosts) { + if (relatedPost.getSiteId() == sourcePost.blogId) { + localRelatedPosts.add(relatedPost); + } else { + globalRelatedPosts.add(relatedPost); + } } + EventBus.getDefault().post(new ReaderEvents.RelatedPostsUpdated(sourcePost, localRelatedPosts, globalRelatedPosts)); } }.start(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java index b69357059a97..8279f727c54c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRelatedPostsView.java @@ -96,7 +96,7 @@ public void showRelatedPosts(ReaderRelatedPostList posts, String siteName, boole txtExcerpt.setVisibility(View.GONE); } - // site header only appears for global posts + // site header only appears for global related posts if (isGlobal) { WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar); TextView txtSiteName = (TextView) siteHeader.findViewById(R.id.text_site_name); @@ -140,7 +140,7 @@ public void onClick(View view) { container.addView(postView); } - // make sure the label for these related posts is showing + // make sure the label for these related posts has the correct caption TextView label = (TextView) findViewById(R.id.text_related_posts_label); if (isGlobal) { label.setText(getContext().getString(R.string.reader_label_global_related_posts)); @@ -206,6 +206,7 @@ public void onGlobalLayout() { imgFeatured.setImageUrl(photonUrl, WPNetworkImageView.ImageType.PHOTO); } }); + imgFeatured.setVisibility(View.VISIBLE); } From 8e6ac3c043a1a646e579542fe119fb5af787824b Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 19:30:11 -0400 Subject: [PATCH 32/41] Get featured image from featured_media --- .../android/ui/reader/ReaderEvents.java | 13 +++++--- .../ui/reader/ReaderPostDetailFragment.java | 2 +- .../ui/reader/models/ReaderRelatedPost.java | 30 +++++++++---------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java index f4b299175a41..cf2037457bd9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderEvents.java @@ -118,18 +118,23 @@ public ReaderActions.UpdateResult getResult() { } public static class RelatedPostsUpdated { - private final ReaderPost mSourcePost; + private final long mSourcePostId; + private final long mSourceSiteId; private final ReaderRelatedPostList mLocalRelatedPosts; private final ReaderRelatedPostList mGlobalRelatedPosts; public RelatedPostsUpdated(@NonNull ReaderPost sourcePost, @NonNull ReaderRelatedPostList localRelatedPosts, @NonNull ReaderRelatedPostList globalRelatedPosts) { - mSourcePost = sourcePost; + mSourcePostId = sourcePost.postId; + mSourceSiteId = sourcePost.blogId; mLocalRelatedPosts = localRelatedPosts; mGlobalRelatedPosts = globalRelatedPosts; } - public ReaderPost getSourcePost() { - return mSourcePost; + public long getSourcePostId() { + return mSourcePostId; + } + public long getSourceSiteId() { + return mSourceSiteId; } public ReaderRelatedPostList getLocalRelatedPosts() { return mLocalRelatedPosts; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 7a11411dd1a2..81a6e2ce4d6a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -446,7 +446,7 @@ public void onEventMainThread(ReaderEvents.RelatedPostsUpdated event) { if (!isAdded() || !hasPost()) return; // make sure this event is for the current post - if (event.getSourcePost().postId == mPost.postId && event.getSourcePost().blogId == mPost.blogId) { + if (event.getSourcePostId() == mPost.postId && event.getSourceSiteId() == mPost.blogId) { if (event.hasLocalRelatedPosts()) { showRelatedPosts(event.getLocalRelatedPosts(), false); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java index b4ec63c352c8..e8b00b0aa93b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderRelatedPost.java @@ -4,8 +4,6 @@ import android.text.TextUtils; import org.json.JSONObject; -import org.wordpress.android.ui.reader.ReaderConstants; -import org.wordpress.android.ui.reader.utils.ImageSizeMap; import org.wordpress.android.util.HtmlUtils; import org.wordpress.android.util.JSONUtils; @@ -15,27 +13,31 @@ public class ReaderRelatedPost { private long mPostId; private long mSiteId; + private boolean mIsFollowing; + private String mTitle; private String mAuthorName; private String mAuthorAvatarUrl; private String mExcerpt; private String mSiteName; private String mFeaturedImageUrl; - private boolean mIsFollowing; - // these are the specific fields we should ask for when requesting related posts from the endpoint - public static final String RELATED_POST_FIELDS = "ID,site_ID,title,excerpt,site_name,featured_image,is_following,author,attachments"; + // these are the specific fields we should ask for when requesting related posts from + // the endpoint - note that we want to avoid ever requesting the post content, since + // that makes the call much heavier + public static final String RELATED_POST_FIELDS = "ID,site_ID,title,excerpt,site_name,is_following,author,featured_image,featured_media"; public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { ReaderRelatedPost post = new ReaderRelatedPost(); post.mPostId = json.optLong("ID"); post.mSiteId = json.optLong("site_ID"); + post.mIsFollowing = JSONUtils.getBool(json, "is_following"); + post.mTitle = JSONUtils.getStringDecoded(json, "title"); post.mExcerpt = HtmlUtils.fastStripHtml(JSONUtils.getString(json, "excerpt")).trim(); post.mSiteName = JSONUtils.getStringDecoded(json, "site_name"); post.mFeaturedImageUrl = JSONUtils.getString(json, "featured_image"); - post.mIsFollowing = JSONUtils.getBool(json, "is_following"); JSONObject jsonAuthor = json.optJSONObject("author"); if (jsonAuthor != null) { @@ -43,11 +45,13 @@ public static ReaderRelatedPost fromJson(@NonNull JSONObject json) { post.mAuthorAvatarUrl = JSONUtils.getString(jsonAuthor, "avatar_URL"); } - // if the post doesn't have an assigned featured image, try to guess one from its attachments - if (!post.hasFeaturedImageUrl() && json.has("attachments")) { - JSONObject jsonAttachments = json.optJSONObject("attachments"); - post.mFeaturedImageUrl = new ImageSizeMap(jsonAttachments.toString()) - .getLargestImageUrl(ReaderConstants.MIN_FEATURED_IMAGE_WIDTH); + // if there's no featured image, check if featured media has been set to an image + if (!post.hasFeaturedImageUrl() && json.has("featured_media")) { + JSONObject jsonMedia = json.optJSONObject("featured_media"); + String type = JSONUtils.getString(jsonMedia, "type"); + if (type.equals("image")) { + post.mFeaturedImageUrl = JSONUtils.getString(jsonMedia, "uri"); + } } return post; @@ -97,10 +101,6 @@ public boolean hasExcerpt() { return !TextUtils.isEmpty(mExcerpt); } - public boolean hasAuthorName() { - return !TextUtils.isEmpty(mAuthorName); - } - public boolean hasAuthorAvatarUrl() { return !TextUtils.isEmpty(mAuthorAvatarUrl); } From 7593c9d9f3091c8250c99ac3486a510395db4a86 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Sat, 8 Oct 2016 20:04:04 -0400 Subject: [PATCH 33/41] Enlarge follow icon when there's no caption --- .../ui/reader/ReaderPostDetailFragment.java | 2 -- .../ui/reader/views/ReaderFollowButton.java | 6 +++- .../main/res/layout/reader_related_post.xml | 36 ++++++++++--------- WordPress/src/main/res/values/attrs.xml | 2 +- WordPress/src/main/res/values/dimens.xml | 3 +- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java index 81a6e2ce4d6a..88c6ab4b6991 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.java @@ -56,7 +56,6 @@ import org.wordpress.android.util.UrlUtils; import org.wordpress.android.util.helpers.SwipeToRefreshHelper; import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout; -import org.wordpress.android.widgets.WPNetworkImageView; import org.wordpress.android.widgets.WPScrollView; import org.wordpress.android.widgets.WPScrollView.ScrollDirectionListener; @@ -797,7 +796,6 @@ protected void onPostExecute(Boolean result) { TextView txtTitle = (TextView) getView().findViewById(R.id.text_title); TextView txtDateline = (TextView) getView().findViewById(R.id.text_dateline); - WPNetworkImageView imgBlavatar = (WPNetworkImageView) getView().findViewById(R.id.image_blavatar); ReaderTagStrip tagStrip = (ReaderTagStrip) getView().findViewById(R.id.tag_strip); ReaderPostDetailHeaderView headerView = (ReaderPostDetailHeaderView) getView().findViewById(R.id.header_view); if (!canShowFooter()) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java index 48dfc76634e6..9131fb5ed3c5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderFollowButton.java @@ -50,13 +50,17 @@ private void initView(Context context, AttributeSet attrs) { if (attrs != null) { TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ReaderFollowButton, 0, 0); if (array != null) { - mShowCaption = array.getBoolean(R.styleable.ReaderFollowButton_wpShowCaption, true); + mShowCaption = array.getBoolean(R.styleable.ReaderFollowButton_wpShowFollowButtonCaption, true); } } + // hide follow text and enlarge the follow icon if there's no caption if (!mShowCaption) { mTextFollow.setText(null); mTextFollow.setVisibility(View.GONE); + int iconSz = context.getResources().getDimensionPixelSize(R.dimen.reader_follow_icon_no_caption); + mImageFollow.getLayoutParams().width = iconSz; + mImageFollow.getLayoutParams().height = iconSz; } } diff --git a/WordPress/src/main/res/layout/reader_related_post.xml b/WordPress/src/main/res/layout/reader_related_post.xml index 3125add56391..30231c04ec67 100644 --- a/WordPress/src/main/res/layout/reader_related_post.xml +++ b/WordPress/src/main/res/layout/reader_related_post.xml @@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" - app:wpShowCaption="false" /> + app:wpShowFollowButtonCaption="false" /> - + android:orientation="vertical"> - + + + + diff --git a/WordPress/src/main/res/values/attrs.xml b/WordPress/src/main/res/values/attrs.xml index 1ede5da1b44b..144082aa5bf3 100644 --- a/WordPress/src/main/res/values/attrs.xml +++ b/WordPress/src/main/res/values/attrs.xml @@ -68,7 +68,7 @@ ReaderFollowButton attributes --> - +