From 386a9117fa6232ec139c7da6e81e818be1920e92 Mon Sep 17 00:00:00 2001 From: Renan Ferrari Date: Wed, 29 Jan 2020 22:33:25 -0300 Subject: [PATCH 1/5] Adding follow button to Reader's followed sites item --- .../main/res/layout/reader_listitem_blog.xml | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/WordPress/src/main/res/layout/reader_listitem_blog.xml b/WordPress/src/main/res/layout/reader_listitem_blog.xml index aeaa25fb9bdc..e68c934da880 100644 --- a/WordPress/src/main/res/layout/reader_listitem_blog.xml +++ b/WordPress/src/main/res/layout/reader_listitem_blog.xml @@ -4,24 +4,26 @@ list item which shows a recommended or followed blog - see ReaderBlogAdapter --> + android:paddingBottom="@dimen/margin_large"> + android:layout_weight="0" + android:contentDescription="@null" + tools:src="@drawable/bg_rectangle_neutral_10_globe_32dp" /> + tools:text="text_title" /> + + From a872e8b6d375a0d338b017a082cbf701aebeef74 Mon Sep 17 00:00:00 2001 From: Renan Ferrari Date: Wed, 29 Jan 2020 22:39:24 -0300 Subject: [PATCH 2/5] Implementing follow button in Reader's followed sites item --- .../ui/reader/adapters/ReaderBlogAdapter.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java index 5e7e0d2ae0d2..4467169779e8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java @@ -19,9 +19,13 @@ import org.wordpress.android.models.ReaderRecommendBlogList; import org.wordpress.android.models.ReaderRecommendedBlog; import org.wordpress.android.ui.reader.ReaderInterfaces; +import org.wordpress.android.ui.reader.actions.ReaderBlogActions; +import org.wordpress.android.ui.reader.views.ReaderFollowButton; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; +import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.StringUtils; +import org.wordpress.android.util.ToastUtils; import org.wordpress.android.util.UrlUtils; import org.wordpress.android.util.image.ImageManager; import org.wordpress.android.util.image.ImageType; @@ -151,6 +155,9 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { blogHolder.mTxtUrl.setText(""); } mImageManager.load(blogHolder.mImgBlog, ImageType.BLAVATAR, blogInfo.getImageUrl()); + blogHolder.mFollowButton.setIsFollowed(blogInfo.isFollowing); + blogHolder.mFollowButton.setOnClickListener( + v -> toggleFollow(blogHolder.itemView.getContext(), blogHolder.mFollowButton, blogInfo)); break; } @@ -181,6 +188,7 @@ class BlogViewHolder extends RecyclerView.ViewHolder { private final TextView mTxtDescription; private final TextView mTxtUrl; private final ImageView mImgBlog; + private final ReaderFollowButton mFollowButton; BlogViewHolder(View view) { super(view); @@ -189,14 +197,18 @@ class BlogViewHolder extends RecyclerView.ViewHolder { mTxtDescription = view.findViewById(R.id.text_description); mTxtUrl = view.findViewById(R.id.text_url); mImgBlog = view.findViewById(R.id.image_blog); + mFollowButton = view.findViewById(R.id.follow_button); // followed blogs don't have a description + // recommended blogs don't have a follow button switch (getBlogType()) { case FOLLOWED: mTxtDescription.setVisibility(View.GONE); + mFollowButton.setVisibility(View.VISIBLE); break; case RECOMMENDED: mTxtDescription.setVisibility(View.VISIBLE); + mFollowButton.setVisibility(View.GONE); break; } } @@ -204,6 +216,33 @@ class BlogViewHolder extends RecyclerView.ViewHolder { private boolean mIsTaskRunning = false; + private void toggleFollow(Context context, ReaderFollowButton followButton, ReaderBlog blog) { + if (!NetworkUtils.checkConnection(context)) { + return; + } + + final boolean isAskingToFollow = !blog.isFollowing; + + // disable follow button until API call returns + followButton.setEnabled(false); + + boolean result = ReaderBlogActions.followBlogById(blog.blogId, isAskingToFollow, succeeded -> { + followButton.setEnabled(true); + if (!succeeded) { + int errResId = isAskingToFollow ? R.string.reader_toast_err_follow_blog + : R.string.reader_toast_err_unfollow_blog; + ToastUtils.showToast(context, errResId); + followButton.setIsFollowed(!isAskingToFollow); + blog.isFollowing = !isAskingToFollow; + } + }); + + if (result) { + followButton.setIsFollowedAnimated(isAskingToFollow); + blog.isFollowing = isAskingToFollow; + } + } + private class LoadBlogsTask extends AsyncTask { private ReaderRecommendBlogList mTmpRecommendedBlogs; private ReaderBlogList mTmpFollowedBlogs; From c15a0fef8e7b64b00dcbb67b9c0f5d56c9c4e8fb Mon Sep 17 00:00:00 2001 From: Renan Ferrari Date: Fri, 31 Jan 2020 23:02:47 -0300 Subject: [PATCH 3/5] Replacing hardcoded dimensions with @dimen resources --- WordPress/src/main/res/layout/reader_listitem_blog.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/res/layout/reader_listitem_blog.xml b/WordPress/src/main/res/layout/reader_listitem_blog.xml index e68c934da880..5aeba08485b0 100644 --- a/WordPress/src/main/res/layout/reader_listitem_blog.xml +++ b/WordPress/src/main/res/layout/reader_listitem_blog.xml @@ -20,7 +20,7 @@ android:id="@+id/image_blog" android:layout_width="@dimen/avatar_sz_medium" android:layout_height="@dimen/avatar_sz_medium" - android:layout_marginEnd="@dimen/margin_large" + android:layout_marginEnd="@dimen/margin_extra_large" android:layout_weight="0" android:contentDescription="@null" tools:src="@drawable/bg_rectangle_neutral_10_globe_32dp" /> @@ -49,6 +49,7 @@ android:id="@+id/text_url" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/margin_medium" android:ellipsize="end" android:gravity="start" android:maxLines="1" @@ -61,6 +62,7 @@ android:id="@+id/text_description" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/margin_medium" android:ellipsize="end" android:gravity="start" android:maxLines="2" @@ -75,7 +77,7 @@ android:id="@+id/follow_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="16dp" + android:padding="@dimen/margin_medium" app:wpShowFollowButtonCaption="false" /> From 1d6381b2820e121d209332766e48135bd5870eed Mon Sep 17 00:00:00 2001 From: Renan Ferrari Date: Sat, 1 Feb 2020 00:55:00 -0300 Subject: [PATCH 4/5] Adding Architecture Infrastructure feature flags --- .../ui/reader/adapters/ReaderBlogAdapter.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java index 4467169779e8..6eb7e3935eae 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java @@ -36,6 +36,10 @@ import javax.inject.Inject; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; +import static org.wordpress.android.BuildConfig.INFORMATION_ARCHITECTURE_AVAILABLE; + /* * adapter which shows either recommended or followed blogs - used by ReaderBlogFragment */ @@ -155,9 +159,13 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { blogHolder.mTxtUrl.setText(""); } mImageManager.load(blogHolder.mImgBlog, ImageType.BLAVATAR, blogInfo.getImageUrl()); - blogHolder.mFollowButton.setIsFollowed(blogInfo.isFollowing); - blogHolder.mFollowButton.setOnClickListener( - v -> toggleFollow(blogHolder.itemView.getContext(), blogHolder.mFollowButton, blogInfo)); + if (INFORMATION_ARCHITECTURE_AVAILABLE) { + blogHolder.mFollowButton.setIsFollowed(blogInfo.isFollowing); + blogHolder.mFollowButton.setOnClickListener(v -> toggleFollow( + blogHolder.itemView.getContext(), + blogHolder.mFollowButton, + blogInfo)); + } break; } @@ -203,12 +211,12 @@ class BlogViewHolder extends RecyclerView.ViewHolder { // recommended blogs don't have a follow button switch (getBlogType()) { case FOLLOWED: - mTxtDescription.setVisibility(View.GONE); - mFollowButton.setVisibility(View.VISIBLE); + mTxtDescription.setVisibility(GONE); + mFollowButton.setVisibility(INFORMATION_ARCHITECTURE_AVAILABLE ? VISIBLE : GONE); break; case RECOMMENDED: - mTxtDescription.setVisibility(View.VISIBLE); - mFollowButton.setVisibility(View.GONE); + mTxtDescription.setVisibility(VISIBLE); + mFollowButton.setVisibility(GONE); break; } } From d582396a66679ed42a5f75c215a928f2e5268f7b Mon Sep 17 00:00:00 2001 From: Renan Ferrari Date: Tue, 11 Feb 2020 00:53:16 -0300 Subject: [PATCH 5/5] Adding support to follow/unfollow RSS feed from Followed Sites list item --- .../ui/reader/adapters/ReaderBlogAdapter.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java index 6eb7e3935eae..1f801c9a1517 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java @@ -19,6 +19,7 @@ import org.wordpress.android.models.ReaderRecommendBlogList; import org.wordpress.android.models.ReaderRecommendedBlog; import org.wordpress.android.ui.reader.ReaderInterfaces; +import org.wordpress.android.ui.reader.actions.ReaderActions.ActionListener; import org.wordpress.android.ui.reader.actions.ReaderBlogActions; import org.wordpress.android.ui.reader.views.ReaderFollowButton; import org.wordpress.android.util.AppLog; @@ -234,7 +235,7 @@ private void toggleFollow(Context context, ReaderFollowButton followButton, Read // disable follow button until API call returns followButton.setEnabled(false); - boolean result = ReaderBlogActions.followBlogById(blog.blogId, isAskingToFollow, succeeded -> { + final ActionListener listener = succeeded -> { followButton.setEnabled(true); if (!succeeded) { int errResId = isAskingToFollow ? R.string.reader_toast_err_follow_blog @@ -243,7 +244,15 @@ private void toggleFollow(Context context, ReaderFollowButton followButton, Read followButton.setIsFollowed(!isAskingToFollow); blog.isFollowing = !isAskingToFollow; } - }); + }; + + final boolean result; + + if (blog.feedId != 0) { + result = ReaderBlogActions.followFeedById(blog.feedId, isAskingToFollow, listener); + } else { + result = ReaderBlogActions.followBlogById(blog.blogId, isAskingToFollow, listener); + } if (result) { followButton.setIsFollowedAnimated(isAskingToFollow);