package org.mtransit.android.ui;
import java.lang.ref.WeakReference;
import org.mtransit.android.R;
import org.mtransit.android.commons.MTLog;
import org.mtransit.android.ui.fragment.ABFragment;
import org.mtransit.android.ui.view.MTOnClickListener;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
public class ActionBarController implements Drawable.Callback, MTLog.Loggable {
private static final String TAG = "Stack-" + ActionBarController.class.getSimpleName();
@Override
public String getLogTag() {
return TAG;
}
private WeakReference<MainActivity> mainActivityWR;
private boolean fragmentReady = false;
private CharSequence fragmentTitle;
private CharSequence fragmentSubtitle;
private Integer fragmentBgColor = null;
private View fragmentCustomView = null;
private boolean fragmentCustomViewFocusable = false;
private boolean fragmentCustomViewRequestFocus = false;
private boolean fragmentDisplayHomeAsUpEnabled = ABFragment.DEFAULT_DISPLAY_HOME_AS_UP_ENABLED;
private boolean fragmentShowSearchMenuItem = ABFragment.DEFAULT_SHOW_SEARCH_MENU_ITEM;
private UpOnClickListener upOnClickListener;
private ColorDrawable bgDrawable;
public ActionBarController(MainActivity mainActivity) {
setMainActivity(mainActivity);
init();
}
public void setMainActivity(MainActivity mainActivity) {
this.mainActivityWR = new WeakReference<MainActivity>(mainActivity);
}
private Context getContextOrNull() {
ActionBar ab = getABOrNull();
if (ab != null) {
return ab.getThemedContext();
}
return getMainActivityOrNull();
}
private MainActivity getMainActivityOrNull() {
return this.mainActivityWR == null ? null : this.mainActivityWR.get();
}
private ActionBar getABOrNull() {
MainActivity mainActivity = getMainActivityOrNull();
return mainActivity == null ? null : mainActivity.getSupportActionBar();
}
private final Handler handler = new Handler();
@Override
public void invalidateDrawable(Drawable who) {
ActionBar ab = getABOrNull();
if (ab != null) {
ab.setBackgroundDrawable(who);
}
}
@Override
public void scheduleDrawable(Drawable who, Runnable what, long when) {
this.handler.postAtTime(what, when);
}
@Override
public void unscheduleDrawable(Drawable who, Runnable what) {
this.handler.removeCallbacks(what);
}
private void init() {
MainActivity mainActivity = getMainActivityOrNull();
if (mainActivity != null) {
Toolbar toolbar = (Toolbar) mainActivity.findViewById(R.id.ab_toolbar);
mainActivity.setSupportActionBar(toolbar);
ActionBar ab = getABOrNull();
this.fragmentTitle = mainActivity.getTitle();
this.fragmentSubtitle = ab == null ? null : ab.getSubtitle();
if (ab != null) {
ab.setElevation(0f);
ab.hide();
ab.setDisplayHomeAsUpEnabled(this.fragmentDisplayHomeAsUpEnabled);
ab.setHomeButtonEnabled(true);
}
initBgDrawable(ab);
}
}
public void setAB(ABFragment abf) {
Context context = getContextOrNull();
if (abf != null && context != null) {
setAB(abf.getABTitle(context), abf.getABSubtitle(context), abf.getABBgColor(context), abf.getABCustomView(), abf.isABCustomViewFocusable(),
abf.isABCustomViewRequestFocus(), abf.isABThemeDarkInsteadOfThemeLight(), abf.isABDisplayHomeAsUpEnabled(), abf.isABShowSearchMenuItem(),
abf.isABReady());
}
}
private void setAB(CharSequence title, CharSequence subtitle, Integer bgColor, View customView, boolean customViewFocusable,
boolean customViewRequestFocus, boolean themeDarkInsteadOfThemeLight, boolean displayHomeAsUpEnabled, boolean showSearchMenuItem,
boolean fragmentReady) {
this.fragmentTitle = title;
this.fragmentSubtitle = subtitle;
this.fragmentBgColor = bgColor;
this.fragmentCustomView = customView;
this.fragmentCustomViewFocusable = customViewFocusable;
this.fragmentCustomViewRequestFocus = customViewRequestFocus;
this.fragmentDisplayHomeAsUpEnabled = displayHomeAsUpEnabled;
this.fragmentShowSearchMenuItem = showSearchMenuItem;
this.fragmentReady = fragmentReady;
}
private boolean isCurrentFragmentVisible(Fragment source) {
MainActivity mainActivity = getMainActivityOrNull();
return mainActivity != null && mainActivity.isCurrentFragmentVisible(source);
}
public void setABReady(Fragment source, boolean ready, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentReady = ready;
if (update) {
updateABDrawerClosed();
}
}
public void setABTitle(Fragment source, CharSequence title, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentTitle = title;
if (update) {
updateABDrawerClosed();
}
}
public void setABSubtitle(Fragment source, CharSequence subtitle, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentSubtitle = subtitle;
if (update) {
updateABDrawerClosed();
}
}
public void setABBgColor(Fragment source, Integer bgColor, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentBgColor = bgColor;
if (update) {
updateABDrawerClosed();
}
}
public void setABCustomView(Fragment source, View customView, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentCustomView = customView;
if (update) {
updateABDrawerClosed();
}
}
public void setABCustomViewFocusable(Fragment source, boolean fragmentCustomViewFocusable, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentCustomViewFocusable = fragmentCustomViewFocusable;
if (update) {
updateABDrawerClosed();
}
}
public void setABCustomViewRequestFocus(Fragment source, boolean fragmentCustomViewRequestFocus, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentCustomViewRequestFocus = fragmentCustomViewRequestFocus;
if (update) {
updateABDrawerClosed();
}
}
public void setABDisplayHomeAsUpEnabled(Fragment source, boolean displayHomeAsUpEnabled, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentDisplayHomeAsUpEnabled = displayHomeAsUpEnabled;
if (update) {
updateABDrawerClosed();
}
}
public void setABShowSearchMenuItem(Fragment source, boolean showSearchMenuItem, boolean update) {
if (!isCurrentFragmentVisible(source)) {
return;
}
this.fragmentShowSearchMenuItem = showSearchMenuItem;
if (update) {
updateABDrawerClosed();
}
}
public void updateAB() {
updateABDrawerClosed();
}
public void updateABDrawerClosed() {
ActionBar ab = getABOrNull();
if (ab == null) {
return;
}
if (!this.fragmentReady) {
return;
}
if (this.fragmentCustomView != null) {
if (!this.fragmentCustomView.equals(ab.getCustomView())) {
ab.setCustomView(this.fragmentCustomView);
}
if (!this.fragmentDisplayHomeAsUpEnabled) {
ab.getCustomView().setOnClickListener(getUpOnClickListener(getMainActivityOrNull()));
}
if (this.fragmentCustomViewFocusable) {
this.fragmentCustomView.setFocusable(true);
this.fragmentCustomView.setFocusableInTouchMode(true);
if (this.fragmentCustomViewRequestFocus) {
this.fragmentCustomView.requestFocus();
this.fragmentCustomView.requestFocusFromTouch();
}
}
ab.setDisplayShowCustomEnabled(true);
} else {
ab.setDisplayShowCustomEnabled(false);
}
ab.setDisplayHomeAsUpEnabled(this.fragmentDisplayHomeAsUpEnabled);
if (TextUtils.isEmpty(this.fragmentTitle)) {
ab.setDisplayShowTitleEnabled(false);
} else {
ab.setTitle(this.fragmentTitle);
ab.setSubtitle(this.fragmentSubtitle);
ab.setDisplayShowTitleEnabled(true);
}
if (this.fragmentBgColor != null) {
setBgColor(ab, this.fragmentBgColor);
}
MainActivity mainActivity = getMainActivityOrNull();
if (mainActivity != null) {
mainActivity.updateNavigationDrawerToggleIndicator();
}
updateSearchMenuItemVisibility(); // action bar icons are options menu items
ab.show();
}
public void updateABBgColor() {
if (!this.fragmentReady) {
return;
}
if (this.fragmentBgColor != null) {
setBgColor(getABOrNull(), this.fragmentBgColor);
}
}
private void setBgColor(ActionBar ab, int colorInt) {
ColorDrawable bgDrawable = getBgDrawableOrNull(ab);
if (bgDrawable != null) {
bgDrawable.setColor(colorInt);
}
}
private ColorDrawable getBgDrawableOrNull(ActionBar ab) {
if (this.bgDrawable == null) {
initBgDrawable(ab);
}
return this.bgDrawable;
}
private void initBgDrawable(ActionBar ab) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
this.bgDrawable = new ColorDrawable();
this.bgDrawable.setCallback(this);
} else {
if (ab != null) {
this.bgDrawable = new ColorDrawable();
ab.setBackgroundDrawable(this.bgDrawable);
}
}
}
private UpOnClickListener getUpOnClickListener(MainActivity mainActivity) {
if (this.upOnClickListener == null) {
if (mainActivity == null) {
mainActivity = getMainActivityOrNull();
}
if (mainActivity != null) {
this.upOnClickListener = new UpOnClickListener(mainActivity);
}
}
return this.upOnClickListener;
}
public void onSaveState(Bundle outState) {
}
public void onRestoreState(Bundle savedInstanceState) {
}
public void destroy() {
if (this.mainActivityWR != null) {
this.mainActivityWR.clear();
this.mainActivityWR = null;
}
this.fragmentCustomView = null;
this.upOnClickListener = null;
}
public boolean onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
menuInflater.inflate(R.menu.menu_main, menu);
this.searchMenuItem = menu.findItem(R.id.menu_search);
updateSearchMenuItemVisibility();
return true;
}
private MenuItem searchMenuItem;
public void updateSearchMenuItemVisibility() {
if (this.searchMenuItem != null) {
this.searchMenuItem.setVisible(this.fragmentShowSearchMenuItem);
}
}
public boolean onOptionsItemSelected(MenuItem item) {
MainActivity mainActivity = getMainActivityOrNull();
if (mainActivity != null) {
if (item.getItemId() == android.R.id.home) {
if (mainActivity.onUpIconClick()) {
return true; // handled
}
}
if (item.getItemId() == R.id.menu_search) {
mainActivity.onSearchRequested();
return true; // handled
}
}
return false; // not handled
}
private static class UpOnClickListener extends MTOnClickListener {
private WeakReference<MainActivity> mainActivityWR;
public UpOnClickListener(MainActivity mainActivity) {
this.mainActivityWR = new WeakReference<MainActivity>(mainActivity);
}
@Override
public void onClickMT(View view) {
MainActivity mainActivity = this.mainActivityWR == null ? null : this.mainActivityWR.get();
if (mainActivity != null) {
mainActivity.onUpIconClick();
}
}
}
public interface ActionBarColorizer {
int getBgColor(int position);
}
public static class SimpleActionBarColorizer implements ActionBarColorizer {
private int[] bgColors;
@Override
public final int getBgColor(int position) {
return bgColors[position % bgColors.length];
}
public void setBgColors(int... colors) {
bgColors = colors;
}
}
}