package tellh.com.gitclub.presentation.presenter; import android.content.Context; import android.content.DialogInterface; import android.support.annotation.NonNull; import android.view.View; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.tellh.nolistadapter.adapter.RecyclerViewAdapter; import java.util.List; import rx.functions.Action0; import tellh.com.gitclub.R; import tellh.com.gitclub.common.base.BasePresenter; import tellh.com.gitclub.common.base.BaseView; import tellh.com.gitclub.common.base.DefaultSubscriber; import tellh.com.gitclub.common.config.Constant.SortType.SortType_Repo; import tellh.com.gitclub.common.utils.Utils; import tellh.com.gitclub.model.entity.RepositoryInfo; import tellh.com.gitclub.model.net.DataSource.RepositoryDataSource; import tellh.com.gitclub.model.net.DataSource.UserDataSource; import tellh.com.gitclub.presentation.contract.ShowError; import static com.tellh.nolistadapter.adapter.FooterLoadMoreAdapterWrapper.UpdateType; /** * Created by tlh on 2016/9/11 :) */ public class ListRepoPresenter extends BasePresenter<ListRepoPresenter.ListRepoView> implements IRepoListPresenter { private final UserDataSource mUserDataSource; private final IRepoListPresenter repoListPresenter; private String user; private ListStarredRepoRequest listStarredRepoRequest; private DialogManager dialogManager; private boolean isFlying; public void setUser(String user) { this.user = user; } @Override public void checkState(int position, RecyclerViewAdapter adapter) { repoListPresenter.checkState(position, adapter); } @Override public void starRepo(int position, RecyclerViewAdapter adapter, boolean toggle) { repoListPresenter.starRepo(position, adapter, toggle); } @Override public void watchRepo(int position, RecyclerViewAdapter adapter, boolean toggle) { repoListPresenter.watchRepo(position, adapter, toggle); } @Override public void forkRepo(int position, RecyclerViewAdapter adapter) { repoListPresenter.forkRepo(position, adapter); } @Override public void getRepoInfo(String owner, String name, OnGetRepoCallback callback) { repoListPresenter.getRepoInfo(owner, name, callback); } private class ListStarredRepoRequest { int page; SortType_Repo sortType; public ListStarredRepoRequest(int page, SortType_Repo sortType) { this.page = page; this.sortType = sortType; } } public ListRepoPresenter(UserDataSource userDataSource, RepositoryDataSource repositoryDataSource) { this.mUserDataSource = userDataSource; repoListPresenter = new RepoListPresenter(this, repositoryDataSource); } public void listStarredRepo(final int page) { if (isFlying) { getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying)); return; } if (listStarredRepoRequest == null) listStarredRepoRequest = new ListStarredRepoRequest(1, SortType_Repo.CREATED); isFlying = true; listStarredRepoRequest.page = page; addSubscription( mUserDataSource.listStarredRepo(user, listStarredRepoRequest.sortType, listStarredRepoRequest.page) .doOnTerminate(new Action0() { @Override public void call() { isFlying = false; } }) .subscribe(new DefaultSubscriber<List<RepositoryInfo>>() { @Override public void onNext(List<RepositoryInfo> repositoryInfos) { getView().onGetRepoList(repositoryInfos, getUpdateType(page)); getView().showOnSuccess(); } @Override protected void onError(String errorStr) { getView().showOnError(getUpdateType(page), errorStr); } }) ); } public void listWatchingRepo(final int page) { if (user == null) { return; } if (isFlying) { getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying)); return; } isFlying = true; addSubscription( mUserDataSource.listWatchingRepo(user, page) .doOnTerminate(new Action0() { @Override public void call() { isFlying = false; } }) .subscribe(new DefaultSubscriber<List<RepositoryInfo>>() { @Override public void onNext(List<RepositoryInfo> repositoryInfos) { getView().onGetRepoList(repositoryInfos, getUpdateType(page)); getView().showOnSuccess(); } @Override protected void onError(String errorStr) { getView().showOnError(getUpdateType(page), errorStr); } }) ); } public void listOwnRepo(final int page) { if (isFlying) { getView().showOnError(getUpdateType(page), Utils.getString(R.string.reqest_flying)); return; } isFlying = true; addSubscription( mUserDataSource.listOwnRepo(user, page) .doOnTerminate(new Action0() { @Override public void call() { isFlying = false; } }) .subscribe(new DefaultSubscriber<List<RepositoryInfo>>() { @Override public void onNext(List<RepositoryInfo> repositoryInfos) { getView().onGetRepoList(repositoryInfos, getUpdateType(page)); getView().showOnSuccess(); } @Override protected void onError(String errorStr) { getView().showOnError(getUpdateType(page), errorStr); } }) ); } @Override public void attachView(ListRepoView view) { super.attachView(view); dialogManager = new DialogManager(); } public MaterialDialog getDialogSortRepo() { return dialogManager.dialogSortRepo; } private class DialogManager { private MaterialDialog dialogSortRepo; Context viewContext = getView().getViewContext(); public DialogManager() { dialogSortRepo = new MaterialDialog.Builder(viewContext) .title(R.string.title_sort_repo) .items(SortType_Repo.getDisplayStringListForStarredRepo()) .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() { @Override public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) { listStarredRepoRequest.sortType = (SortType_Repo) SortType_Repo.lookup(text.toString()); // listStarredRepo(1); getView().initData(null); return true; } }) .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) { materialDialog.dismiss(); } }) .positiveText("OK") .negativeText("Cancel") .negativeColorRes(R.color.red) .build(); dialogSortRepo.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { dialogSortRepo.setSelectedIndex(listStarredRepoRequest.sortType.ordinal()); } }); } } public interface ListRepoView extends BaseView, ShowError { void onGetRepoList(List<RepositoryInfo> list, @UpdateType int updateType); } }