package tellh.com.gitclub.presentation.presenter; import com.tellh.nolistadapter.DataBean; import com.tellh.nolistadapter.adapter.RecyclerViewAdapter; import java.util.List; import rx.Observable; import rx.functions.Func1; import rx.functions.Func2; import tellh.com.gitclub.R; import tellh.com.gitclub.common.base.BasePresenter; import tellh.com.gitclub.common.base.DefaultSubscriber; import tellh.com.gitclub.common.utils.Utils; import tellh.com.gitclub.common.wrapper.Note; import tellh.com.gitclub.model.entity.RepositoryInfo; import tellh.com.gitclub.model.net.DataSource.RepositoryDataSource; /** * Created by tlh on 2016/8/31 :) */ class RepoListPresenter implements IRepoListPresenter { private final RepositoryDataSource mRepositoryDataSource; private final BasePresenter mPresenter; RepoListPresenter(BasePresenter presenter, RepositoryDataSource repositoryDataSource) { this.mRepositoryDataSource = repositoryDataSource; this.mPresenter = presenter; } @Override public void checkState(final int position, final RecyclerViewAdapter adapter) { if (!mPresenter.checkNetwork() || !mPresenter.checkLogin()) return; List<DataBean> items = adapter.getDisplayList(); final RepositoryInfo repositoryInfo = (RepositoryInfo) items.get(position); String owner = repositoryInfo.getOwner().getLogin(); String repo = repositoryInfo.getName(); mPresenter.addSubscription( Observable.zip( mRepositoryDataSource.checkStarred(owner, repo), mRepositoryDataSource.checkWatching(owner, repo), new Func2<Boolean, Boolean, Void>() { @Override public Void call(Boolean starring, Boolean watching) { boolean change = repositoryInfo.hasStarred != starring || repositoryInfo.hasWatched != watching; repositoryInfo.hasStarred = starring; repositoryInfo.hasWatched = watching; repositoryInfo.hasCheckState = true; if (change) adapter.notifyItemChanged(position); return null; } } ).subscribe(new DefaultSubscriber<Void>() { @Override public void onNext(Void aVoid) { } }) ); } @Override public void starRepo(final int position, final RecyclerViewAdapter adapter, boolean toggle) { if (!mPresenter.checkNetwork()) return; final RepositoryInfo repo = (RepositoryInfo) adapter.getDisplayList().get(position); //to star if (toggle) { mPresenter.addSubscription( mRepositoryDataSource.toStar(repo.getOwner().getLogin(), repo.getName()) .subscribe(new DefaultSubscriber<Boolean>() { @Override public void onNext(Boolean result) { if (result) { Note.show(Utils.getString(R.string.success_star_repo) + repo.getFull_name()); repo.hasStarred = true; } else { handleStarError(repo); } } @Override protected void onError(String errorStr) { super.onError(errorStr); handleStarError(repo); } } ) ); } else {//unStar mPresenter.addSubscription( mRepositoryDataSource.unStar(repo.getOwner().getLogin(), repo.getName()) .subscribe( new DefaultSubscriber<Boolean>() { @Override public void onNext(Boolean result) { if (result) { Note.show(Utils.getString(R.string.success_unstar_repo) + repo.getFull_name()); repo.hasStarred = false; } else { handleStarError(repo); } } @Override protected void onError(String errorStr) { super.onError(errorStr); handleStarError(repo); } } ) ); } } private void handleStarError(RepositoryInfo repo) { Note.show(Utils.getString(R.string.error_star_repo) + repo.getFull_name()); repo.setStars(repo.getStars() - 1); } @Override public void watchRepo(final int position, final RecyclerViewAdapter adapter, boolean toggle) { if (!mPresenter.checkNetwork()) return; final RepositoryInfo repo = (RepositoryInfo) adapter.getDisplayList().get(position); //to watch if (toggle) { mPresenter.addSubscription( mRepositoryDataSource.toWatch(repo.getOwner().getLogin(), repo.getName()) .subscribe( new DefaultSubscriber<Boolean>() { @Override public void onNext(Boolean result) { if (result) { Note.show(Utils.getString(R.string.success_watch_repo) + repo.getFull_name()); repo.hasWatched = true; } else { Note.show(Utils.getString(R.string.error_watch_repo) + repo.getFull_name()); } } @Override protected void onError(String errorStr) { super.onError(errorStr); Note.show(Utils.getString(R.string.error_watch_repo) + repo.getFull_name()); } } ) ); } else {//to unWatch mPresenter.addSubscription( mRepositoryDataSource.unWatch(repo.getOwner().getLogin(), repo.getName()) .subscribe( new DefaultSubscriber<Boolean>() { @Override public void onNext(Boolean result) { if (result) { Note.show(Utils.getString(R.string.success_unwatch_repo) + repo.getFull_name()); repo.hasStarred = false; } else { Note.show(Utils.getString(R.string.error_unwatch_repo) + repo.getFull_name()); } } @Override protected void onError(String errorStr) { super.onError(errorStr); Note.show(Utils.getString(R.string.error_unwatch_repo) + repo.getFull_name()); } } ) ); } } @Override public void forkRepo(final int position, final RecyclerViewAdapter adapter) { if (!mPresenter.checkNetwork()) return; final RepositoryInfo repo = (RepositoryInfo) adapter.getDisplayList().get(position); Note.show(Utils.getString(R.string.Forking) + repo.getFull_name()); mPresenter.addSubscription( mRepositoryDataSource.toFork(repo.getOwner().getLogin(), repo.getName()) .map(new Func1<RepositoryInfo, Boolean>() { @Override public Boolean call(RepositoryInfo repositoryInfo) { return repositoryInfo != null; } }) .subscribe( new DefaultSubscriber<Boolean>() { @Override public void onNext(Boolean result) { if (result) { Note.show(Utils.getString(R.string.success_fork_repo) + repo.getFull_name()); } else { Note.show(Utils.getString(R.string.error_fork_repo) + repo.getFull_name()); } } @Override protected void onError(String errorStr) { super.onError(errorStr); Note.show(Utils.getString(R.string.error_fork_repo) + repo.getFull_name()); } } ) ); } @Override public void getRepoInfo(String owner, String name, final OnGetRepoCallback callback) { mPresenter.addSubscription( mRepositoryDataSource.getRepoInfo(owner, name) .subscribe(new DefaultSubscriber<RepositoryInfo>() { @Override public void onNext(RepositoryInfo repositoryInfo) { if (callback != null) callback.onGet(repositoryInfo); } }) ); } }