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

Commit dae7824c authored by Adam Powell's avatar Adam Powell
Browse files

Action bar work for phones

Drop tabs to a second row at < w480dp

Make 9-patches for the cab's "done" button thinner

Add a "disable home" display option to the action bar to turn off
focus and touch feedback when tapping home would do nothing

Change-Id: Ib2eedf311655f02055357321e2e9ad5b9037fed1
parent a13802d8
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