From e54f9c7103fee5a27bcc634c5f1b860c31fdcc93 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 16:38:15 -0400 Subject: [PATCH 001/104] First pass at ReaderTagStrip --- .../wordpress/android/models/ReaderPost.java | 5 +- .../ui/reader/views/ReaderTagStrip.java | 91 +++++++++++++++++++ .../src/main/res/layout/reader_tag_strip.xml | 23 +++++ .../res/layout/reader_tag_strip_label.xml | 11 +++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java create mode 100644 WordPress/src/main/res/layout/reader_tag_strip.xml create mode 100644 WordPress/src/main/res/layout/reader_tag_strip_label.xml diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java index ee96aaa5fec4..637417bc93f7 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java +++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java @@ -468,7 +468,7 @@ public void setPrimaryTag(String tagName) { this.primaryTag = StringUtils.notNullStr(tagName); } } - boolean hasPrimaryTag() { + public boolean hasPrimaryTag() { return !TextUtils.isEmpty(primaryTag); } @@ -480,6 +480,9 @@ public void setSecondaryTag(String tagName) { this.secondaryTag = StringUtils.notNullStr(tagName); } } + public boolean hasSecondaryTag() { + return !TextUtils.isEmpty(secondaryTag); + } /* * attachments are stored as the actual JSON to avoid having a separate table for diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java new file mode 100644 index 000000000000..27f09bfaa637 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java @@ -0,0 +1,91 @@ +package org.wordpress.android.ui.reader.views; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.models.ReaderPost; +import org.wordpress.android.models.ReaderTag; +import org.wordpress.android.models.ReaderTagType; +import org.wordpress.android.ui.reader.ReaderActivityLauncher; +import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.util.AniUtils; + +/** + * used by the detail view to display a row of tags from a reader post + */ +public class ReaderTagStrip extends LinearLayout { + + private View mView; + private LinearLayout mContainer; + private int mNumTags; + + public ReaderTagStrip(Context context) { + super(context); + initView(context); + } + + public ReaderTagStrip(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + public ReaderTagStrip(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public ReaderTagStrip(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + initView(context); + } + + private void initView(Context context) { + mView = inflate(context, R.layout.reader_tag_strip, this); + mContainer = (LinearLayout) mView.findViewById(R.id.tag_strip_container); + } + + private void addTag(final String tagName) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + View view = inflater.inflate(R.layout.reader_tag_strip_label, mContainer, false); + + TextView txtTag = (TextView) view.findViewById(R.id.text_tag); + txtTag.setText(tagName); + txtTag.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + ReaderTag tag = ReaderUtils.createTagFromTagName(tagName, ReaderTagType.FOLLOWED); + ReaderActivityLauncher.showReaderTagPreview(v.getContext(), tag); + } + }); + + mContainer.addView(view); + mNumTags++; + } + + public void setPost(@NonNull ReaderPost post) { + mContainer.removeAllViews(); + mNumTags = 0; + + if (post.hasPrimaryTag()) { + addTag(post.getPrimaryTag()); + } + if (post.hasSecondaryTag()) { + addTag(post.getSecondaryTag()); + } + + if (mNumTags == 0) { + mView.setVisibility(View.GONE); + } else if (mView.getVisibility() != View.VISIBLE) { + AniUtils.fadeIn(mView, AniUtils.Duration.SHORT); + } + } +} diff --git a/WordPress/src/main/res/layout/reader_tag_strip.xml b/WordPress/src/main/res/layout/reader_tag_strip.xml new file mode 100644 index 000000000000..327474fb7e14 --- /dev/null +++ b/WordPress/src/main/res/layout/reader_tag_strip.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/WordPress/src/main/res/layout/reader_tag_strip_label.xml b/WordPress/src/main/res/layout/reader_tag_strip_label.xml new file mode 100644 index 000000000000..561f2043c28f --- /dev/null +++ b/WordPress/src/main/res/layout/reader_tag_strip_label.xml @@ -0,0 +1,11 @@ + + + \ No newline at end of file From 10c34bcb1fb327cb6bc4a8d4060309e0dba040c0 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 16:53:47 -0400 Subject: [PATCH 002/104] 2nd pass at ReaderTagStrip --- .../ui/reader/ReaderPostDetailFragment.java | 4 ++ .../ui/reader/views/ReaderTagStrip.java | 3 +- .../reader_include_post_detail_content.xml | 58 ++++++++++--------- .../src/main/res/layout/reader_tag_strip.xml | 7 +-- .../res/layout/reader_tag_strip_label.xml | 3 + WordPress/src/main/res/values/dimens.xml | 1 + 6 files changed, 45 insertions(+), 31 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 ef7c9245b13b..bb34f4ec90e7 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 @@ -44,6 +44,7 @@ import org.wordpress.android.ui.reader.views.ReaderFollowButton; import org.wordpress.android.ui.reader.views.ReaderIconCountView; import org.wordpress.android.ui.reader.views.ReaderLikingUsersView; +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; import org.wordpress.android.ui.reader.views.ReaderWebView.ReaderWebViewPageFinishedListener; @@ -839,6 +840,7 @@ protected void onPostExecute(Boolean result) { TextView txtDomain = (TextView) getView().findViewById(R.id.text_domain); TextView txtDateline = (TextView) getView().findViewById(R.id.text_dateline); TextView txtTag = (TextView) getView().findViewById(R.id.text_tag); + ReaderTagStrip tagStrip = (ReaderTagStrip) getView().findViewById(R.id.tag_strip); WPNetworkImageView imgBlavatar = (WPNetworkImageView) getView().findViewById(R.id.image_blavatar); WPNetworkImageView imgAvatar = (WPNetworkImageView) getView().findViewById(R.id.image_avatar); @@ -920,6 +922,8 @@ public void onClick(View v) { txtDateline.setText(timestamp); } + tagStrip.setPost(mPost); + final String tagToDisplay = mPost.getTagForDisplay(null); if (!TextUtils.isEmpty(tagToDisplay)) { txtTag.setText(ReaderUtils.makeHashTag(tagToDisplay)); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java index 27f09bfaa637..7e371d687981 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java @@ -58,7 +58,8 @@ private void addTag(final String tagName) { View view = inflater.inflate(R.layout.reader_tag_strip_label, mContainer, false); TextView txtTag = (TextView) view.findViewById(R.id.text_tag); - txtTag.setText(tagName); + txtTag.setText(mNumTags > 0 ? ", " + tagName : tagName); + txtTag.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { 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 369af6023cff..c6144ba4ec15 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 @@ -18,32 +18,6 @@ android:layout_alignRight="@+id/reader_webview" tools:text="text_title" /> - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/WordPress/src/main/res/layout/reader_tag_strip.xml b/WordPress/src/main/res/layout/reader_tag_strip.xml index 327474fb7e14..a53a508699ee 100644 --- a/WordPress/src/main/res/layout/reader_tag_strip.xml +++ b/WordPress/src/main/res/layout/reader_tag_strip.xml @@ -3,14 +3,13 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:selectableItemBackground" android:orientation="horizontal"> diff --git a/WordPress/src/main/res/layout/reader_tag_strip_label.xml b/WordPress/src/main/res/layout/reader_tag_strip_label.xml index 561f2043c28f..cafb8df0bf47 100644 --- a/WordPress/src/main/res/layout/reader_tag_strip_label.xml +++ b/WordPress/src/main/res/layout/reader_tag_strip_label.xml @@ -6,6 +6,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" + android:background="?android:selectableItemBackground" + android:ellipsize="end" + android:maxLines="1" android:textColor="@color/blue_medium" android:textSize="@dimen/text_sz_medium" tools:text="tagName" /> \ 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 139dd8db73aa..9e00e105aaa3 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -113,6 +113,7 @@ 24dp 16dp 48dp + 18dp 48dp From d0b2322226d9c2c2022de2934a0d07de007ce66e Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 16:55:54 -0400 Subject: [PATCH 003/104] Remove tag from footer --- .../ui/reader/ReaderPostDetailFragment.java | 15 --------------- .../layout/reader_include_post_detail_footer.xml | 15 --------------- 2 files changed, 30 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 bb34f4ec90e7..4e538ee45b72 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 @@ -26,8 +26,6 @@ import org.wordpress.android.datasets.ReaderPostTable; import org.wordpress.android.models.ReaderPost; import org.wordpress.android.models.ReaderPostDiscoverData; -import org.wordpress.android.models.ReaderTag; -import org.wordpress.android.models.ReaderTagType; import org.wordpress.android.ui.main.WPMainActivity; import org.wordpress.android.ui.reader.ReaderActivityLauncher.OpenUrlType; import org.wordpress.android.ui.reader.ReaderActivityLauncher.PhotoViewerOption; @@ -839,7 +837,6 @@ protected void onPostExecute(Boolean result) { TextView txtBlogName = (TextView) getView().findViewById(R.id.text_blog_name); TextView txtDomain = (TextView) getView().findViewById(R.id.text_domain); TextView txtDateline = (TextView) getView().findViewById(R.id.text_dateline); - TextView txtTag = (TextView) getView().findViewById(R.id.text_tag); ReaderTagStrip tagStrip = (ReaderTagStrip) getView().findViewById(R.id.tag_strip); WPNetworkImageView imgBlavatar = (WPNetworkImageView) getView().findViewById(R.id.image_blavatar); @@ -924,18 +921,6 @@ public void onClick(View v) { tagStrip.setPost(mPost); - final String tagToDisplay = mPost.getTagForDisplay(null); - if (!TextUtils.isEmpty(tagToDisplay)) { - txtTag.setText(ReaderUtils.makeHashTag(tagToDisplay)); - txtTag.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ReaderTag tag = ReaderUtils.getTagFromTagName(tagToDisplay, ReaderTagType.FOLLOWED); - ReaderActivityLauncher.showReaderTagPreview(v.getContext(), tag); - } - }); - } - if (canShowFooter() && mLayoutFooter.getVisibility() != View.VISIBLE) { AniUtils.fadeIn(mLayoutFooter, AniUtils.Duration.LONG); } diff --git a/WordPress/src/main/res/layout/reader_include_post_detail_footer.xml b/WordPress/src/main/res/layout/reader_include_post_detail_footer.xml index 023caf29cc7e..cce7d2bb60a0 100644 --- a/WordPress/src/main/res/layout/reader_include_post_detail_footer.xml +++ b/WordPress/src/main/res/layout/reader_include_post_detail_footer.xml @@ -27,21 +27,6 @@ android:layout_marginRight="@dimen/reader_detail_margin" android:layout_marginTop="@dimen/margin_medium"> - - Date: Thu, 29 Sep 2016 17:02:56 -0400 Subject: [PATCH 004/104] Removed avatar from dateline --- .../android/ui/reader/ReaderPostDetailFragment.java | 10 +--------- .../res/layout/reader_include_post_detail_content.xml | 7 ------- .../res/layout/reader_include_post_detail_footer.xml | 2 +- 3 files changed, 2 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 4e538ee45b72..0c9228751f95 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 @@ -837,10 +837,9 @@ protected void onPostExecute(Boolean result) { TextView txtBlogName = (TextView) getView().findViewById(R.id.text_blog_name); TextView txtDomain = (TextView) getView().findViewById(R.id.text_domain); TextView txtDateline = (TextView) getView().findViewById(R.id.text_dateline); - ReaderTagStrip tagStrip = (ReaderTagStrip) getView().findViewById(R.id.tag_strip); WPNetworkImageView imgBlavatar = (WPNetworkImageView) getView().findViewById(R.id.image_blavatar); - WPNetworkImageView imgAvatar = (WPNetworkImageView) getView().findViewById(R.id.image_avatar); + ReaderTagStrip tagStrip = (ReaderTagStrip) getView().findViewById(R.id.tag_strip); ViewGroup layoutHeader = (ViewGroup) getView().findViewById(R.id.layout_post_detail_header); ReaderFollowButton followButton = (ReaderFollowButton) layoutHeader.findViewById(R.id.follow_button); @@ -903,13 +902,6 @@ public void onClick(View v) { txtDomain.setText(null); } - if (mPost.hasPostAvatar()) { - int avatarSz = getResources().getDimensionPixelSize(R.dimen.avatar_sz_tiny); - imgAvatar.setImageUrl(mPost.getPostAvatarForDisplay(avatarSz), WPNetworkImageView.ImageType.AVATAR); - } else { - imgAvatar.showDefaultGravatarImage(); - } - String timestamp = DateTimeUtils.javaDateToTimeSpan(mPost.getDisplayDate(), WordPress.getContext()); if (mPost.hasAuthorName()) { txtDateline.setText(mPost.getAuthorName() + ReaderConstants.UNICODE_BULLET_WITH_SPACE + timestamp); 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 c6144ba4ec15..e177b39d1011 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 @@ -72,13 +72,6 @@ android:layout_below="@+id/text_title" android:orientation="horizontal"> - - From f621d86be9c17cfbd16e73f923aee6f409d83efb Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 17:03:49 -0400 Subject: [PATCH 005/104] Removed author name from dateline --- .../android/ui/reader/ReaderPostDetailFragment.java | 8 +------- 1 file changed, 1 insertion(+), 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 0c9228751f95..c8c181a7bd14 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 @@ -903,13 +903,7 @@ public void onClick(View v) { } String timestamp = DateTimeUtils.javaDateToTimeSpan(mPost.getDisplayDate(), WordPress.getContext()); - if (mPost.hasAuthorName()) { - txtDateline.setText(mPost.getAuthorName() + ReaderConstants.UNICODE_BULLET_WITH_SPACE + timestamp); - } else if (mPost.hasBlogName()) { - txtDateline.setText(mPost.getBlogName() + ReaderConstants.UNICODE_BULLET_WITH_SPACE + timestamp); - } else { - txtDateline.setText(timestamp); - } + txtDateline.setText(timestamp); tagStrip.setPost(mPost); From e1bbbba8b1a21c21b6922e7af19ab81a4955cd73 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 17:05:49 -0400 Subject: [PATCH 006/104] use larger font size for tag --- WordPress/src/main/res/layout/reader_tag_strip_label.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/res/layout/reader_tag_strip_label.xml b/WordPress/src/main/res/layout/reader_tag_strip_label.xml index cafb8df0bf47..d703aefdb4f9 100644 --- a/WordPress/src/main/res/layout/reader_tag_strip_label.xml +++ b/WordPress/src/main/res/layout/reader_tag_strip_label.xml @@ -10,5 +10,5 @@ android:ellipsize="end" android:maxLines="1" android:textColor="@color/blue_medium" - android:textSize="@dimen/text_sz_medium" + android:textSize="@dimen/text_sz_large" tools:text="tagName" /> \ No newline at end of file From 1f0368cca1a552c18e9a3242d99cf4936b3a9958 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 17:09:23 -0400 Subject: [PATCH 007/104] Changed tag icon size --- 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 9e00e105aaa3..0eb84bdcbfb7 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -113,7 +113,7 @@ 24dp 16dp 48dp - 18dp + 22dp 48dp From 54af70a4b9ffdc65fa5dbb3945490ad03b1ce58f Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 17:11:03 -0400 Subject: [PATCH 008/104] Increase dateline font size to match tag font size --- .../main/res/layout/reader_include_post_detail_content.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 e177b39d1011..f60a805512f1 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 @@ -74,11 +74,12 @@ Date: Thu, 29 Sep 2016 17:48:56 -0400 Subject: [PATCH 009/104] Fixed bug in ReaderPost that caused second tag to be skipped --- .../wordpress/android/models/ReaderPost.java | 5 ++- .../ui/reader/views/ReaderTagStrip.java | 38 ++++++++++--------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java index 637417bc93f7..a50681de0d72 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java +++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java @@ -286,6 +286,7 @@ private static void assignTagsFromJson(ReaderPost post, JSONObject jsonTags) { while (it.hasNext()) { JSONObject jsonThisTag = jsonTags.optJSONObject(it.next()); + String thisTagName = JSONUtils.getStringDecoded(jsonThisTag, "slug"); // if the number of posts on this blog that use this tag is higher than previous, // set this as the most popular tag, and set the second most popular tag to @@ -293,8 +294,10 @@ private static void assignTagsFromJson(ReaderPost post, JSONObject jsonTags) { int postCount = jsonThisTag.optInt("post_count"); if (postCount > popularCount) { nextMostPopularTag = mostPopularTag; - mostPopularTag = JSONUtils.getStringDecoded(jsonThisTag, "slug"); + mostPopularTag = thisTagName; popularCount = postCount; + } else if (nextMostPopularTag == null) { + nextMostPopularTag = thisTagName; } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java index 7e371d687981..cc22f4f1f813 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java @@ -17,6 +17,7 @@ import org.wordpress.android.ui.reader.ReaderActivityLauncher; import org.wordpress.android.ui.reader.utils.ReaderUtils; import org.wordpress.android.util.AniUtils; +import org.wordpress.android.util.AppLog; /** * used by the detail view to display a row of tags from a reader post @@ -53,6 +54,24 @@ private void initView(Context context) { mContainer = (LinearLayout) mView.findViewById(R.id.tag_strip_container); } + public void setPost(@NonNull ReaderPost post) { + mContainer.removeAllViews(); + mNumTags = 0; + + if (post.hasPrimaryTag()) { + addTag(post.getPrimaryTag()); + } + if (post.hasSecondaryTag()) { + addTag(post.getSecondaryTag()); + } + + if (mNumTags == 0) { + mView.setVisibility(View.GONE); + } else if (mView.getVisibility() != View.VISIBLE) { + AniUtils.fadeIn(mView, AniUtils.Duration.SHORT); + } + } + private void addTag(final String tagName) { LayoutInflater inflater = LayoutInflater.from(getContext()); View view = inflater.inflate(R.layout.reader_tag_strip_label, mContainer, false); @@ -70,23 +89,8 @@ public void onClick(View v) { mContainer.addView(view); mNumTags++; - } - - public void setPost(@NonNull ReaderPost post) { - mContainer.removeAllViews(); - mNumTags = 0; - if (post.hasPrimaryTag()) { - addTag(post.getPrimaryTag()); - } - if (post.hasSecondaryTag()) { - addTag(post.getSecondaryTag()); - } - - if (mNumTags == 0) { - mView.setVisibility(View.GONE); - } else if (mView.getVisibility() != View.VISIBLE) { - AniUtils.fadeIn(mView, AniUtils.Duration.SHORT); - } + // TODO: remove logging + AppLog.w(AppLog.T.READER, "Added tag " + tagName); } } From 68e8e8aef1c12191929f2a346030ac60cf2582f4 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 17:55:29 -0400 Subject: [PATCH 010/104] Removed tag icon, using "#" before tag name to match list view --- .../ui/reader/views/ReaderTagStrip.java | 21 +++++++------------ .../src/main/res/layout/reader_tag_strip.xml | 20 ++---------------- WordPress/src/main/res/values/dimens.xml | 1 - 3 files changed, 10 insertions(+), 32 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java index cc22f4f1f813..d587b7622e37 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java @@ -17,15 +17,13 @@ import org.wordpress.android.ui.reader.ReaderActivityLauncher; import org.wordpress.android.ui.reader.utils.ReaderUtils; import org.wordpress.android.util.AniUtils; -import org.wordpress.android.util.AppLog; /** * used by the detail view to display a row of tags from a reader post */ public class ReaderTagStrip extends LinearLayout { - private View mView; - private LinearLayout mContainer; + private LinearLayout mView; private int mNumTags; public ReaderTagStrip(Context context) { @@ -50,12 +48,11 @@ public ReaderTagStrip(Context context, AttributeSet attrs, int defStyleAttr, int } private void initView(Context context) { - mView = inflate(context, R.layout.reader_tag_strip, this); - mContainer = (LinearLayout) mView.findViewById(R.id.tag_strip_container); + mView = (LinearLayout) inflate(context, R.layout.reader_tag_strip, this); } public void setPost(@NonNull ReaderPost post) { - mContainer.removeAllViews(); + mView.removeAllViews(); mNumTags = 0; if (post.hasPrimaryTag()) { @@ -74,10 +71,11 @@ public void setPost(@NonNull ReaderPost post) { private void addTag(final String tagName) { LayoutInflater inflater = LayoutInflater.from(getContext()); - View view = inflater.inflate(R.layout.reader_tag_strip_label, mContainer, false); + View tagView = inflater.inflate(R.layout.reader_tag_strip_label, mView, false); - TextView txtTag = (TextView) view.findViewById(R.id.text_tag); - txtTag.setText(mNumTags > 0 ? ", " + tagName : tagName); + TextView txtTag = (TextView) tagView.findViewById(R.id.text_tag); + String tagDisplayName = mNumTags > 0 ? ", " + ReaderUtils.makeHashTag(tagName) : ReaderUtils.makeHashTag(tagName); + txtTag.setText(tagDisplayName); txtTag.setOnClickListener(new OnClickListener() { @Override @@ -87,10 +85,7 @@ public void onClick(View v) { } }); - mContainer.addView(view); + mView.addView(tagView); mNumTags++; - - // TODO: remove logging - AppLog.w(AppLog.T.READER, "Added tag " + tagName); } } diff --git a/WordPress/src/main/res/layout/reader_tag_strip.xml b/WordPress/src/main/res/layout/reader_tag_strip.xml index a53a508699ee..bc3ab11ef6a9 100644 --- a/WordPress/src/main/res/layout/reader_tag_strip.xml +++ b/WordPress/src/main/res/layout/reader_tag_strip.xml @@ -1,22 +1,6 @@ - - - - - \ No newline at end of file + android:layout_gravity="center_vertical" + android:orientation="horizontal" /> \ 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 0eb84bdcbfb7..139dd8db73aa 100644 --- a/WordPress/src/main/res/values/dimens.xml +++ b/WordPress/src/main/res/values/dimens.xml @@ -113,7 +113,6 @@ 24dp 16dp 48dp - 22dp 48dp From 6f09250f05a11fc19c2338da523786734359cb9c Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 18:43:43 -0400 Subject: [PATCH 011/104] Don't add secondary tag if it will take up too much space --- .../ui/reader/views/ReaderTagStrip.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java index d587b7622e37..8e533a424cc5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java @@ -2,6 +2,8 @@ import android.annotation.TargetApi; import android.content.Context; +import android.graphics.Paint; +import android.graphics.Rect; import android.os.Build; import android.support.annotation.NonNull; import android.util.AttributeSet; @@ -17,14 +19,16 @@ import org.wordpress.android.ui.reader.ReaderActivityLauncher; import org.wordpress.android.ui.reader.utils.ReaderUtils; import org.wordpress.android.util.AniUtils; +import org.wordpress.android.util.DisplayUtils; /** - * used by the detail view to display a row of tags from a reader post + * used by the detail view to display the primary and secondary tags from a reader post */ public class ReaderTagStrip extends LinearLayout { private LinearLayout mView; private int mNumTags; + private String mAllTags; public ReaderTagStrip(Context context) { super(context); @@ -70,13 +74,37 @@ public void setPost(@NonNull ReaderPost post) { } private void addTag(final String tagName) { + String tagDisplayName = mNumTags > 0 ? ", " + ReaderUtils.makeHashTag(tagName) : ReaderUtils.makeHashTag(tagName); + + // inflate a new textView to show this tag LayoutInflater inflater = LayoutInflater.from(getContext()); View tagView = inflater.inflate(R.layout.reader_tag_strip_label, mView, false); - TextView txtTag = (TextView) tagView.findViewById(R.id.text_tag); - String tagDisplayName = mNumTags > 0 ? ", " + ReaderUtils.makeHashTag(tagName) : ReaderUtils.makeHashTag(tagName); + mView.addView(tagView); + + // skip showing this tag if it will make the view wider than the max + if (mNumTags > 0) { + // determine the width of the passed tag in the new textView + Rect rect = new Rect(); + Paint paint = txtTag.getPaint(); + paint.getTextBounds(tagDisplayName, 0, tagDisplayName.length(), rect); + int tagWidth = rect.width(); + + // determine the width of the tag already displayed + paint.getTextBounds(mAllTags, 0, mAllTags.length(), rect); + int currentWidth = rect.width(); + + int maxWidth = DisplayUtils.getDisplayPixelWidth(getContext()); + if (currentWidth + tagWidth > maxWidth) { + return; + } + } + txtTag.setText(tagDisplayName); + mAllTags += tagDisplayName; + mNumTags++; + // show all posts with this tag when the tag is clicked txtTag.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -84,8 +112,5 @@ public void onClick(View v) { ReaderActivityLauncher.showReaderTagPreview(v.getContext(), tag); } }); - - mView.addView(tagView); - mNumTags++; } } From 90bd2a34ec633e7ef5f60664ef6f04f5304488b5 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 18:46:44 -0400 Subject: [PATCH 012/104] Minor tweaks --- .../ui/reader/views/ReaderTagStrip.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java index 8e533a424cc5..53d1c3ae244f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagStrip.java @@ -56,7 +56,10 @@ private void initView(Context context) { } public void setPost(@NonNull ReaderPost post) { - mView.removeAllViews(); + if (mView.getChildCount() > 0) { + mView.removeAllViews(); + } + mNumTags = 0; if (post.hasPrimaryTag()) { @@ -78,9 +81,8 @@ private void addTag(final String tagName) { // inflate a new textView to show this tag LayoutInflater inflater = LayoutInflater.from(getContext()); - View tagView = inflater.inflate(R.layout.reader_tag_strip_label, mView, false); - TextView txtTag = (TextView) tagView.findViewById(R.id.text_tag); - mView.addView(tagView); + TextView txtTag = (TextView) inflater.inflate(R.layout.reader_tag_strip_label, mView, false); + mView.addView(txtTag); // skip showing this tag if it will make the view wider than the max if (mNumTags > 0) { @@ -88,14 +90,14 @@ private void addTag(final String tagName) { Rect rect = new Rect(); Paint paint = txtTag.getPaint(); paint.getTextBounds(tagDisplayName, 0, tagDisplayName.length(), rect); - int tagWidth = rect.width(); + int thisTagWidth = rect.width(); // determine the width of the tag already displayed paint.getTextBounds(mAllTags, 0, mAllTags.length(), rect); - int currentWidth = rect.width(); + int currentTagWidth = rect.width(); int maxWidth = DisplayUtils.getDisplayPixelWidth(getContext()); - if (currentWidth + tagWidth > maxWidth) { + if (currentTagWidth + thisTagWidth > maxWidth) { return; } } @@ -104,7 +106,7 @@ private void addTag(final String tagName) { mAllTags += tagDisplayName; mNumTags++; - // show all posts with this tag when the tag is clicked + // show all posts with this tag when clicked txtTag.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { From 4ba253109633b9b3b46a5ce9519ecfb6ce5dc60e Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 19:04:44 -0400 Subject: [PATCH 013/104] Show longer like/comment labels in footer --- .../ui/reader/views/ReaderIconCountView.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java index 9e2ff2fd2e97..f902a8d4dce7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java @@ -86,6 +86,18 @@ public void setEnabled(boolean enabled) { } public void setCount(int count) { - mTextCount.setText(FormatUtils.formatInt(count)); + String text; + switch (mIconType) { + case ICON_LIKE: + text = ReaderUtils.getShortLikeLabelText(getContext(), count); + break; + case ICON_COMMENT: + text = ReaderUtils.getShortCommentLabelText(getContext(), count); + break; + default: + return; + } + + mTextCount.setText(text); } } \ No newline at end of file From 7bf8d7b4f9aca1bb4c9c5ac68c05db4a5c549ec0 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 29 Sep 2016 19:09:18 -0400 Subject: [PATCH 014/104] Minor tweaks to like/comment counts --- .../android/ui/reader/views/ReaderIconCountView.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java index f902a8d4dce7..9a5566264d6e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderIconCountView.java @@ -10,7 +10,6 @@ import org.wordpress.android.R; import org.wordpress.android.ui.reader.utils.ReaderUtils; -import org.wordpress.android.util.FormatUtils; /* * used when showing comment + comment count, like + like count @@ -86,18 +85,13 @@ public void setEnabled(boolean enabled) { } public void setCount(int count) { - String text; switch (mIconType) { case ICON_LIKE: - text = ReaderUtils.getShortLikeLabelText(getContext(), count); + mTextCount.setText(ReaderUtils.getShortLikeLabelText(getContext(), count)); break; case ICON_COMMENT: - text = ReaderUtils.getShortCommentLabelText(getContext(), count); + mTextCount.setText(ReaderUtils.getShortCommentLabelText(getContext(), count)); break; - default: - return; } - - mTextCount.setText(text); } } \ No newline at end of file From ab930c9e17aa9409988a49f6646bbb7344ebee56 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 30 Sep 2016 08:23:06 -0400 Subject: [PATCH 015/104] First pass at header view --- .../views/ReaderPostDetailHeaderView.java | 134 ++++++++++++++++++ .../layout/reader_post_detail_header_view.xml | 73 ++++++++++ .../src/main/res/values/reader_styles.xml | 4 + 3 files changed, 211 insertions(+) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.java create mode 100644 WordPress/src/main/res/layout/reader_post_detail_header_view.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.java new file mode 100644 index 000000000000..b714abb57e46 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.java @@ -0,0 +1,134 @@ +package org.wordpress.android.ui.reader.views; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.models.ReaderPost; +import org.wordpress.android.ui.reader.actions.ReaderActions; +import org.wordpress.android.ui.reader.actions.ReaderBlogActions; +import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.util.NetworkUtils; +import org.wordpress.android.util.ToastUtils; +import org.wordpress.android.widgets.WPNetworkImageView; + +/** + * topmost view in post detail + */ +public class ReaderPostDetailHeaderView extends LinearLayout { + + private ReaderPost mPost; + private ReaderFollowButton mFollowButton; + + public ReaderPostDetailHeaderView(Context context) { + super(context); + initView(context); + } + + public ReaderPostDetailHeaderView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + public ReaderPostDetailHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context); + } + + private void initView(Context context) { + View view = inflate(context, R.layout.reader_post_detail_header_view, this); + mFollowButton = (ReaderFollowButton) view.findViewById(R.id.follow_button); + } + + public void setPost(@NonNull ReaderPost post) { + mPost = post; + + TextView txtTitle = (TextView) findViewById(R.id.text_title); + TextView txtAuthorName = (TextView) findViewById(R.id.text_author_name); + TextView txtFollowCount = (TextView) findViewById(R.id.text_blog_follow_count); + WPNetworkImageView imgAvatar = (WPNetworkImageView) findViewById(R.id.image_avatar); + + boolean hasBlogName = mPost.hasBlogName(); + boolean hasAuthorName = mPost.hasAuthorName(); + + if (hasBlogName && hasAuthorName) { + txtTitle.setText(mPost.getBlogName()); + // don't show author name if it's the same as the blog name + if (mPost.getAuthorName().equals(mPost.getBlogName())) { + txtAuthorName.setVisibility(View.GONE); + } else { + txtAuthorName.setText(mPost.getAuthorName()); + txtAuthorName.setVisibility(View.VISIBLE); + } + } else if (hasBlogName) { + txtTitle.setText(mPost.getBlogName()); + txtAuthorName.setVisibility(View.GONE); + } else if (hasAuthorName) { + txtTitle.setText(mPost.getAuthorName()); + txtAuthorName.setVisibility(View.GONE); + } else { + txtTitle.setText(R.string.untitled); + txtAuthorName.setVisibility(View.GONE); + } + + // TODO: get follower count + //txtFollowCount.setText(String.format(getContext().getString(R.string.reader_label_follow_count), blogInfo.numSubscribers)); + + if (ReaderUtils.isLoggedOutReader()) { + mFollowButton.setVisibility(View.GONE); + } else { + mFollowButton.setVisibility(View.VISIBLE); + mFollowButton.setIsFollowed(mPost.isFollowedByCurrentUser); + mFollowButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + toggleFollowStatus(); + } + }); + } + + // TODO: show avatar/blavatar + int avatarSize = getContext().getResources().getDimensionPixelSize(R.dimen.avatar_sz_large); + } + + private void toggleFollowStatus() { + if (!NetworkUtils.checkConnection(getContext())) { + return; + } + + final boolean isAskingToFollow = !mPost.isFollowedByCurrentUser; + + ReaderActions.ActionListener listener = new ReaderActions.ActionListener() { + @Override + public void onActionResult(boolean succeeded) { + if (getContext() == null) { + return; + } + mFollowButton.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); + mFollowButton.setIsFollowed(!isAskingToFollow); + } + } + }; + + // disable follow button until API call returns + mFollowButton.setEnabled(false); + + boolean result; + if (mPost.feedId != 0) { + result = ReaderBlogActions.followFeedById(mPost.feedId, isAskingToFollow, listener); + } else { + result = ReaderBlogActions.followBlogById(mPost.blogId, isAskingToFollow, listener); + } + + if (result) { + mFollowButton.setIsFollowedAnimated(isAskingToFollow); + } + } +} diff --git a/WordPress/src/main/res/layout/reader_post_detail_header_view.xml b/WordPress/src/main/res/layout/reader_post_detail_header_view.xml new file mode 100644 index 000000000000..3ca2276676b0 --- /dev/null +++ b/WordPress/src/main/res/layout/reader_post_detail_header_view.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/WordPress/src/main/res/values/reader_styles.xml b/WordPress/src/main/res/values/reader_styles.xml index 838e9a79a41b..47f389140bfb 100644 --- a/WordPress/src/main/res/values/reader_styles.xml +++ b/WordPress/src/main/res/values/reader_styles.xml @@ -99,6 +99,10 @@ @dimen/avatar_sz_medium @dimen/avatar_sz_medium + -