package com.gh4a.activities.home;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.view.Menu;
import android.view.MenuItem;
import com.gh4a.R;
import com.gh4a.fragment.IssueListFragment;
import com.gh4a.utils.ApiHelpers;
import java.util.HashMap;
import java.util.Map;
public class IssueListFactory extends FragmentFactory {
private static final String QUERY = "is:%s is:%s %s:%s";
private static final String STATE_KEY_SHOWING_CLOSED = "issue:showing_closed";
private static final int[] TAB_TITLES = new int[] {
R.string.created, R.string.assigned, R.string.mentioned, R.string.participating
};
private boolean mShowingClosed;
private final String mLogin;
private final boolean mIsPullRequest;
private final IssueListFragment.SortDrawerHelper mDrawerHelper =
new IssueListFragment.SortDrawerHelper();
private int[] mHeaderColorAttrs;
public IssueListFactory(HomeActivity activity, String userLogin, boolean pr) {
super(activity);
mLogin = userLogin;
mShowingClosed = false;
mIsPullRequest = pr;
}
@Override
protected @StringRes int getTitleResId() {
if (mShowingClosed) {
return mIsPullRequest ? R.string.pull_requests_closed : R.string.issues_closed;
} else {
return mIsPullRequest ? R.string.pull_requests_open : R.string.issues_open;
}
}
@Override
protected int[] getTabTitleResIds() {
return TAB_TITLES;
}
@Override
protected int[] getHeaderColorAttrs() {
return mHeaderColorAttrs;
}
@Override
protected Fragment makeFragment(int position) {
Map<String, String> filterData = new HashMap<>();
filterData.put("sort", mDrawerHelper.getSortMode());
filterData.put("order", mDrawerHelper.getSortOrder());
final String action;
if (position == 1) {
action = "assignee";
} else if (position == 2) {
action = "mentions";
} else if (position == 3) {
action = "involves";
} else {
action = "author";
}
filterData.put("q", String.format(QUERY, mIsPullRequest ? "pr" : "issue",
mShowingClosed ? ApiHelpers.IssueState.CLOSED : ApiHelpers.IssueState.OPEN,
action, mLogin));
return IssueListFragment.newInstance(filterData,
mShowingClosed ? ApiHelpers.IssueState.CLOSED : ApiHelpers.IssueState.OPEN,
mIsPullRequest ? R.string.no_pull_requests_found : R.string.no_issues_found,
true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
int resIdState = mShowingClosed ?
R.string.issues_menu_show_open : R.string.issues_menu_show_closed;
MenuItem item = menu.add(Menu.NONE, Menu.FIRST, Menu.NONE, resIdState);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
item = menu.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, R.string.actions)
.setIcon(R.drawable.overflow_horizontal);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Menu.FIRST:
toggleStateFilter();
return true;
case Menu.FIRST + 1:
mActivity.toggleToolDrawer();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected int[] getToolDrawerMenuResIds() {
return new int[] { IssueListFragment.SortDrawerHelper.getMenuResId() };
}
@Override
protected @IdRes int getInitialToolDrawerSelection() {
return R.id.sort_created_desc;
}
@Override
protected boolean onDrawerItemSelected(MenuItem item) {
if (mDrawerHelper.handleItemSelection(item)) {
reloadIssueList();
return true;
}
return false;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(STATE_KEY_SHOWING_CLOSED, mShowingClosed);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
boolean showedClosed = state.getBoolean(STATE_KEY_SHOWING_CLOSED, false);
if (mShowingClosed != showedClosed) {
mShowingClosed = showedClosed;
reloadIssueList();
updateHeaderColor();
mActivity.invalidateTitle();
}
}
private void reloadIssueList() {
mActivity.invalidateFragments();
}
private void toggleStateFilter() {
mShowingClosed = !mShowingClosed;
reloadIssueList();
updateHeaderColor();
mActivity.invalidateTitle();
mActivity.supportInvalidateOptionsMenu();
}
private void updateHeaderColor() {
mHeaderColorAttrs = new int[] {
mShowingClosed ? R.attr.colorIssueClosed : R.attr.colorIssueOpen,
mShowingClosed ? R.attr.colorIssueClosedDark : R.attr.colorIssueOpenDark
};
mActivity.invalidateTabs();
}
}