package com.fastaccess.ui.modules.repos.issues.issue.details.timeline;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.PopupMenu;
import com.fastaccess.R;
import com.fastaccess.data.dao.TimelineModel;
import com.fastaccess.data.dao.model.Comment;
import com.fastaccess.data.dao.model.Issue;
import com.fastaccess.data.dao.model.IssueEvent;
import com.fastaccess.data.dao.model.Login;
import com.fastaccess.data.dao.types.ReactionTypes;
import com.fastaccess.helper.ActivityHelper;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.provider.scheme.SchemeParser;
import com.fastaccess.provider.timeline.CommentsHelper;
import com.fastaccess.provider.timeline.ReactionsProvider;
import com.fastaccess.ui.base.mvp.BaseMvp;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import com.fastaccess.ui.modules.repos.issues.create.CreateIssueActivity;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
/**
* Created by Kosh on 31 Mar 2017, 7:17 PM
*/
public class IssueTimelinePresenter extends BasePresenter<IssueTimelineMvp.View> implements IssueTimelineMvp.Presenter {
private ArrayList<TimelineModel> timeline = new ArrayList<>();
private Issue issue;
private ReactionsProvider reactionsProvider;
@Override public boolean isPreviouslyReacted(long commentId, int vId) {
return getReactionsProvider().isPreviouslyReacted(commentId, vId);
}
@Override public void onCallApi() {
if (getHeader() == null) {
sendToView(BaseMvp.FAView::hideProgress);
return;
}
String login = getHeader().getLogin();
String repoID = getHeader().getRepoId();
int number = getHeader().getNumber();
Observable<List<TimelineModel>> observable = Observable.zip(RestProvider.getIssueService().getTimeline(login, repoID, number),
RestProvider.getIssueService().getIssueComments(login, repoID, number),
(issueEventPageable, commentPageable) -> TimelineModel.construct(commentPageable.getItems(), issueEventPageable.getItems()));
makeRestCall(observable, models -> {
if (models != null) {
models.add(0, TimelineModel.constructHeader(issue));
}
sendToView(view -> view.onNotifyAdapter(models));
});
}
@Override public void onItemClick(int position, View v, TimelineModel item) {
if (getView() != null) {
if (item.getType() == TimelineModel.COMMENT) {
if (getHeader() == null) return;
if (v.getId() == R.id.commentMenu) {
PopupMenu popupMenu = new PopupMenu(v.getContext(), v);
popupMenu.inflate(R.menu.comments_menu);
String username = Login.getUser().getLogin();
boolean isOwner = CommentsHelper.isOwner(username, getHeader().getLogin(), item.getComment().getUser().getLogin());
popupMenu.getMenu().findItem(R.id.delete).setVisible(isOwner);
popupMenu.getMenu().findItem(R.id.edit).setVisible(isOwner);
popupMenu.setOnMenuItemClickListener(item1 -> {
if (getView() == null) return false;
if (item1.getItemId() == R.id.delete) {
getView().onShowDeleteMsg(item.getComment().getId());
} else if (item1.getItemId() == R.id.reply) {
getView().onReply(item.getComment().getUser(), item.getComment().getBody());
} else if (item1.getItemId() == R.id.edit) {
getView().onEditComment(item.getComment());
} else if (item1.getItemId() == R.id.share) {
ActivityHelper.shareUrl(v.getContext(), item.getComment().getHtmlUrl());
}
return true;
});
popupMenu.show();
} else {
onHandleReaction(v.getId(), item.getComment().getId(), ReactionsProvider.COMMENT);
}
} else if (item.getType() == TimelineModel.EVENT) {
IssueEvent issueEventModel = item.getEvent();
if (issueEventModel.getCommitUrl() != null) {
SchemeParser.launchUri(v.getContext(), Uri.parse(issueEventModel.getCommitUrl()));
}
} else if (item.getType() == TimelineModel.HEADER) {
if (v.getId() == R.id.commentMenu) {
PopupMenu popupMenu = new PopupMenu(v.getContext(), v);
popupMenu.inflate(R.menu.comments_menu);
String username = Login.getUser().getLogin();
boolean isOwner = CommentsHelper.isOwner(username, item.getIssue().getLogin(), item.getIssue().getUser().getLogin());
popupMenu.getMenu().findItem(R.id.edit).setVisible(isOwner);
popupMenu.setOnMenuItemClickListener(item1 -> {
if (getView() == null) return false;
if (item1.getItemId() == R.id.reply) {
getView().onReply(item.getIssue().getUser(), item.getIssue().getBody());
} else if (item1.getItemId() == R.id.edit) {
Activity activity = ActivityHelper.getActivity(v.getContext());
if (activity == null) return false;
CreateIssueActivity.startForResult(activity,
item.getIssue().getLogin(), item.getIssue().getRepoId(), item.getIssue());
} else if (item1.getItemId() == R.id.share) {
ActivityHelper.shareUrl(v.getContext(), item.getIssue().getHtmlUrl());
}
return true;
});
popupMenu.show();
} else {
onHandleReaction(v.getId(), item.getIssue().getNumber(), ReactionsProvider.HEADER);
}
}
}
}
@Override public void onItemLongClick(int position, View v, TimelineModel item) {
if (getView() == null) return;
if (item.getType() == TimelineModel.COMMENT || item.getType() == TimelineModel.HEADER) {
String login = login();
String repoId = repoId();
if (!InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) {
ReactionTypes type = ReactionTypes.get(v.getId());
if (type != null) {
if (item.getType() == TimelineModel.HEADER) {
getView().showReactionsPopup(type, login, repoId, item.getIssue().getNumber(), true);
} else {
getView().showReactionsPopup(type, login, repoId, item.getComment().getId(), false);
}
} else {
onItemClick(position, v, item);
}
}
} else {
onItemClick(position, v, item);
}
}
@NonNull @Override public ArrayList<TimelineModel> getEvents() {
return timeline;
}
@Override public void onFragmentCreated(@Nullable Bundle bundle) {
if (bundle == null) throw new NullPointerException("Bundle is null?");
issue = bundle.getParcelable(BundleConstant.ITEM);
if (timeline.isEmpty() && issue != null) {
onCallApi();
}
}
@Override public void onWorkOffline() {
//TODO
}
@Override public void onHandleDeletion(@Nullable Bundle bundle) {
if (bundle != null) {
long commId = bundle.getLong(BundleConstant.EXTRA, 0);
if (commId != 0) {
makeRestCall(RestProvider.getIssueService().deleteIssueComment(login(), repoId(), commId),
booleanResponse -> sendToView(view -> {
if (booleanResponse.code() == 204) {
Comment comment = new Comment();
comment.setId(commId);
view.onRemove(TimelineModel.constructComment(comment));
} else {
view.showMessage(R.string.error, R.string.error_deleting_comment);
}
}));
}
}
}
@Nullable @Override public String repoId() {
return getHeader() != null ? getHeader().getRepoId() : null;
}
@Nullable @Override public String login() {
return getHeader() != null ? getHeader().getLogin() : null;
}
@Override public int number() {
return getHeader() != null ? getHeader().getNumber() : -1;
}
@Nullable private Issue getHeader() {
return issue;
}
@Override public void onHandleReaction(int viewId, long id, @ReactionsProvider.ReactionType int reactionType) {
String login = login();
String repoId = repoId();
Observable observable = getReactionsProvider().onHandleReaction(viewId, id, login, repoId, reactionType);
if (observable != null) manageSubscription(observable.subscribe());
}
@Override public boolean isCallingApi(long id, int vId) {
return getReactionsProvider().isCallingApi(id, vId);
}
private ReactionsProvider getReactionsProvider() {
if (reactionsProvider == null) {
reactionsProvider = new ReactionsProvider();
}
return reactionsProvider;
}
}