package com.fastaccess.ui.modules.repos.issues.issue.details;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import com.fastaccess.R;
import com.fastaccess.data.dao.FragmentPagerAdapterModel;
import com.fastaccess.data.dao.LabelModel;
import com.fastaccess.data.dao.MilestoneModel;
import com.fastaccess.data.dao.model.Issue;
import com.fastaccess.data.dao.model.User;
import com.fastaccess.data.dao.types.IssueState;
import com.fastaccess.helper.ActivityHelper;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.Bundler;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.ParseDateFormat;
import com.fastaccess.helper.ViewHelper;
import com.fastaccess.ui.adapter.FragmentsPagerAdapter;
import com.fastaccess.ui.base.BaseActivity;
import com.fastaccess.ui.modules.repos.RepoPagerActivity;
import com.fastaccess.ui.modules.repos.RepoPagerMvp;
import com.fastaccess.ui.modules.repos.extras.assignees.AssigneesDialogFragment;
import com.fastaccess.ui.modules.repos.extras.labels.LabelsDialogFragment;
import com.fastaccess.ui.modules.repos.extras.milestone.create.MilestoneDialogFragment;
import com.fastaccess.ui.modules.repos.issues.create.CreateIssueActivity;
import com.fastaccess.ui.modules.repos.issues.issue.details.timeline.IssueTimelineFragment;
import com.fastaccess.ui.widgets.AvatarLayout;
import com.fastaccess.ui.widgets.FontTextView;
import com.fastaccess.ui.widgets.ForegroundImageView;
import com.fastaccess.ui.widgets.SpannableBuilder;
import com.fastaccess.ui.widgets.ViewPagerView;
import com.fastaccess.ui.widgets.dialog.MessageDialogView;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import icepick.State;
/**
* Created by Kosh on 10 Dec 2016, 9:23 AM
*/
public class IssuePagerActivity extends BaseActivity<IssuePagerMvp.View, IssuePagerPresenter> implements IssuePagerMvp.View {
@BindView(R.id.startGist) ForegroundImageView startGist;
@BindView(R.id.forkGist) ForegroundImageView forkGist;
@BindView(R.id.avatarLayout) AvatarLayout avatarLayout;
@BindView(R.id.headerTitle) FontTextView title;
@BindView(R.id.size) FontTextView size;
@BindView(R.id.date) FontTextView date;
@BindView(R.id.tabs) TabLayout tabs;
@BindView(R.id.pager) ViewPagerView pager;
@BindView(R.id.fab) FloatingActionButton fab;
@BindView(R.id.detailsIcon) View detailsIcon;
@State boolean isClosed;
@State boolean isOpened;
public static Intent createIntent(@NonNull Context context, @NonNull String repoId, @NonNull String login, int number) {
return createIntent(context, repoId, login, number, false);
}
public static Intent createIntent(@NonNull Context context, @NonNull String repoId, @NonNull String login, int number, boolean showToRepoBtn) {
Intent intent = new Intent(context, IssuePagerActivity.class);
intent.putExtras(Bundler.start()
.put(BundleConstant.ID, number)
.put(BundleConstant.EXTRA, login)
.put(BundleConstant.EXTRA_TWO, repoId)
.put(BundleConstant.EXTRA_THREE, showToRepoBtn)
.end());
return intent;
}
@OnClick(R.id.detailsIcon) void onTitleClick() {
if (getPresenter().getIssue() != null && !InputHelper.isEmpty(getPresenter().getIssue().getTitle()))
MessageDialogView.newInstance(getString(R.string.details), getPresenter().getIssue().getTitle())
.show(getSupportFragmentManager(), MessageDialogView.TAG);
}
@OnClick(R.id.fab) void onAddComment() {
if (pager != null && pager.getAdapter() != null) {
IssueTimelineFragment view = (IssueTimelineFragment) pager.getAdapter().instantiateItem(pager, 0);
if (view != null) {
view.onStartNewComment();
}
}
}
@Override protected int layout() {
return R.layout.issue_pager_activity;
}
@Override protected boolean isTransparent() {
return true;
}
@Override protected boolean canBack() {
return true;
}
@Override protected boolean isSecured() {
return false;
}
@NonNull @Override public IssuePagerPresenter providePresenter() {
return new IssuePagerPresenter();
}
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tabs.setVisibility(View.GONE);
if (savedInstanceState == null) {
getPresenter().onActivityCreated(getIntent());
} else {
if (getPresenter().isApiCalled()) onSetupIssue();
}
startGist.setVisibility(View.GONE);
forkGist.setVisibility(View.GONE);
if (getPresenter().showToRepoBtn()) showNavToRepoItem();
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && data != null) {
if (requestCode == BundleConstant.REQUEST_CODE) {
Bundle bundle = data.getExtras();
Issue issueModel = bundle.getParcelable(BundleConstant.ITEM);
if (issueModel != null) getPresenter().onUpdateIssue(issueModel);
}
}
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.issue_menu, menu);
menu.findItem(R.id.closeIssue).setVisible(getPresenter().isOwner());
menu.findItem(R.id.lockIssue).setVisible(getPresenter().isOwner());
menu.findItem(R.id.labels).setVisible(getPresenter().isRepoOwner());
return super.onCreateOptionsMenu(menu);
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onNavToRepoClicked();
return true;
}
Issue issueModel = getPresenter().getIssue();
if (issueModel == null) return false;
if (item.getItemId() == R.id.share) {
ActivityHelper.shareUrl(this, getPresenter().getIssue().getHtmlUrl());
return true;
} else if (item.getItemId() == R.id.closeIssue) {
MessageDialogView.newInstance(
issueModel.getState() == IssueState.open ? getString(R.string.close_issue) : getString(R.string.re_open_issue),
getString(R.string.confirm_message), Bundler.start().put(BundleConstant.EXTRA, true)
.put(BundleConstant.YES_NO_EXTRA, true).end())
.show(getSupportFragmentManager(), MessageDialogView.TAG);
return true;
} else if (item.getItemId() == R.id.lockIssue) {
MessageDialogView.newInstance(
getPresenter().isLocked() ? getString(R.string.unlock_issue) : getString(R.string.lock_issue),
getPresenter().isLocked() ? getString(R.string.unlock_issue_details) : getString(R.string.lock_issue_details),
Bundler.start().put(BundleConstant.EXTRA_TWO, true)
.put(BundleConstant.YES_NO_EXTRA, true)
.end())
.show(getSupportFragmentManager(), MessageDialogView.TAG);
return true;
} else if (item.getItemId() == R.id.labels) {
getPresenter().onLoadLabels();
return true;
} else if (item.getItemId() == R.id.edit) {
CreateIssueActivity.startForResult(this, getPresenter().getLogin(), getPresenter().getRepoId(), getPresenter().getIssue());
return true;
} else if (item.getItemId() == R.id.milestone) {
MilestoneDialogFragment.newInstance(getPresenter().getLogin(), getPresenter().getRepoId())
.show(getSupportFragmentManager(), "MilestoneDialogFragment");
return true;
} else if (item.getItemId() == R.id.assignees) {
AssigneesDialogFragment.newInstance(getPresenter().getLogin(), getPresenter().getRepoId(), true)
.show(getSupportFragmentManager(), "AssigneesDialogFragment");
return true;
} else if (item.getItemId() == R.id.subscribe) {
getPresenter().onSubscribeOrMute(false);
return true;
} else if (item.getItemId() == R.id.mute) {
getPresenter().onSubscribeOrMute(true);
return true;
} else if (item.getItemId() == R.id.browser) {
ActivityHelper.startCustomTab(this, issueModel.getHtmlUrl());
return true;
}
return super.onOptionsItemSelected(item);
}
@Override public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem closeIssue = menu.findItem(R.id.closeIssue);
MenuItem lockIssue = menu.findItem(R.id.lockIssue);
MenuItem milestone = menu.findItem(R.id.milestone);
MenuItem labels = menu.findItem(R.id.labels);
MenuItem assignees = menu.findItem(R.id.assignees);
MenuItem edit = menu.findItem(R.id.edit);
MenuItem editMenu = menu.findItem(R.id.editMenu);
boolean isOwner = getPresenter().isOwner();
boolean isLocked = getPresenter().isLocked();
boolean isCollaborator = getPresenter().isCollaborator();
boolean isRepoOwner = getPresenter().isRepoOwner();
editMenu.setVisible(isOwner || isCollaborator || isRepoOwner);
milestone.setVisible(isCollaborator || isRepoOwner);
labels.setVisible(isCollaborator || isRepoOwner);
assignees.setVisible(isCollaborator || isRepoOwner);
edit.setVisible(isCollaborator || isRepoOwner || isOwner);
menu.findItem(R.id.closeIssue).setVisible(isOwner || isCollaborator);
menu.findItem(R.id.lockIssue).setVisible(isOwner || isCollaborator);
menu.findItem(R.id.labels).setVisible(getPresenter().isRepoOwner() || isCollaborator);
if (isOwner) {
if (getPresenter().getIssue() == null) return super.onPrepareOptionsMenu(menu);
closeIssue.setTitle(getPresenter().getIssue().getState() == IssueState.closed ? getString(R.string.re_open) : getString(R.string.close));
lockIssue.setTitle(isLocked ? getString(R.string.unlock_issue) : getString(R.string.lock_issue));
}
return super.onPrepareOptionsMenu(menu);
}
@Override public void onSetupIssue() {
hideProgress();
if (getPresenter().getIssue() == null) {
return;
}
supportInvalidateOptionsMenu();
Issue issueModel = getPresenter().getIssue();
setTitle(String.format("#%s", issueModel.getNumber()));
User userModel = issueModel.getUser();
title.setText(issueModel.getTitle());
detailsIcon.setVisibility(InputHelper.isEmpty(issueModel.getTitle()) || !ViewHelper.isEllipsed(title) ? View.GONE : View.VISIBLE);
if (userModel != null) {
size.setVisibility(View.GONE);
String username;
CharSequence parsedDate;
if (issueModel.getState() == IssueState.closed) {
username = issueModel.getClosedBy() != null ? issueModel.getClosedBy().getLogin() : "N/A";
parsedDate = issueModel.getClosedAt() != null ? ParseDateFormat.getTimeAgo(issueModel.getClosedAt()) : "N/A";
} else {
parsedDate = ParseDateFormat.getTimeAgo(issueModel.getCreatedAt());
username = issueModel.getUser() != null ? issueModel.getUser().getLogin() : "N/A";
}
date.setText(SpannableBuilder.builder()
.append(ContextCompat.getDrawable(this,
issueModel.getState() == IssueState.open ? R.drawable.ic_issue_opened_small : R.drawable.ic_issue_closed_small))
.append(" ")
.append(getString(issueModel.getState().getStatus()))
.append(" ").append(getString(R.string.by)).append(" ").append(username).append(" ")
.append(parsedDate).append("\n").append(issueModel.getRepoId()));
avatarLayout.setUrl(userModel.getAvatarUrl(), userModel.getLogin());
}
pager.setAdapter(new FragmentsPagerAdapter(getSupportFragmentManager(), FragmentPagerAdapterModel.buildForIssues(this, issueModel)));
if (!getPresenter().isLocked() || getPresenter().isOwner()) {
pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override public void onPageSelected(int position) {
super.onPageSelected(position);
hideShowFab();
}
});
}
hideShowFab();
}
@Override public void showSuccessIssueActionMsg(boolean isClose) {
hideProgress();
if (isClose) {
isOpened = false;
isClosed = true;
showMessage(getString(R.string.success), getString(R.string.success_closed));
} else {
isOpened = true;
isClosed = false;
showMessage(getString(R.string.success), getString(R.string.success_re_opened));
}
}
@Override public void showErrorIssueActionMsg(boolean isClose) {
hideProgress();
if (isClose) {
showMessage(getString(R.string.error), getString(R.string.error_closing_issue));
} else {
showMessage(getString(R.string.error), getString(R.string.error_re_opening_issue));
}
}
@Override public void onLabelsRetrieved(@NonNull List<LabelModel> items) {
hideProgress();
LabelsDialogFragment.newInstance(items, getPresenter().getIssue() != null ? getPresenter().getIssue().getLabels() : null,
getPresenter().getRepoId(), getPresenter().getLogin())
.show(getSupportFragmentManager(), "LabelsDialogFragment");
}
@Override public void onUpdateTimeline() {
showMessage(R.string.success, R.string.labels_added_successfully);
IssueTimelineFragment issueDetailsView = (IssueTimelineFragment) pager.getAdapter().instantiateItem(pager, 0);
if (issueDetailsView != null) {
issueDetailsView.onRefresh();
}
}
@Override public void onUpdateMenu() {
supportInvalidateOptionsMenu();
}
@Override public void onMileStoneSelected(@NonNull MilestoneModel milestoneModel) {
getPresenter().onPutMilestones(milestoneModel);
}
@Override public void onFinishActivity() {
hideProgress();
finish();
}
@Override public void onMessageDialogActionClicked(boolean isOk, @Nullable Bundle bundle) {
super.onMessageDialogActionClicked(isOk, bundle);
if (isOk) {
getPresenter().onHandleConfirmDialog(bundle);
}
}
@Override public void onSelectedLabels(@NonNull ArrayList<LabelModel> labels) {
getPresenter().onPutLabels(labels);
}
@Override public void onSelectedAssignees(@NonNull ArrayList<User> users, boolean isAssignee) {
getPresenter().onPutAssignees(users);
}
@Override protected void onNavToRepoClicked() {
startActivity(RepoPagerActivity.createIntent(this, getPresenter().getRepoId(), getPresenter().getLogin(), RepoPagerMvp.ISSUES));
finish();
}
@Override public void onBackPressed() {
super.onBackPressed();
}
@Override public void finish() {
Intent intent = new Intent();
intent.putExtras(Bundler.start()
.put(BundleConstant.EXTRA, isClosed)
.put(BundleConstant.EXTRA_TWO, isOpened)
.end());
setResult(RESULT_OK, intent);
super.finish();
}
private void hideShowFab() {
if (getPresenter().isLocked() && !getPresenter().isOwner()) {
fab.hide();
return;
}
fab.show();
}
}