package com.fastaccess.ui.modules.repos.pull_requests.pull_request.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.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.PullRequest; 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.Logger; 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.pull_requests.pull_request.details.timeline.timeline.PullRequestTimelineFragment; import com.fastaccess.ui.modules.repos.pull_requests.pull_request.merge.MergePullRequestDialogFragment; 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 PullRequestPagerActivity extends BaseActivity<PullRequestPagerMvp.View, PullRequestPagerPresenter> implements PullRequestPagerMvp.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 showRepoBtn) { Intent intent = new Intent(context, PullRequestPagerActivity.class); intent.putExtras(Bundler.start() .put(BundleConstant.ID, number) .put(BundleConstant.EXTRA, login) .put(BundleConstant.EXTRA_TWO, repoId) .put(BundleConstant.EXTRA_THREE, showRepoBtn) .end()); return intent; } @OnClick(R.id.detailsIcon) void onTitleClick() { if (getPresenter().getPullRequest() != null && !InputHelper.isEmpty(getPresenter().getPullRequest().getTitle())) MessageDialogView.newInstance(getString(R.string.details), getPresenter().getPullRequest().getTitle()) .show(getSupportFragmentManager(), MessageDialogView.TAG); } @OnClick(R.id.fab) void onAddComment() { if (pager == null || pager.getAdapter() == null) return; PullRequestTimelineFragment view = (PullRequestTimelineFragment) 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 PullRequestPagerPresenter providePresenter() { return new PullRequestPagerPresenter(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 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(); PullRequest pullRequest = bundle.getParcelable(BundleConstant.ITEM); if (pullRequest != null) getPresenter().onUpdatePullRequest(pullRequest); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.pull_request_menu, menu); menu.findItem(R.id.merge).setVisible(false); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { onNavToRepoClicked(); return true; } PullRequest pullRequest = getPresenter().getPullRequest(); if (pullRequest == null) return false; if (item.getItemId() == R.id.share) { ActivityHelper.shareUrl(this, pullRequest.getHtmlUrl()); return true; } else if (item.getItemId() == R.id.closeIssue) { MessageDialogView.newInstance( pullRequest.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).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(), pullRequest); 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.reviewers) { AssigneesDialogFragment.newInstance(getPresenter().getLogin(), getPresenter().getRepoId(), false) .show(getSupportFragmentManager(), "AssigneesDialogFragment"); return true; } else if (item.getItemId() == R.id.merge) { if (getPresenter().getPullRequest() != null) { String msg = getPresenter().getPullRequest().getTitle(); MergePullRequestDialogFragment.newInstance(msg).show(getSupportFragmentManager(), "MergePullRequestDialogFragment"); } } else if (item.getItemId() == R.id.browser) { ActivityHelper.startCustomTab(this, pullRequest.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); MenuItem merge = menu.findItem(R.id.merge); MenuItem reviewers = menu.findItem(R.id.reviewers); boolean isOwner = getPresenter().isOwner(); boolean isLocked = getPresenter().isLocked(); boolean isCollaborator = getPresenter().isCollaborator(); boolean isRepoOwner = getPresenter().isRepoOwner(); boolean isMergable = getPresenter().isMergeable(); merge.setVisible(isMergable && (isRepoOwner || isCollaborator)); reviewers.setVisible((isRepoOwner || isCollaborator)); editMenu.setVisible(isOwner || isCollaborator || isRepoOwner); milestone.setVisible(isCollaborator || isRepoOwner); labels.setVisible(isCollaborator || isRepoOwner); assignees.setVisible(isCollaborator || isRepoOwner); edit.setVisible(isCollaborator || isRepoOwner || isOwner); if (getPresenter().getPullRequest() != null) { closeIssue.setVisible(isRepoOwner || (isOwner || isCollaborator) && getPresenter().getPullRequest().getState() == IssueState.open); lockIssue.setVisible(isRepoOwner || (isOwner || isCollaborator) && getPresenter().getPullRequest().getState() == IssueState.open); closeIssue.setTitle(getPresenter().getPullRequest().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)); } else { closeIssue.setVisible(false); lockIssue.setVisible(false); } return super.onPrepareOptionsMenu(menu); } @Override public void onSetupIssue() { hideProgress(); if (getPresenter().getPullRequest() == null) { return; } supportInvalidateOptionsMenu(); PullRequest pullRequest = getPresenter().getPullRequest(); setTitle(String.format("#%s", pullRequest.getNumber())); boolean isMerge = !InputHelper.isEmpty(pullRequest.getMergedAt()); date.setText(getPresenter().getMergeBy(pullRequest, getApplicationContext())+"\n"+pullRequest.getRepoId()); size.setVisibility(View.GONE); User userModel = pullRequest.getUser(); if (userModel != null) { title.setText(SpannableBuilder.builder().append(userModel.getLogin()).append("/").append(pullRequest.getTitle())); avatarLayout.setUrl(userModel.getAvatarUrl(), userModel.getLogin()); } else { title.setText(SpannableBuilder.builder().append(pullRequest.getTitle())); } detailsIcon.setVisibility(InputHelper.isEmpty(pullRequest.getTitle()) || !ViewHelper.isEllipsed(title) ? View.GONE : View.VISIBLE); pager.setAdapter(new FragmentsPagerAdapter(getSupportFragmentManager(), FragmentPagerAdapterModel.buildForPullRequest(this, pullRequest))); tabs.setupWithViewPager(pager); if (!getPresenter().isLocked() || getPresenter().isOwner()) { pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); hideShowFab(); } }); } if (tabs.getTabAt(2) != null) { tabs.getTabAt(2) .setText(SpannableBuilder.builder() .append(getString(R.string.files)) .append(" ") .append("(") .append(String.valueOf(pullRequest.getChangedFiles())) .append(")")); } if (tabs.getTabAt(1) != null) { tabs.getTabAt(1) .setText(SpannableBuilder.builder() .append(getString(R.string.commits)) .append(" ") .append("(") .append(String.valueOf(pullRequest.getCommits())) .append(")")); } if (tabs.getTabAt(0) != null) { tabs.getTabAt(0) .setText(SpannableBuilder.builder() .append(getString(R.string.details)) .append(" ") .append("(") .append(String.valueOf(pullRequest.getComments())) .append(")")); } hideShowFab(); } @Override public void onMessageDialogActionClicked(boolean isOk, @Nullable Bundle bundle) { super.onMessageDialogActionClicked(isOk, bundle); if (isOk) { getPresenter().onHandleConfirmDialog(bundle); } } @Override public void onLabelsRetrieved(@NonNull List<LabelModel> items) { hideProgress(); LabelsDialogFragment.newInstance(items, getPresenter().getPullRequest() != null ? getPresenter().getPullRequest().getLabels() : null, getPresenter().getRepoId(), getPresenter().getLogin()) .show(getSupportFragmentManager(), "LabelsDialogFragment"); } @Override public void onUpdateMenu() { supportInvalidateOptionsMenu(); } @Override public void onSelectedLabels(@NonNull ArrayList<LabelModel> labels) { Logger.e(labels, labels.size()); getPresenter().onPutLabels(labels); } @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 onUpdateTimeline() { showMessage(R.string.success, R.string.labels_added_successfully); PullRequestTimelineFragment pullRequestDetailsView = (PullRequestTimelineFragment) pager.getAdapter().instantiateItem(pager, 0); if (pullRequestDetailsView != null) { pullRequestDetailsView.onRefresh(); } } @Override public void onMileStoneSelected(@NonNull MilestoneModel milestoneModel) { getPresenter().onPutMilestones(milestoneModel); } @Override public void onFinishActivity() { hideProgress(); finish(); } @Override public void onMerge(@NonNull String msg) { getPresenter().onMerge(msg); } @Override protected void onNavToRepoClicked() { startActivity(RepoPagerActivity.createIntent(this, getPresenter().getRepoId(), getPresenter().getLogin(), RepoPagerMvp.PULL_REQUEST)); finish(); } @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(); } @Override public void onSelectedAssignees(@NonNull ArrayList<User> users, boolean isAssignees) { hideProgress(); getPresenter().onPutAssignees(users, isAssignees); } private void hideShowFab() { if (getPresenter().isLocked() && !getPresenter().isOwner()) { fab.hide(); return; } if (pager.getCurrentItem() == 0) { fab.show(); } else { fab.hide(); } } }