Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c404c4fb authored by Adam Powell's avatar Adam Powell Committed by Android (Google) Code Review
Browse files

Merge "Action bar work for phones"

parents fbfb7e50 dae7824c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2102,6 +2102,7 @@ package android.app {
    method public abstract void setCustomView(android.view.View);
    method public abstract void setCustomView(android.view.View, android.app.ActionBar.LayoutParams);
    method public abstract void setCustomView(int);
    method public abstract void setDisplayDisableHomeEnabled(boolean);
    method public abstract void setDisplayHomeAsUpEnabled(boolean);
    method public abstract void setDisplayOptions(int);
    method public abstract void setDisplayOptions(int, int);
@@ -2121,6 +2122,7 @@ package android.app {
    method public abstract void setTitle(java.lang.CharSequence);
    method public abstract void setTitle(int);
    method public abstract void show();
    field public static final int DISPLAY_DISABLE_HOME = 32; // 0x20
    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+27 −0
Original line number Diff line number Diff line
@@ -106,6 +106,18 @@ public abstract class ActionBar {
     */
    public static final int DISPLAY_SHOW_CUSTOM = 0x10;

    /**
     * Disable the 'home' element. This may be combined with
     * {@link #DISPLAY_SHOW_HOME} to create a non-focusable/non-clickable
     * 'home' element. Useful for a level of your app's navigation hierarchy
     * where clicking 'home' doesn't do anything.
     *
     * @see #setDisplayOptions(int)
     * @see #setDisplayOptions(int, int)
     * @see #setDisplayDisableHomeEnabled(boolean)
     */
    public static final int DISPLAY_DISABLE_HOME = 0x20;

    /**
     * Set the action bar into custom navigation mode, supplying a view
     * for custom navigation.
@@ -392,6 +404,21 @@ public abstract class ActionBar {
     */
    public abstract void setDisplayShowCustomEnabled(boolean showCustom);

    /**
     * Set whether the 'home' affordance on the action bar should be disabled.
     * If set, the 'home' element will not be focusable or clickable, useful if
     * the user is at the top level of the app's navigation hierarchy.
     *
     * <p>To set several display options at once, see the setDisplayOptions methods.
     *
     * @param disableHome true to disable the 'home' element.
     *
     * @see #setDisplayOptions(int)
     * @see #setDisplayOptions(int, int)
     * @see #DISPLAY_DISABLE_HOME
     */
    public abstract void setDisplayDisableHomeEnabled(boolean disableHome);

    /**
     * Set the ActionBar's background.
     * 
+27 −1
Original line number Diff line number Diff line
@@ -42,8 +42,10 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.DecelerateInterpolator;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.SpinnerAdapter;

@@ -71,6 +73,7 @@ public class ActionBarImpl extends ActionBar {
    private ActionBarContextView mUpperContextView;
    private LinearLayout mLowerContextView;
    private View mContentView;
    private ViewGroup mExternalTabView;

    private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>();

@@ -172,6 +175,18 @@ public class ActionBarImpl extends ActionBar {
        mActionView.setContextView(mUpperContextView);
        mContextDisplayMode = mLowerContextView == null ?
                CONTEXT_DISPLAY_NORMAL : CONTEXT_DISPLAY_SPLIT;

        if (!mActionView.hasEmbeddedTabs()) {
            HorizontalScrollView tabScroller = new HorizontalScrollView(mContext);
            ViewGroup tabContainer = mActionView.createTabContainer();
            tabScroller.setHorizontalFadingEdgeEnabled(true);
            tabScroller.addView(tabContainer);
            tabScroller.setVisibility(getNavigationMode() == NAVIGATION_MODE_TABS ?
                    View.VISIBLE : View.GONE);
            mActionView.setExternalTabLayout(tabContainer);
            mContainerView.setTabContainer(tabScroller);
            mExternalTabView = tabScroller;
        }
    }

    /**
@@ -238,6 +253,11 @@ public class ActionBarImpl extends ActionBar {
        setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM);
    }

    @Override
    public void setDisplayDisableHomeEnabled(boolean disableHome) {
        setDisplayOptions(disableHome ? DISPLAY_DISABLE_HOME : 0, DISPLAY_DISABLE_HOME);
    }

    @Override
    public void setTitle(int resId) {
        setTitle(mContext.getString(resId));
@@ -533,7 +553,7 @@ public class ActionBarImpl extends ActionBar {
        final int count = mContainerView.getChildCount();
        for (int i = 0; i < count; i++) {
            final View child = mContainerView.getChildAt(i);
            if (i == viewIndex) {
            if (i == viewIndex || child == mContainerView.getTabContainer()) {
                continue;
            }

@@ -840,11 +860,17 @@ public class ActionBarImpl extends ActionBar {
            case NAVIGATION_MODE_TABS:
                mSavedTabPosition = getSelectedNavigationIndex();
                selectTab(null);
                if (!mActionView.hasEmbeddedTabs()) {
                    mExternalTabView.setVisibility(View.GONE);
                }
                break;
        }
        mActionView.setNavigationMode(mode);
        switch (mode) {
            case NAVIGATION_MODE_TABS:
                if (!mActionView.hasEmbeddedTabs()) {
                    mExternalTabView.setVisibility(View.VISIBLE);
                }
                if (mSavedTabPosition != INVALID_POSITION) {
                    setSelectedNavigationItem(mSavedTabPosition);
                    mSavedTabPosition = INVALID_POSITION;
+40 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;

/**
@@ -29,6 +30,7 @@ import android.widget.FrameLayout;
 */
public class ActionBarContainer extends FrameLayout {
    private boolean mIsTransitioning;
    private View mTabContainer;

    public ActionBarContainer(Context context) {
        this(context, null);
@@ -65,6 +67,44 @@ public class ActionBarContainer extends FrameLayout {
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);

        // An action bar always eats touch events.
        return true;
    }

    public void setTabContainer(View tabView) {
        if (mTabContainer != null) {
            removeView(mTabContainer);
        }
        mTabContainer = tabView;
        addView(tabView);
    }

    public View getTabContainer() {
        return mTabContainer;
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (mTabContainer != null && mTabContainer.getVisibility() != GONE) {
            final int mode = MeasureSpec.getMode(heightMeasureSpec);
            if (mode == MeasureSpec.AT_MOST) {
                final int measuredHeight = getMeasuredHeight();
                final int maxHeight = MeasureSpec.getSize(heightMeasureSpec);
                setMeasuredDimension(getMeasuredWidth(),
                        Math.min(measuredHeight + mTabContainer.getMeasuredHeight(), maxHeight));
            }
        }
    }

    @Override
    public void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (mTabContainer != null && mTabContainer.getVisibility() != GONE) {
            final int containerHeight = getMeasuredHeight();
            mTabContainer.layout(l, containerHeight - mTabContainer.getMeasuredHeight(),
                    r, containerHeight);
        }
    }
}
+33 −5
Original line number Diff line number Diff line
@@ -97,7 +97,7 @@ public class ActionBarView extends ViewGroup {
    private Spinner mSpinner;
    private LinearLayout mListNavLayout;
    private HorizontalScrollView mTabScrollView;
    private LinearLayout mTabLayout;
    private ViewGroup mTabLayout;
    private View mCustomNavView;
    private ProgressBar mProgressView;
    private ProgressBar mIndeterminateProgressView;
@@ -112,6 +112,7 @@ public class ActionBarView extends ViewGroup {

    private boolean mShowMenu;
    private boolean mUserTitle;
    private boolean mIncludeTabs;

    private MenuBuilder mOptionsMenu;
    private ActionMenuView mMenuView;
@@ -201,6 +202,8 @@ public class ActionBarView extends ViewGroup {
        mProgressBarPadding = a.getDimensionPixelOffset(R.styleable.ActionBar_progressBarPadding, 0);
        mItemPadding = a.getDimensionPixelOffset(R.styleable.ActionBar_itemPadding, 0);

        mIncludeTabs = a.getBoolean(R.styleable.ActionBar_embeddedTabs, true);

        setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, DISPLAY_DEFAULT));

        final int customNavId = a.getResourceId(R.styleable.ActionBar_customNavigationLayout, 0);
@@ -242,6 +245,14 @@ public class ActionBarView extends ViewGroup {
        addView(mIndeterminateProgressView);
    }

    public boolean hasEmbeddedTabs() {
        return mIncludeTabs;
    }

    public void setExternalTabLayout(ViewGroup tabLayout) {
        mTabLayout = tabLayout;
    }

    @Override
    public ActionMode startActionModeForChild(View child, ActionMode.Callback callback) {
        // No starting an action mode for an action bar child! (Where would it go?)
@@ -389,6 +400,12 @@ public class ActionBarView extends ViewGroup {
    public void setDisplayOptions(int options) {
        final int flagsChanged = options ^ mDisplayOptions;
        mDisplayOptions = options;

        if ((flagsChanged & ActionBar.DISPLAY_DISABLE_HOME) != 0) {
            final boolean disableHome = (options & ActionBar.DISPLAY_DISABLE_HOME) != 0;
            mHomeLayout.setEnabled(!disableHome);
        }

        if ((flagsChanged & DISPLAY_RELAYOUT_MASK) != 0) {
            final int vis = (options & ActionBar.DISPLAY_SHOW_HOME) != 0 ? VISIBLE : GONE;
            mHomeLayout.setVisibility(vis);
@@ -477,7 +494,7 @@ public class ActionBarView extends ViewGroup {
                }
                break;
            case ActionBar.NAVIGATION_MODE_TABS:
                if (mTabLayout != null) {
                if (mTabScrollView != null) {
                    removeView(mTabScrollView);
                }
            }
@@ -502,7 +519,9 @@ public class ActionBarView extends ViewGroup {
                break;
            case ActionBar.NAVIGATION_MODE_TABS:
                ensureTabsExist();
                if (mTabScrollView != null) {
                    addView(mTabScrollView);
                }
                break;
            }
            mNavigationMode = mode;
@@ -511,15 +530,24 @@ public class ActionBarView extends ViewGroup {
    }
    
    private void ensureTabsExist() {
        if (!mIncludeTabs) return;

        if (mTabScrollView == null) {
            mTabScrollView = new HorizontalScrollView(getContext());
            mTabScrollView.setHorizontalFadingEdgeEnabled(true);
            mTabLayout = new LinearLayout(getContext(), null,
                    com.android.internal.R.attr.actionBarTabBarStyle);
            mTabLayout = createTabContainer();
            mTabScrollView.addView(mTabLayout);
        }
    }

    public ViewGroup createTabContainer() {
        ViewGroup result = new LinearLayout(getContext(), null,
                com.android.internal.R.attr.actionBarTabBarStyle);
        result.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                mContentHeight));
        return result;
    }

    public void setDropdownAdapter(SpinnerAdapter adapter) {
        mSpinnerAdapter = adapter;
        if (mSpinner != null) {
Loading