Skip to content

Commit

Permalink
Merge pull request #20171 from wordpress-mobile/issue/19353-update-fo…
Browse files Browse the repository at this point in the history
…llow-tags-logic-manage-screen

[Reader] Update follow tags logic in "Manage Tags & Blogs" screen
  • Loading branch information
RenanLukas authored Feb 10, 2024
2 parents b52d837 + a02167a commit 85f5945
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
* followed tags and followed blogs
*/
public class ReaderSubsActivity extends LocaleAwareActivity
implements ReaderTagAdapter.TagDeletedListener {
implements ReaderTagAdapter.TagDeletedListener, ReaderTagAdapter.TagAddedListener {
private EditText mEditAdd;
private FloatingActionButton mFabButton;
private ReaderFollowButton mBtnAdd;
Expand Down Expand Up @@ -176,8 +176,7 @@ private void setResult() {
boolean shouldRefreshSubscriptions = false;
if (mPageAdapter != null) {
final ReaderTagFragment readerTagFragment = mPageAdapter.getReaderTagFragment();
final ReaderBlogFragment readerBlogFragment = mPageAdapter.getReaderBlogFragment();
if (readerTagFragment != null && readerBlogFragment != null) {
if (readerTagFragment != null) {
shouldRefreshSubscriptions = readerTagFragment.hasChangedSelectedTags();
}
}
Expand Down Expand Up @@ -497,8 +496,14 @@ public void onTagDeleted(ReaderTag tag) {
if (mLastAddedTagName != null && mLastAddedTagName.equalsIgnoreCase(tag.getTagSlug())) {
mLastAddedTagName = null;
}
String labelRemovedTag = getString(R.string.reader_label_removed_tag);
showInfoSnackbar(String.format(labelRemovedTag, tag.getLabel()));
}

@Override public void onTagAdded(@NonNull ReaderTag readerTag) {
mReaderTracker.trackTag(
AnalyticsTracker.Stat.READER_TAG_FOLLOWED,
readerTag.getTagSlug(),
ReaderTracker.SOURCE_SETTINGS
);
}

/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
/*
* fragment hosted by ReaderSubsActivity which shows followed tags
*/
public class ReaderTagFragment extends Fragment implements ReaderTagAdapter.TagDeletedListener {
public class ReaderTagFragment extends Fragment
implements ReaderTagAdapter.TagDeletedListener, ReaderTagAdapter.TagAddedListener {
private ReaderRecyclerView mRecyclerView;
private ReaderTagAdapter mTagAdapter;

Expand All @@ -49,10 +50,10 @@ public boolean hasChangedSelectedTags() {
for (final ReaderTag readerTag : mInitialReaderTagList) {
initialTagsSlugs.add(readerTag.getTagSlug());
}
final List<ReaderTag> currentReaderTagList = getTagAdapter().getItems();
final List<ReaderTag> currentlySubscribedReaderTagList = getTagAdapter().getSubscribedItems();
final Set<String> currentTagsSlugs = new HashSet<>();
if (currentReaderTagList != null) {
for (final ReaderTag readerTag : currentReaderTagList) {
if (currentlySubscribedReaderTagList != null) {
for (final ReaderTag readerTag : currentlySubscribedReaderTagList) {
currentTagsSlugs.add(readerTag.getTagSlug());
}
}
Expand Down Expand Up @@ -103,6 +104,7 @@ private ReaderTagAdapter getTagAdapter() {
Context context = WPActivityUtils.getThemedContext(getActivity());
mTagAdapter = new ReaderTagAdapter(context);
mTagAdapter.setTagDeletedListener(this);
mTagAdapter.setTagAddedListener(this);
mTagAdapter.setDataLoadedListener(isEmpty -> {
checkEmptyView();
if (mIsFirstDataLoaded) {
Expand Down Expand Up @@ -133,4 +135,10 @@ public void onTagDeleted(ReaderTag tag) {
((ReaderTagAdapter.TagDeletedListener) getActivity()).onTagDeleted(tag);
}
}

@Override public void onTagAdded(@NonNull ReaderTag readerTag) {
if (getActivity() instanceof ReaderTagAdapter.TagDeletedListener) {
((ReaderTagAdapter.TagAddedListener) getActivity()).onTagAdded(readerTag);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import org.wordpress.android.util.ToastUtils;

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;

import javax.inject.Inject;

Expand All @@ -36,11 +38,17 @@ public interface TagDeletedListener {
void onTagDeleted(ReaderTag tag);
}

public interface TagAddedListener {
void onTagAdded(@NonNull ReaderTag readerTag);
}

@Inject AccountStore mAccountStore;
private final WeakReference<Context> mWeakContext;
private final ReaderTagList mTags = new ReaderTagList();
private TagDeletedListener mTagDeletedListener;
private TagAddedListener mTagAddedListener;
private ReaderInterfaces.DataLoadedListener mDataLoadedListener;
private final Map<String, Boolean> mTagSlugIsFollowedMap = new HashMap<>();

public ReaderTagAdapter(Context context) {
super();
Expand All @@ -53,6 +61,10 @@ public void setTagDeletedListener(TagDeletedListener listener) {
mTagDeletedListener = listener;
}

public void setTagAddedListener(@NonNull final TagAddedListener listener) {
mTagAddedListener = listener;
}

public void setDataLoadedListener(ReaderInterfaces.DataLoadedListener listener) {
mDataLoadedListener = listener;
}
Expand Down Expand Up @@ -99,39 +111,55 @@ public ReaderTagList getItems() {
return mTags;
}

@Nullable
public ReaderTagList getSubscribedItems() {
final ReaderTagList readerSubscribedTagsList = new ReaderTagList();
for (final ReaderTag readerTag : mTags) {
if (Boolean.TRUE.equals(mTagSlugIsFollowedMap.get(readerTag.getTagSlug()))) {
readerSubscribedTagsList.add(readerTag);
}
}
return readerSubscribedTagsList;
}

@Override
public void onBindViewHolder(TagViewHolder holder, int position) {
final ReaderTag tag = mTags.get(position);
holder.mTxtTagName.setText(tag.getLabel());
holder.mRemoveFollowButton.setOnClickListener(v -> performDeleteTag(tag));
holder.mRemoveFollowButton.setOnClickListener(view -> performDeleteTag(tag, holder.mRemoveFollowButton));
}

private void performDeleteTag(@NonNull ReaderTag tag) {
private void performDeleteTag(@NonNull ReaderTag tag, @NonNull final ReaderFollowButton readerFollowButton) {
if (!NetworkUtils.checkConnection(getContext())) {
return;
}

ReaderActions.ActionListener actionListener = new ReaderActions.ActionListener() {
@Override
public void onActionResult(boolean succeeded) {
if (!succeeded && hasContext()) {
ToastUtils.showToast(getContext(), R.string.reader_toast_err_removing_tag);
refresh();
}
}
};
final boolean isFollowingCurrent = Boolean.TRUE.equals(mTagSlugIsFollowedMap.get(tag.getTagSlug()));
final boolean isFollowingNew = !isFollowingCurrent;
readerFollowButton.setIsFollowed(isFollowingNew);

boolean success = ReaderTagActions.deleteTag(tag, actionListener, mAccountStore.hasAccessToken());
// Disable follow button until API call returns
readerFollowButton.setEnabled(false);

if (success) {
int index = mTags.indexOfTagName(tag.getTagSlug());
if (index > -1) {
mTags.remove(index);
notifyItemRemoved(index);
ReaderActions.ActionListener actionListener = succeeded -> {
mTagSlugIsFollowedMap.put(tag.getTagSlug(), isFollowingNew);
readerFollowButton.setEnabled(true);
if (!succeeded && hasContext()) {
ToastUtils.showToast(getContext(), R.string.reader_toast_err_removing_tag);
refresh();
}
if (mTagDeletedListener != null) {
};

if (isFollowingCurrent) {
boolean success = ReaderTagActions.deleteTag(tag, actionListener, mAccountStore.hasAccessToken());
if (success && mTagDeletedListener != null) {
mTagDeletedListener.onTagDeleted(tag);
}
} else {
boolean success = ReaderTagActions.addTag(tag, actionListener, mAccountStore.hasAccessToken());
if (success && mTagAddedListener != null) {
mTagAddedListener.onTagAdded(tag);
}
}
}

Expand Down Expand Up @@ -175,6 +203,10 @@ protected void onPostExecute(ReaderTagList tagList) {
if (tagList != null && !tagList.isSameList(mTags)) {
mTags.clear();
mTags.addAll(tagList);
mTagSlugIsFollowedMap.clear();
for (final ReaderTag tag : mTags) {
mTagSlugIsFollowedMap.put(tag.getTagSlug(), true);
}
notifyDataSetChanged();
}
mIsTaskRunning = false;
Expand Down

0 comments on commit 85f5945

Please sign in to comment.