package com.fastaccess.ui.modules.repos;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import com.fastaccess.App;
import com.fastaccess.R;
import com.fastaccess.data.dao.model.AbstractPinnedRepos;
import com.fastaccess.data.dao.model.Login;
import com.fastaccess.data.dao.model.Repo;
import com.fastaccess.helper.AppHelper;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.RxHelper;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import com.fastaccess.ui.modules.repos.code.RepoCodePagerFragment;
import com.fastaccess.ui.modules.repos.issues.RepoIssuesPagerFragment;
import com.fastaccess.ui.modules.repos.pull_requests.RepoPullRequestPagerFragment;
import com.fastaccess.ui.modules.user.UserPagerActivity;
import static com.fastaccess.helper.ActivityHelper.getVisibleFragment;
/**
* Created by Kosh on 09 Dec 2016, 4:17 PM
*/
class RepoPagerPresenter extends BasePresenter<RepoPagerMvp.View> implements RepoPagerMvp.Presenter {
private boolean isWatched;
private boolean isStarred;
private boolean isForked;
private String login;
private String repoId;
private Repo repo;
private int navTyp;
private void callApi(int navTyp) {
if (InputHelper.isEmpty(login) || InputHelper.isEmpty(repoId)) return;
makeRestCall(RestProvider.getRepoService().getRepo(login(), repoId()),
repoModel -> {
this.repo = repoModel;
manageSubscription(this.repo.save(repo).subscribe());
sendToView(view -> {
view.onInitRepo();
view.onNavigationChanged(navTyp);
});
onCheckStarring();
onCheckWatching();
});
}
@Override public void onError(@NonNull Throwable throwable) {
int code = RestProvider.getErrorCode(throwable);
if (code == 404) {
sendToView(RepoPagerMvp.View::onFinishActivity);
} else {
onWorkOffline();
}
super.onError(throwable);
}
@Override public void onActivityCreate(@NonNull String repoId, @NonNull String login, int navTyp) {
this.login = login;
this.repoId = repoId;
this.navTyp = navTyp;
if (getRepo() == null || !isApiCalled()) {
callApi(navTyp);
} else {
sendToView(RepoPagerMvp.View::onInitRepo);
}
}
@NonNull @Override public String repoId() {
return repoId;
}
@NonNull @Override public String login() {
return login;
}
@Nullable @Override public Repo getRepo() {
return repo;
}
@Override public boolean isWatched() {
return isWatched;
}
@Override public boolean isStarred() {
return isStarred;
}
@Override public boolean isForked() {
return isForked;
}
@Override public boolean isRepoOwner() {
return (getRepo() != null && getRepo().getOwner() != null) && getRepo().getOwner().getLogin().equals(Login.getUser().getLogin());
}
@Override public void onWatch() {
if (getRepo() == null) return;
isWatched = !isWatched;
sendToView(view -> {
view.onRepoWatched(isWatched);
view.onChangeWatchedCount(isWatched);
});
}
@Override public void onStar() {
if (getRepo() == null) return;
isStarred = !isStarred;
sendToView(view -> {
view.onRepoStarred(isStarred);
view.onChangeStarCount(isStarred);
});
}
@Override public void onFork() {
if (!isForked && getRepo() != null) {
isForked = true;
sendToView(view -> {
view.onRepoForked(isForked);
view.onChangeForkCount(isForked);
});
}
}
@Override public void onCheckWatching() {
if (getRepo() != null) {
String login = login();
String name = repoId();
manageSubscription(RxHelper.getObserver(RestProvider.getRepoService().isWatchingRepo(login, name))
.doOnSubscribe(() -> sendToView(view -> view.onEnableDisableWatch(false)))
.doOnNext(subscriptionModel -> sendToView(view -> view.onRepoWatched(isWatched = subscriptionModel.isSubscribed())))
.onErrorReturn(throwable -> {
isWatched = false;
sendToView(view -> view.onRepoWatched(isWatched));
return null;
})
.subscribe());
}
}
@Override public void onCheckStarring() {
if (getRepo() != null) {
String login = login();
String name = repoId();
manageSubscription(RxHelper.getObserver(RestProvider.getRepoService().checkStarring(login, name))
.doOnSubscribe(() -> sendToView(view -> view.onEnableDisableStar(false)))
.doOnNext(response -> sendToView(view -> view.onRepoStarred(isStarred = response.code() == 204)))
.onErrorReturn(throwable -> {
isStarred = false;
sendToView(view -> view.onRepoStarred(isStarred));
return null;
})
.subscribe());
}
}
@Override public void onWorkOffline() {
if (!InputHelper.isEmpty(login()) && !InputHelper.isEmpty(repoId())) {
manageSubscription(RxHelper.getObserver(Repo.getRepo(repoId, login))
.subscribe(repoModel -> {
repo = repoModel;
if (repo != null) {
sendToView(view -> {
view.onInitRepo();
view.onNavigationChanged(RepoPagerMvp.CODE);
});
} else {
callApi(navTyp);
}
}));
} else {
sendToView(RepoPagerMvp.View::onFinishActivity);
}
}
@Override public void onModuleChanged(@NonNull FragmentManager fragmentManager, @RepoPagerMvp.RepoNavigationType int type) {
Fragment currentVisible = getVisibleFragment(fragmentManager);
RepoCodePagerFragment codePagerView = (RepoCodePagerFragment) AppHelper.getFragmentByTag(fragmentManager, RepoCodePagerFragment.TAG);
RepoIssuesPagerFragment repoIssuesPagerView = (RepoIssuesPagerFragment)
AppHelper.getFragmentByTag(fragmentManager, RepoIssuesPagerFragment.TAG);
RepoPullRequestPagerFragment pullRequestPagerView = (RepoPullRequestPagerFragment)
AppHelper.getFragmentByTag(fragmentManager, RepoPullRequestPagerFragment.TAG);
if (getRepo() == null) {
sendToView(RepoPagerMvp.View::onFinishActivity);
return;
}
if (currentVisible == null) return;
switch (type) {
case RepoPagerMvp.PROFILE:
UserPagerActivity.startActivity(App.getInstance().getApplicationContext(), Login.getUser().getLogin());
case RepoPagerMvp.CODE:
if (codePagerView == null) {
onAddAndHide(fragmentManager, RepoCodePagerFragment.newInstance(repoId(), login(),
getRepo().getUrl(), getRepo().getDefaultBranch()), currentVisible);
} else {
onShowHideFragment(fragmentManager, codePagerView, currentVisible);
}
break;
case RepoPagerMvp.ISSUES:
if ((!getRepo().isHasIssues())) {
sendToView(view -> view.showMessage(R.string.error, R.string.repo_issues_is_disabled));
break;
}
if (repoIssuesPagerView == null) {
onAddAndHide(fragmentManager, RepoIssuesPagerFragment.newInstance(repoId(), login()), currentVisible);
} else {
onShowHideFragment(fragmentManager, repoIssuesPagerView, currentVisible);
}
break;
case RepoPagerMvp.PULL_REQUEST:
if (pullRequestPagerView == null) {
onAddAndHide(fragmentManager, RepoPullRequestPagerFragment.newInstance(repoId(), login()), currentVisible);
} else {
onShowHideFragment(fragmentManager, pullRequestPagerView, currentVisible);
}
break;
}
}
@Override public void onShowHideFragment(@NonNull FragmentManager fragmentManager, @NonNull Fragment toShow, @NonNull Fragment toHide) {
fragmentManager
.beginTransaction()
.hide(toHide)
.show(toShow)
.commit();
toHide.onHiddenChanged(true);
toShow.onHiddenChanged(false);
}
@Override public void onAddAndHide(@NonNull FragmentManager fragmentManager, @NonNull Fragment toAdd, @NonNull Fragment toHide) {
fragmentManager
.beginTransaction()
.hide(toHide)
.add(R.id.container, toAdd, toAdd.getClass().getSimpleName())
.commit();
toHide.onHiddenChanged(true);
toAdd.onHiddenChanged(false);
}
@Override public void onDeleteRepo() {
if (isRepoOwner()) {
makeRestCall(RestProvider.getRepoService().deleteRepo(login, repoId),
booleanResponse -> {
if (booleanResponse.code() == 204) {
// if (repo != null) repo.delete().execute();
repo = null;
sendToView(RepoPagerMvp.View::onInitRepo);
}
});
}
}
@Override public void onPinUnpinRepo() {
if (getRepo() == null) return;
boolean isPinned = AbstractPinnedRepos.pinUpin(getRepo());
sendToView(view -> view.onRepoPinned(isPinned));
}
@Override public void onMenuItemSelect(@IdRes int id, int position, boolean fromUser) {
if (id == R.id.issues && (getRepo() != null && !getRepo().isHasIssues())) {
sendToView(view -> view.showMessage(R.string.error, R.string.repo_issues_is_disabled));
return;
}
if (getView() != null && isViewAttached() && fromUser) {
getView().onNavigationChanged(position);
}
}
@Override public void onMenuItemReselect(@IdRes int id, int position, boolean fromUser) {}
}