package tellh.com.gitclub.presentation.view.adapter.viewbinder;
import android.support.v7.widget.CardView;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.tellh.nolistadapter.IListAdapter;
import com.tellh.nolistadapter.adapter.RecyclerViewAdapter;
import com.tellh.nolistadapter.viewbinder.base.RecyclerViewBinder;
import java.util.HashMap;
import java.util.Map;
import tellh.com.gitclub.R;
import tellh.com.gitclub.common.AndroidApplication;
import tellh.com.gitclub.common.config.ExtraKey;
import tellh.com.gitclub.common.utils.StringUtils;
import tellh.com.gitclub.common.utils.Utils;
import tellh.com.gitclub.common.wrapper.ImageLoader;
import tellh.com.gitclub.common.wrapper.Note;
import tellh.com.gitclub.model.entity.RepositoryInfo;
import tellh.com.gitclub.model.sharedprefs.AccountPrefs;
import tellh.com.gitclub.presentation.contract.bus.RxBusPostman;
import tellh.com.gitclub.presentation.contract.bus.event.LaunchActivityEvent;
import tellh.com.gitclub.presentation.presenter.IRepoListPresenter;
import tellh.com.gitclub.presentation.widget.IconToggleHelper;
/**
* Created by tlh on 2016/10/4 :)
*/
public class RepoListItemViewBinder extends RecyclerViewBinder<RepositoryInfo, RepoListItemViewBinder.ViewHolder> {
private IRepoListPresenter presenter;
private IconToggleHelper starToggleHelper;
private IconToggleHelper watchToggleHelper;
public RepoListItemViewBinder(IRepoListPresenter presenter) {
this.presenter = presenter;
starToggleHelper = new IconToggleHelper(R.drawable.ic_star, R.drawable.ic_star_pressed);
watchToggleHelper = new IconToggleHelper(R.drawable.ic_watch, R.drawable.ic_watch_pressed);
}
@Override
public ViewHolder provideViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public void bindView(final IListAdapter iListAdapter, final ViewHolder holder, final int position, final RepositoryInfo repo) {
//init
if (!repo.hasCheckState) {
presenter.checkState(position, (RecyclerViewAdapter) iListAdapter);
holder.ivStar.setTag(false);
holder.ivWatch.setTag(false);
}
if (TextUtils.isEmpty(repo.getLanguage())) {
presenter.getRepoInfo(repo.getOwner().getLogin(), repo.getName(), new IRepoListPresenter.OnGetRepoCallback() {
@Override
public void onGet(RepositoryInfo result) {
repo.setLanguage(result.getLanguage());
}
});
}
starToggleHelper.setState(holder.ivStar, repo.hasStarred);
watchToggleHelper.setState(holder.ivWatch, repo.hasWatched);
//set data and listener
ImageLoader.load(repo.getOwner().getAvatar_url(), holder.ivOwner);
holder.ivOwner.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
HashMap<String, String> params = new HashMap<>(1);
params.put(ExtraKey.USER_NAME, repo.getOwner().getLogin());
RxBusPostman.postLaunchActivityEvent(params, LaunchActivityEvent.PERSONAL_HOME_PAGE_ACTIVITY);
}
});
holder.tvRepo.setText(StringUtils.checkRepoNameLength(repo.getFull_name(), repo.getName()));
holder.tvDesc.setText(repo.getDescription());
holder.tvLanguage.setText(repo.getLanguage() != null ? repo.getLanguage() : "");
holder.tvStarCount.setText(String.valueOf(repo.getStars()));
holder.tvForkCount.setText(String.valueOf(repo.getForks_count()));
holder.tvWatchCount.setText(repo.getSubscribers_count() == 0 ? "" : String.valueOf(repo.getSubscribers_count()));
holder.itemContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Map<String, String> params = new HashMap<>(1);
params.put(ExtraKey.USER_NAME, repo.getOwner().getLogin());
params.put(ExtraKey.REPO_NAME, repo.getName());
RxBusPostman.postLaunchActivityEvent(params, LaunchActivityEvent.REPO_PAGE_ACTIVITY);
}
});
holder.ivFork.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!checkLogin()) return;
//to ic_fork
presenter.forkRepo(position, (RecyclerViewAdapter) iListAdapter);
}
});
holder.ivStar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!checkLogin()) return;
boolean state = starToggleHelper
.toggleStarCount(holder.tvStarCount, repo, holder.ivStar)
.toggle(holder.ivStar);
//to star or unStar
presenter.starRepo(position, (RecyclerViewAdapter) iListAdapter, state);
}
});
holder.ivWatch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!checkLogin()) return;
//to watch or unWatch
presenter.watchRepo(position, (RecyclerViewAdapter) iListAdapter,
watchToggleHelper.toggle(holder.ivWatch));
}
});
}
@Override
public int getItemLayoutId(IListAdapter iListAdapter) {
return R.layout.item_repo;
}
private boolean checkLogin() {
if (!AccountPrefs.isLogin(AndroidApplication.getInstance())) {
Note.show(Utils.getString(R.string.note_to_login));
return false;
}
return true;
}
class ViewHolder extends RecyclerViewBinder.ViewHolder {
private ImageView ivOwner;
private TextView tvRepo;
private TextView tvDesc;
private TextView tvLanguage;
private ImageView ivStar;
private TextView tvStarCount;
private ImageView ivFork;
private TextView tvForkCount;
private ImageView ivWatch;
private TextView tvWatchCount;
private CardView itemContainer;
public ViewHolder(View rootView) {
super(rootView);
this.ivOwner = (ImageView) rootView.findViewById(R.id.iv_owner);
this.tvRepo = (TextView) rootView.findViewById(R.id.tv_repo);
this.tvDesc = (TextView) rootView.findViewById(R.id.tv_desc);
this.tvLanguage = (TextView) rootView.findViewById(R.id.tv_language);
this.ivStar = (ImageView) rootView.findViewById(R.id.iv_star);
this.tvStarCount = (TextView) rootView.findViewById(R.id.tv_star_count);
this.ivFork = (ImageView) rootView.findViewById(R.id.iv_fork);
this.tvForkCount = (TextView) rootView.findViewById(R.id.tv_fork_count);
this.ivWatch = (ImageView) rootView.findViewById(R.id.iv_watch);
this.tvWatchCount = (TextView) rootView.findViewById(R.id.tv_watch_count);
this.itemContainer = (CardView) rootView.findViewById(R.id.item_container);
}
}
}