17ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik/*
27ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Copyright 2011 The Android Open Source Project
37ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik *
47ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Licensed under the Apache License, Version 2.0 (the "License");
57ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * you may not use this file except in compliance with the License.
67ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * You may obtain a copy of the License at
77ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik *
87ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik *     http://www.apache.org/licenses/LICENSE-2.0
97ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik *
107ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Unless required by applicable law or agreed to in writing, software
117ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * distributed under the License is distributed on an "AS IS" BASIS,
127ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * See the License for the specific language governing permissions and
147ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * limitations under the License.
157ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */
167ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
177ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikpackage com.example.android.actionbarcompat;
187ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
197ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport org.xmlpull.v1.XmlPullParser;
207ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport org.xmlpull.v1.XmlPullParserException;
217ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
227ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.app.Activity;
237ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.content.Context;
247ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.content.res.XmlResourceParser;
257ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.os.Bundle;
267ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.InflateException;
277ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.Menu;
287ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.MenuInflater;
297ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.MenuItem;
307ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.View;
317ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.ViewGroup;
327ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.Window;
337ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.ImageButton;
347ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.ImageView;
357ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.LinearLayout;
367ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.ProgressBar;
377ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.TextView;
387ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
397ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport java.io.IOException;
407ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport java.util.HashSet;
417ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport java.util.Set;
427ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
437ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik/**
447ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * A class that implements the action bar pattern for pre-Honeycomb devices.
457ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */
467ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikpublic class ActionBarHelperBase extends ActionBarHelper {
477ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    private static final String MENU_RES_NAMESPACE = "http://schemas.android.com/apk/res/android";
487ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    private static final String MENU_ATTR_ID = "id";
497ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    private static final String MENU_ATTR_SHOW_AS_ACTION = "showAsAction";
507ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
517ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    protected Set<Integer> mActionItemIds = new HashSet<Integer>();
527ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
537ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    protected ActionBarHelperBase(Activity activity) {
547ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        super(activity);
557ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
567ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
577ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**{@inheritDoc}*/
587ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    @Override
597ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    public void onCreate(Bundle savedInstanceState) {
607ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
617ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
627ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
637ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**{@inheritDoc}*/
647ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    @Override
657ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    public void onPostCreate(Bundle savedInstanceState) {
667ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        mActivity.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
677ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                R.layout.actionbar_compat);
687ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        setupActionBar();
697ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
707ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        SimpleMenu menu = new SimpleMenu(mActivity);
717ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        mActivity.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu);
727ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        mActivity.onPrepareOptionsMenu(menu);
737ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        for (int i = 0; i < menu.size(); i++) {
747ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            MenuItem item = menu.getItem(i);
757ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            if (mActionItemIds.contains(item.getItemId())) {
767ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                addActionItemCompatFromMenuItem(item);
777ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            }
787ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
797ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
807ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
817ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**
827ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * Sets up the compatibility action bar with the given title.
837ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     */
847ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    private void setupActionBar() {
857ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        final ViewGroup actionBarCompat = getActionBarCompat();
867ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        if (actionBarCompat == null) {
877ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            return;
887ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
897ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
907ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        LinearLayout.LayoutParams springLayoutParams = new LinearLayout.LayoutParams(
917ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                0, ViewGroup.LayoutParams.FILL_PARENT);
927ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        springLayoutParams.weight = 1;
937ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
947ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        // Add Home button
957ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        SimpleMenu tempMenu = new SimpleMenu(mActivity);
967ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        SimpleMenuItem homeItem = new SimpleMenuItem(
977ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                tempMenu, android.R.id.home, 0, mActivity.getString(R.string.app_name));
987ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        homeItem.setIcon(R.drawable.ic_home);
997ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        addActionItemCompatFromMenuItem(homeItem);
1007ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1017ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        // Add title text
1027ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        TextView titleText = new TextView(mActivity, null, R.attr.actionbarCompatTitleStyle);
1037ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        titleText.setLayoutParams(springLayoutParams);
1047ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        titleText.setText(mActivity.getTitle());
1057ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        actionBarCompat.addView(titleText);
1067ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
1077ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1087ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**{@inheritDoc}*/
1097ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    @Override
1107ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    public void setRefreshActionItemState(boolean refreshing) {
1117ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        View refreshButton = mActivity.findViewById(R.id.actionbar_compat_item_refresh);
1127ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        View refreshIndicator = mActivity.findViewById(
1137ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                R.id.actionbar_compat_item_refresh_progress);
1147ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1157ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        if (refreshButton != null) {
1167ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            refreshButton.setVisibility(refreshing ? View.GONE : View.VISIBLE);
1177ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
1187ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        if (refreshIndicator != null) {
1197ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            refreshIndicator.setVisibility(refreshing ? View.VISIBLE : View.GONE);
1207ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
1217ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
1227ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1237ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**
1247ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * Action bar helper code to be run in {@link Activity#onCreateOptionsMenu(android.view.Menu)}.
1257ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     *
1267ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * NOTE: This code will mark on-screen menu items as invisible.
1277ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     */
1287ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    @Override
1297ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    public boolean onCreateOptionsMenu(Menu menu) {
1307ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        // Hides on-screen action items from the options menu.
1317ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        for (Integer id : mActionItemIds) {
1327ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            menu.findItem(id).setVisible(false);
1337ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
1347ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        return true;
1357ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
1367ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1377ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**{@inheritDoc}*/
1387ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    @Override
1397ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    protected void onTitleChanged(CharSequence title, int color) {
1407ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        TextView titleView = (TextView) mActivity.findViewById(R.id.actionbar_compat_title);
1417ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        if (titleView != null) {
1427ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            titleView.setText(title);
1437ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
1447ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
1457ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1467ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**
1477ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * Returns a {@link android.view.MenuInflater} that can read action bar metadata on
1487ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * pre-Honeycomb devices.
1497ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     */
1507ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    public MenuInflater getMenuInflater(MenuInflater superMenuInflater) {
1517ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        return new WrappedMenuInflater(mActivity, superMenuInflater);
1527ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
1537ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1547ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**
1557ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * Returns the {@link android.view.ViewGroup} for the action bar on phones (compatibility action
1567ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * bar). Can return null, and will return null on Honeycomb.
1577ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     */
1587ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    private ViewGroup getActionBarCompat() {
1597ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        return (ViewGroup) mActivity.findViewById(R.id.actionbar_compat);
1607ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
1617ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1627ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**
1637ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * Adds an action button to the compatibility action bar, using menu information from a {@link
1647ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * android.view.MenuItem}. If the menu item ID is <code>menu_refresh</code>, the menu item's
1657ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * state can be changed to show a loading spinner using
1667ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * {@link com.example.android.actionbarcompat.ActionBarHelperBase#setRefreshActionItemState(boolean)}.
1677ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     */
1687ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    private View addActionItemCompatFromMenuItem(final MenuItem item) {
1697ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        final int itemId = item.getItemId();
1707ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1717ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        final ViewGroup actionBar = getActionBarCompat();
1727ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        if (actionBar == null) {
1737ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            return null;
1747ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
1757ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1767ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        // Create the button
1777ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        ImageButton actionButton = new ImageButton(mActivity, null,
1787ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                itemId == android.R.id.home
1797ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                        ? R.attr.actionbarCompatItemHomeStyle
1807ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                        : R.attr.actionbarCompatItemStyle);
1817ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        actionButton.setLayoutParams(new ViewGroup.LayoutParams(
1827ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                (int) mActivity.getResources().getDimension(
1837ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                        itemId == android.R.id.home
1847ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                ? R.dimen.actionbar_compat_button_home_width
1857ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                : R.dimen.actionbar_compat_button_width),
1867ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                ViewGroup.LayoutParams.FILL_PARENT));
1877ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        if (itemId == R.id.menu_refresh) {
1887ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            actionButton.setId(R.id.actionbar_compat_item_refresh);
1897ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
1907ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        actionButton.setImageDrawable(item.getIcon());
1917ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        actionButton.setScaleType(ImageView.ScaleType.CENTER);
1927ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        actionButton.setContentDescription(item.getTitle());
1937ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        actionButton.setOnClickListener(new View.OnClickListener() {
1947ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            public void onClick(View view) {
1957ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item);
1967ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            }
1977ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        });
1987ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
1997ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        actionBar.addView(actionButton);
2007ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2017ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        if (item.getItemId() == R.id.menu_refresh) {
2027ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            // Refresh buttons should be stateful, and allow for indeterminate progress indicators,
2037ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            // so add those.
2047ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            ProgressBar indicator = new ProgressBar(mActivity, null,
2057ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    R.attr.actionbarCompatProgressIndicatorStyle);
2067ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2077ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            final int buttonWidth = mActivity.getResources().getDimensionPixelSize(
2087ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    R.dimen.actionbar_compat_button_width);
2097ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            final int buttonHeight = mActivity.getResources().getDimensionPixelSize(
2107ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    R.dimen.actionbar_compat_height);
2117ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            final int progressIndicatorWidth = buttonWidth / 2;
2127ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2137ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            LinearLayout.LayoutParams indicatorLayoutParams = new LinearLayout.LayoutParams(
2147ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    progressIndicatorWidth, progressIndicatorWidth);
2157ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            indicatorLayoutParams.setMargins(
2167ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    (buttonWidth - progressIndicatorWidth) / 2,
2177ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    (buttonHeight - progressIndicatorWidth) / 2,
2187ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    (buttonWidth - progressIndicatorWidth) / 2,
2197ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    0);
2207ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            indicator.setLayoutParams(indicatorLayoutParams);
2217ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            indicator.setVisibility(View.GONE);
2227ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            indicator.setId(R.id.actionbar_compat_item_refresh_progress);
2237ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            actionBar.addView(indicator);
2247ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
2257ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2267ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        return actionButton;
2277ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
2287ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2297ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    /**
2307ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     * A {@link android.view.MenuInflater} that reads action bar metadata.
2317ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik     */
2327ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    private class WrappedMenuInflater extends MenuInflater {
2337ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        MenuInflater mInflater;
2347ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2357ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        public WrappedMenuInflater(Context context, MenuInflater inflater) {
2367ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            super(context);
2377ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            mInflater = inflater;
2387ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
2397ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2407ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        @Override
2417ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        public void inflate(int menuRes, Menu menu) {
2427ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            loadActionBarMetadata(menuRes);
2437ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            mInflater.inflate(menuRes, menu);
2447ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
2457ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2467ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        /**
2477ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik         * Loads action bar metadata from a menu resource, storing a list of menu item IDs that
2487ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik         * should be shown on-screen (i.e. those with showAsAction set to always or ifRoom).
2497ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik         * @param menuResId
2507ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik         */
2517ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        private void loadActionBarMetadata(int menuResId) {
2527ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            XmlResourceParser parser = null;
2537ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            try {
2547ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                parser = mActivity.getResources().getXml(menuResId);
2557ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2567ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                int eventType = parser.getEventType();
2577ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                int itemId;
2587ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                int showAsAction;
2597ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2607ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                boolean eof = false;
2617ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                while (!eof) {
2627ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    switch (eventType) {
2637ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                        case XmlPullParser.START_TAG:
2647ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            if (!parser.getName().equals("item")) {
2657ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                break;
2667ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            }
2677ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2687ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            itemId = parser.getAttributeResourceValue(MENU_RES_NAMESPACE,
2697ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                    MENU_ATTR_ID, 0);
2707ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            if (itemId == 0) {
2717ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                break;
2727ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            }
2737ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2747ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            showAsAction = parser.getAttributeIntValue(MENU_RES_NAMESPACE,
2757ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                    MENU_ATTR_SHOW_AS_ACTION, -1);
2767ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            if (showAsAction == MenuItem.SHOW_AS_ACTION_ALWAYS ||
2777ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                    showAsAction == MenuItem.SHOW_AS_ACTION_IF_ROOM) {
2787ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                                mActionItemIds.add(itemId);
2797ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            }
2807ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            break;
2817ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2827ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                        case XmlPullParser.END_DOCUMENT:
2837ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            eof = true;
2847ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                            break;
2857ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    }
2867ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
2877ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    eventType = parser.next();
2887ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                }
2897ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            } catch (XmlPullParserException e) {
2907ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                throw new InflateException("Error inflating menu XML", e);
2917ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            } catch (IOException e) {
2927ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                throw new InflateException("Error inflating menu XML", e);
2937ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            } finally {
2947ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                if (parser != null) {
2957ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                    parser.close();
2967ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik                }
2977ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik            }
2987ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik        }
2997ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik
3007ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik    }
3017ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik}
302