diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderTagAdapter.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderTagAdapter.java | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderTagAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderTagAdapter.java new file mode 100644 index 000000000..de203e0a3 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderTagAdapter.java @@ -0,0 +1,174 @@ +package org.wordpress.android.ui.reader.adapters; + +import android.content.Context; +import android.os.AsyncTask; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.datasets.ReaderTagTable; +import org.wordpress.android.models.ReaderTag; +import org.wordpress.android.models.ReaderTagList; +import org.wordpress.android.ui.reader.ReaderInterfaces; +import org.wordpress.android.ui.reader.actions.ReaderActions; +import org.wordpress.android.ui.reader.actions.ReaderTagActions; +import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.AppLog.T; +import org.wordpress.android.util.NetworkUtils; +import org.wordpress.android.util.ToastUtils; + +import java.lang.ref.WeakReference; + +public class ReaderTagAdapter extends RecyclerView.Adapter<ReaderTagAdapter.TagViewHolder> { + + public interface TagDeletedListener { + void onTagDeleted(ReaderTag tag); + } + + private final WeakReference<Context> mWeakContext; + private final ReaderTagList mTags = new ReaderTagList(); + private TagDeletedListener mTagDeletedListener; + private ReaderInterfaces.DataLoadedListener mDataLoadedListener; + + public ReaderTagAdapter(Context context) { + super(); + setHasStableIds(true); + mWeakContext = new WeakReference<>(context); + } + + public void setTagDeletedListener(TagDeletedListener listener) { + mTagDeletedListener = listener; + } + + public void setDataLoadedListener(ReaderInterfaces.DataLoadedListener listener) { + mDataLoadedListener = listener; + } + + private boolean hasContext() { + return (getContext() != null); + } + + private Context getContext() { + return mWeakContext.get(); + } + + public void refresh() { + if (mIsTaskRunning) { + AppLog.w(T.READER, "tag task is already running"); + return; + } + new LoadTagsTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + @Override + public int getItemCount() { + return mTags.size(); + } + + public boolean isEmpty() { + return (getItemCount() == 0); + } + + @Override + public long getItemId(int position) { + return mTags.get(position).getTagSlug().hashCode(); + } + + @Override + public TagViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.reader_listitem_tag, parent, false); + return new TagViewHolder(view); + } + + @Override + public void onBindViewHolder(TagViewHolder holder, int position) { + final ReaderTag tag = mTags.get(position); + holder.txtTagName.setText(tag.getLabel()); + holder.btnRemove.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + performDeleteTag(tag); + + } + }); + } + + private void performDeleteTag(@NonNull ReaderTag tag) { + 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_remove_tag); + refresh(); + } + } + }; + + boolean success = ReaderTagActions.deleteTag(tag, actionListener); + + if (success) { + int index = mTags.indexOfTagName(tag.getTagSlug()); + if (index > -1) { + mTags.remove(index); + notifyItemRemoved(index); + } + if (mTagDeletedListener != null) { + mTagDeletedListener.onTagDeleted(tag); + } + } + } + + class TagViewHolder extends RecyclerView.ViewHolder { + private final TextView txtTagName; + private final ImageButton btnRemove; + + public TagViewHolder(View view) { + super(view); + txtTagName = (TextView) view.findViewById(R.id.text_topic); + btnRemove = (ImageButton) view.findViewById(R.id.btn_remove); + ReaderUtils.setBackgroundToRoundRipple(btnRemove); + } + } + + /* + * AsyncTask to load tags + */ + private boolean mIsTaskRunning = false; + private class LoadTagsTask extends AsyncTask<Void, Void, ReaderTagList> { + @Override + protected void onPreExecute() { + mIsTaskRunning = true; + } + @Override + protected void onCancelled() { + mIsTaskRunning = false; + } + @Override + protected ReaderTagList doInBackground(Void... params) { + return ReaderTagTable.getFollowedTags(); + } + @Override + protected void onPostExecute(ReaderTagList tagList) { + if (tagList != null && !tagList.isSameList(mTags)) { + mTags.clear(); + mTags.addAll(tagList); + notifyDataSetChanged(); + } + mIsTaskRunning = false; + if (mDataLoadedListener != null) { + mDataLoadedListener.onDataLoaded(isEmpty()); + } + } + } + +} |