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()); } } } }