package sk.m217.actionbarcompat;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
private static final String MENU_RES_NAMESPACE = "http://schemas.android.com/apk/res/android";
private static final String MENU_ATTR_ID = "id";
private static final String MENU_ATTR_SHOW_AS_ACTION = "showAsAction";
private static final String MENU_ATTR_ACTION_LAYOUT = "actionLayout";
protected Set<Integer> mActionItemIds = new HashSet<Integer>();
protected Map<Integer, Integer> mActionItemIdsToActionLayoutLookup = new HashMap<Integer, Integer>();
protected Map<Integer, Integer> mActionItemIdsToShowAsActionLookup = new HashMap<Integer, Integer>();
private SimpleMenu mMenu;
private HomeView mHomeLayout;
private HomeView mExpandedHomeLayout;
private TextView mTitleText;
private boolean mInitialized = false;
private boolean mUserTitle = false;
private int mDisplayOptions = -1;
private SimpleMenuItem mHomeItem;
private Drawable mIcon;
private CharSequence mTitle;
private ExpandedActionViewMenuPresenter mExpandedMenuPresenter;
private ActionMenuPresenter mActionMenuPresenter;
private View mExpandedActionView;
private static final int DISPLAY_DEFAULT = 0;
private static final int DISPLAY_SHOW_HOME = 0x2;
private static final int DISPLAY_HOME_AS_UP = 0x4;
private static final int DISPLAY_SHOW_TITLE = 0x8;
private static final String TAG = ActionBarHelperBase.class.getName();
private static final String KEY_EXPANDED_ITEM = "sk.m217.actionbarcompat.expanded_item";
private static final String KEY_HIERARCHY_STATE = "sk.m217.actionbarcompat.hierarchy_state";
super(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
}
@Override
initActionBar();
}
if (mInitialized) {
return;
}
mActivity.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.actionbar_compat);
setupActionBar();
mMenu = new SimpleMenu(mActivity);
mMenu.setCallback(new SimpleMenu.Callback() {
@Override
public boolean (SimpleMenu menu, MenuItem item) {
return mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
}
});
mActivity.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, mMenu);
mActivity.onPrepareOptionsMenu(mMenu);
for (int i = 0; i < mMenu.size(); i++) {
MenuItem item = mMenu.getItem(i);
if (mActionItemIds.contains(item.getItemId())) {
addActionItemCompatFromMenuItem(item);
}
}
mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter();
mActionMenuPresenter = new ActionMenuPresenter();
mMenu.addMenuPresenter(mExpandedMenuPresenter);
mMenu.addMenuPresenter(mActionMenuPresenter);
mInitialized = true;
}
private final OnClickListener mExpandedActionViewUpListener = new OnClickListener() {
@Override
final SimpleMenuItem item = mExpandedMenuPresenter.mCurrentExpandedItem;
if (item != null) {
item.collapseActionView();
}
}
};
private final OnClickListener mUpClickListener = new OnClickListener() {
@Override
mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mHomeItem);
}
};
final ViewGroup actionBarCompat = getActionBarCompat();
if (actionBarCompat == null) {
return;
}
mHomeItem = new SimpleMenuItem(new SimpleMenu(mActivity),
android.R.id.home, 0, mActivity.getTitle());
final LayoutInflater inflater = LayoutInflater.from(mActivity);
mHomeLayout = (HomeView) inflater.inflate(
R.layout.actionbar_compat_home, actionBarCompat, false);
mHomeLayout.setOnClickListener(mUpClickListener);
mHomeLayout.setClickable(true);
mHomeLayout.setFocusable(true);
mExpandedHomeLayout = (HomeView) inflater.inflate(
R.layout.actionbar_compat_home, actionBarCompat, false);
mExpandedHomeLayout.setUp(true);
mExpandedHomeLayout.setOnClickListener(mExpandedActionViewUpListener);
mExpandedHomeLayout.setContentDescription(mActivity.getResources().getText(
R.string.action_bar_up_description));
mExpandedHomeLayout.setFocusable(true);
ApplicationInfo appInfo = mActivity.getApplicationInfo();
PackageManager pm = mActivity.getPackageManager();
try {
mIcon = pm.getActivityIcon(mActivity.getComponentName());
} catch (NameNotFoundException e) {
Log.e(TAG, "Activity component name not found!", e);
}
if (mIcon == null) {
mIcon = appInfo.loadIcon(pm);
}
mHomeLayout.setIcon(mIcon);
actionBarCompat.addView(mHomeLayout);
LinearLayout.LayoutParams springLayoutParams = new LinearLayout.LayoutParams(
0, ViewGroup.LayoutParams.FILL_PARENT);
springLayoutParams.weight = 1;
mTitle = mActivity.getTitle();
mTitleText = new TextView(mActivity, null, R.attr.actionbarCompatTitleStyle);
mTitleText.setLayoutParams(springLayoutParams);
mTitleText.setText(mTitle);
actionBarCompat.addView(mTitleText);
setDisplayOptions(DISPLAY_SHOW_HOME | DISPLAY_SHOW_TITLE);
}
@Override
View refreshButton = mActivity.findViewById(R.id.actionbar_compat_item_refresh);
View refreshIndicator = mActivity.findViewById(
R.id.actionbar_compat_item_refresh_progress);
if (refreshButton != null) {
refreshButton.setVisibility(refreshing ? View.GONE : View.VISIBLE);
}
if (refreshIndicator != null) {
refreshIndicator.setVisibility(refreshing ? View.VISIBLE : View.GONE);
}
}
@Override
public boolean (Menu menu) {
for (Integer id : mActionItemIds) {
if (!(menu instanceof SimpleMenu)) {
menu.removeItem(id);
}
}
return true;
}
@Override
TextView titleView = (TextView) mActivity.findViewById(R.id.actionbar_compat_title);
if (titleView != null && !mUserTitle) {
mTitle = title;
if ((mDisplayOptions & DISPLAY_SHOW_TITLE) != 0) {
titleView.setText(mTitle);
}
}
}
public MenuInflater (MenuInflater superMenuInflater) {
return new WrappedMenuInflater(mActivity, superMenuInflater);
}
return (ViewGroup) mActivity.findViewById(R.id.actionbar_compat);
}
private View (final MenuItem item) {
final int itemId = item.getItemId();
final SimpleMenuItem simpleItem = (SimpleMenuItem) item;
final ViewGroup actionBarCompat = getActionBarCompat();
if (actionBarCompat == null) {
return null;
}
View view;
if (simpleItem.getActionView() != null && !simpleItem.hasCollapsibleActionView()) {
view = simpleItem.getActionView();
} else {
ImageButton actionButton = new ImageButton(mActivity, null,
R.attr.actionbarCompatItemStyle);
actionButton.setLayoutParams(new ViewGroup.LayoutParams(
(int) mActivity.getResources().getDimension(
R.dimen.actionbar_compat_button_width),
ViewGroup.LayoutParams.FILL_PARENT));
if (itemId == R.id.menu_refresh) {
actionButton.setId(R.id.actionbar_compat_item_refresh);
}
actionButton.setImageDrawable(item.getIcon());
actionButton.setScaleType(ImageView.ScaleType.CENTER);
actionButton.setContentDescription(item.getTitle());
actionButton.setOnClickListener(new View.OnClickListener() {
if (simpleItem.isEnabled()) {
if (simpleItem.hasCollapsibleActionView()) {
simpleItem.expandActionView();
}
simpleItem.invoke();
}
}
});
view = actionButton;
}
simpleItem.setView(view);
actionBarCompat.addView(view);
if (item.getItemId() == R.id.menu_refresh) {
ProgressBar indicator = new ProgressBar(mActivity, null,
R.attr.actionbarCompatProgressIndicatorStyle);
final int buttonWidth = mActivity.getResources().getDimensionPixelSize(
R.dimen.actionbar_compat_button_width);
final int buttonHeight = mActivity.getResources().getDimensionPixelSize(
R.dimen.actionbar_compat_height);
final int progressIndicatorWidth = buttonWidth / 2;
LinearLayout.LayoutParams indicatorLayoutParams = new LinearLayout.LayoutParams(
progressIndicatorWidth, progressIndicatorWidth);
indicatorLayoutParams.setMargins(
(buttonWidth - progressIndicatorWidth) / 2,
(buttonHeight - progressIndicatorWidth) / 2,
(buttonWidth - progressIndicatorWidth) / 2,
0);
indicator.setLayoutParams(indicatorLayoutParams);
indicator.setVisibility(View.GONE);
indicator.setId(R.id.actionbar_compat_item_refresh_progress);
actionBarCompat.addView(indicator);
}
return view;
}
private class extends MenuInflater {
MenuInflater mInflater;
public (Context context, MenuInflater inflater) {
super(context);
mInflater = inflater;
}
@Override
public void (int menuRes, Menu menu) {
if (!(menu instanceof SimpleMenu)) {
mInflater.inflate(menuRes, menu);
return;
}
loadActionBarMetadata(menuRes);
mInflater.inflate(menuRes, menu);
for (int i = 0; i < menu.size(); i++) {
SimpleMenuItem item = (SimpleMenuItem) menu.getItem(i);
int itemId = item.getItemId();
if (mActionItemIdsToShowAsActionLookup.containsKey(itemId)) {
item.setShowAsAction(mActionItemIdsToShowAsActionLookup.get(itemId));
}
if (mActionItemIdsToActionLayoutLookup.containsKey(itemId)) {
item.setActionView(mActionItemIdsToActionLayoutLookup.get(itemId));
}
}
}
private void (int menuResId) {
XmlResourceParser parser = null;
try {
parser = mActivity.getResources().getXml(menuResId);
int eventType = parser.getEventType();
int itemId;
int showAsAction;
boolean eof = false;
while (!eof) {
switch (eventType) {
case XmlPullParser.START_TAG:
if (!parser.getName().equals("item")) {
break;
}
itemId = parser.getAttributeResourceValue(MENU_RES_NAMESPACE,
MENU_ATTR_ID, 0);
if (itemId == 0) {
break;
}
showAsAction = parser.getAttributeIntValue(MENU_RES_NAMESPACE,
MENU_ATTR_SHOW_AS_ACTION, -1);
mActionItemIdsToShowAsActionLookup.put(itemId, showAsAction);
if ((showAsAction & MenuItem.SHOW_AS_ACTION_ALWAYS) != 0 ||
(showAsAction & MenuItem.SHOW_AS_ACTION_IF_ROOM) != 0) {
int actionLayout = parser.getAttributeResourceValue(MENU_RES_NAMESPACE,
MENU_ATTR_ACTION_LAYOUT, 0);
if (actionLayout != 0) {
mActionItemIdsToActionLayoutLookup.put(itemId, actionLayout);
}
mActionItemIds.add(itemId);
}
break;
case XmlPullParser.END_DOCUMENT:
eof = true;
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
throw new InflateException("Error inflating menu XML", e);
} catch (IOException e) {
throw new InflateException("Error inflating menu XML", e);
} finally {
if (parser != null) {
parser.close();
}
}
}
}
private static class HomeView extends LinearLayout {
private View mUpView;
private ImageView mIconView;
super(context);
}
public HomeView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HomeView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public void setUp(
boolean isUp) {
mUpView.setVisibility(isUp ? VISIBLE : INVISIBLE);
}
public void setIcon(Drawable icon) {
mIconView.setImageDrawable(icon);
}
@Override
super.onFinishInflate();
mUpView = findViewById(R.id.actionbar_compat_up);
mIconView = (ImageView) findViewById(R.id.actionbar_compat_home);
}
}
private class implements SimpleMenuPresenter {
@Override
public void (Context context, SimpleMenu menu) {
}
@Override
public void (SimpleMenu menu, SimpleMenuItem item, int change) {
switch (change) {
case SimpleMenu.ITEM_CHANGED_NEW:
break;
case SimpleMenu.ITEM_CHANGED_TITLE:
if (item != null && item.getView() instanceof ImageButton) {
ImageButton actionButton = (ImageButton) item.getView();
actionButton.setContentDescription(item.getTitle());
}
break;
case SimpleMenu.ITEM_CHANGED_ICON:
if (item != null && item.getView() instanceof ImageButton) {
ImageButton actionButton = (ImageButton) item.getView();
actionButton.setImageDrawable(item.getIcon());
}
break;
case SimpleMenu.ITEM_CHANGED_ACTION:
break;
case SimpleMenu.ITEM_CHANGED_ACTION_VIEW:
break;
case SimpleMenu.ITEM_CHANGED_VISIBILITY:
if (item != null && item.getView() != null) {
item.getView().setVisibility(
item.isVisible() ? View.VISIBLE : View.GONE);
}
break;
}
}
@Override
return false;
}
@Override
public boolean (SimpleMenu menu, SimpleMenuItem item) {
return false;
}
}
SimpleMenu mMenu;
SimpleMenuItem mCurrentExpandedItem;
@Override
public void (Context context, SimpleMenu menu) {
mMenu = menu;
}
@Override
public void (SimpleMenu menu, SimpleMenuItem item, int change) {
}
@Override
final ViewGroup actionBarCompat = getActionBarCompat();
if (actionBarCompat == null) {
return false;
}
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
params.weight = 1;
mExpandedActionView = item.getActionView();
mExpandedHomeLayout.setIcon(mIcon.getConstantState().newDrawable(
mActivity.getResources()));
mCurrentExpandedItem = item;
if (mExpandedHomeLayout.getParent() != actionBarCompat) {
actionBarCompat.addView(mExpandedHomeLayout, 1);
}
if (mExpandedActionView.getParent() != actionBarCompat) {
actionBarCompat.addView(mExpandedActionView, 2, params);
}
mHomeLayout.setVisibility(View.GONE);
LinearLayout.LayoutParams springLayoutParams =
(LinearLayout.LayoutParams) mTitleText.getLayoutParams();
springLayoutParams.weight = 0;
mTitleText.setLayoutParams(springLayoutParams);
mTitleText.setVisibility(View.INVISIBLE);
if (item.isVisible() && item.getView() != null) {
item.getView().setVisibility(View.GONE);
}
item.setActionViewExpanded(true);
actionBarCompat.requestLayout();
return true;
}
@Override
public boolean (SimpleMenu menu, SimpleMenuItem item) {
final ViewGroup actionBar = getActionBarCompat();
if (actionBar == null) {
return false;
}
actionBar.removeView(mExpandedActionView);
actionBar.removeView(mExpandedHomeLayout);
mExpandedActionView = null;
if ((mDisplayOptions & DISPLAY_SHOW_HOME) != 0) {
mHomeLayout.setVisibility(View.VISIBLE);
}
LinearLayout.LayoutParams springLayoutParams =
(LinearLayout.LayoutParams) mTitleText.getLayoutParams();
springLayoutParams.weight = 1;
mTitleText.setLayoutParams(springLayoutParams);
if ((mDisplayOptions & DISPLAY_SHOW_TITLE) != 0) {
mTitleText.setVisibility(View.VISIBLE);
}
if (item.isVisible() && item.getView() != null) {
item.getView().setVisibility(View.VISIBLE);
}
item.setActionViewExpanded(false);
mExpandedHomeLayout.setIcon(null);
mCurrentExpandedItem = null;
actionBar.requestLayout();
return true;
}
}
final int flagsChanged = mDisplayOptions == -1 ? -1 : options ^ mDisplayOptions;
mDisplayOptions = options;
final boolean showHome = (options & DISPLAY_SHOW_HOME) != 0;
final int vis = showHome && mExpandedActionView == null ? View.VISIBLE : View.GONE;
mHomeLayout.setVisibility(vis);
if ((flagsChanged & DISPLAY_HOME_AS_UP) != 0) {
final boolean setUp = (options & DISPLAY_HOME_AS_UP) != 0;
mHomeLayout.setUp(setUp);
if (setUp) {
setHomeButtonEnabled(true);
}
}
if ((flagsChanged & DISPLAY_SHOW_TITLE) != 0) {
if ((options & DISPLAY_SHOW_TITLE) != 0) {
if (mTitle != null) {
mTitleText.setText(mTitle);
}
mTitleText.setVisibility(View.VISIBLE);
} else {
mTitleText.setText("");
mTitleText.setVisibility(View.INVISIBLE);
}
}
if (!mHomeLayout.isEnabled()) {
mHomeLayout.setContentDescription(null);
} else if ((options & DISPLAY_HOME_AS_UP) != 0) {
mHomeLayout.setContentDescription(mActivity.getResources().getText(
R.string.action_bar_up_description));
} else {
mHomeLayout.setContentDescription(mActivity.getResources().getText(
R.string.action_bar_home_description));
}
}
setDisplayOptions((options & mask) | (mDisplayOptions & ~mask));
}
setIcon(mActivity.getResources().getDrawable(resId));
}
public void setIcon(Drawable icon) {
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
mIcon = icon;
if (icon != null) {
mHomeLayout.setIcon(icon);
}
}
public void setTitle(CharSequence title) {
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
mTitle = title;
mUserTitle = true;
if ((mDisplayOptions & DISPLAY_SHOW_TITLE) != 0) {
mTitleText.setText(mTitle);
}
}
setTitle(mActivity.getString(resId));
}
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME);
}
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP);
}
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE);
}
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
final ViewGroup actionBarCompat = getActionBarCompat();
if (actionBarCompat != null) {
actionBarCompat.setBackgroundDrawable(d);
}
}
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
return mTitle;
}
if (!mInitialized) {
throw new IllegalStateException("ActionBar has not been initialized.");
}
mHomeLayout.setEnabled(enabled);
mHomeLayout.setFocusable(enabled);
if (!enabled) {
mHomeLayout.setContentDescription(null);
} else if ((mDisplayOptions & DISPLAY_HOME_AS_UP) != 0) {
mHomeLayout.setContentDescription(mActivity.getResources().getText(
R.string.action_bar_up_description));
} else {
mHomeLayout.setContentDescription(mActivity.getResources().getText(
R.string.action_bar_home_description));
}
}
@Override
if (mExpandedMenuPresenter != null &&
mExpandedMenuPresenter.mCurrentExpandedItem != null) {
outState.putInt(KEY_EXPANDED_ITEM,
mExpandedMenuPresenter.mCurrentExpandedItem.getItemId());
}
final ViewGroup actionBarCompat = getActionBarCompat();
if (actionBarCompat != null) {
SparseArray<Parcelable> stateArray = new SparseArray<Parcelable>();
actionBarCompat.saveHierarchyState(stateArray);
outState.putSparseParcelableArray(KEY_HIERARCHY_STATE, stateArray);
}
}
@Override
int itemId = savedInstanceState.getInt(KEY_EXPANDED_ITEM);
if (itemId != 0 && mExpandedMenuPresenter != null && mMenu != null) {
final SimpleMenuItem item = (SimpleMenuItem) mMenu.findItem(itemId);
if (item != null) {
item.expandActionView();
}
}
final ViewGroup actionBarCompat = getActionBarCompat();
if (actionBarCompat != null) {
SparseArray<Parcelable> stateArray = savedInstanceState
.getSparseParcelableArray(KEY_HIERARCHY_STATE);
if (stateArray != null) {
actionBarCompat.restoreHierarchyState(stateArray);
}
}
}
}