Refine the behavior of split action bars.

Change-Id: I27212c7554025433ee366f0766971f0092b26d67
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index dda3be6..c3b1098 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -368,7 +368,7 @@
             mode.invalidate();
             mContextView.initForMode(mode);
             animateToMode(true);
-            if (mSplitView != null) {
+            if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
                 // TODO animate this
                 mSplitView.setVisibility(View.VISIBLE);
             }
@@ -526,7 +526,7 @@
                 mContainerView.setTranslationY(-mContainerView.getHeight());
                 b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0));
             }
-            if (mSplitView != null) {
+            if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
                 mSplitView.setAlpha(0);
                 b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 1));
             }
@@ -560,7 +560,7 @@
                 b.with(ObjectAnimator.ofFloat(mContainerView, "translationY",
                         -mContainerView.getHeight()));
             }
-            if (mSplitView != null) {
+            if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) {
                 mSplitView.setAlpha(1);
                 b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 0));
             }
diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
index 91dd7e36..98c2747 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
@@ -39,10 +39,13 @@
 
     private View mOverflowButton;
     private boolean mReserveOverflow;
+    private boolean mReserveOverflowSet;
     private int mWidthLimit;
     private int mActionItemWidthLimit;
     private int mMaxItems;
+    private boolean mMaxItemsSet;
     private boolean mStrictWidthLimit;
+    private boolean mWidthLimitSet;
 
     // Group IDs that have been added as actions - used temporarily, allocated here for reuse.
     private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray();
@@ -64,14 +67,21 @@
         super.initForMenu(context, menu);
 
         final Resources res = context.getResources();
-        final int screen = res.getConfiguration().screenLayout;
-        // TODO Use the no-buttons specifier instead here
-        mReserveOverflow = (screen & Configuration.SCREENLAYOUT_SIZE_MASK) ==
-                Configuration.SCREENLAYOUT_SIZE_XLARGE;
-        mWidthLimit = res.getDisplayMetrics().widthPixels / 2;
+
+        if (!mReserveOverflowSet) {
+            // TODO Use the no-buttons specifier instead here
+            mReserveOverflow = res.getConfiguration()
+                    .isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);
+        }
+
+        if (!mWidthLimitSet) {
+            mWidthLimit = res.getDisplayMetrics().widthPixels / 2;
+        }
 
         // Measure for initial configuration
-        mMaxItems = res.getInteger(com.android.internal.R.integer.max_action_buttons);
+        if (!mMaxItemsSet) {
+            mMaxItems = res.getInteger(com.android.internal.R.integer.max_action_buttons);
+        }
 
         int width = mWidthLimit;
         if (mReserveOverflow) {
@@ -92,15 +102,19 @@
     }
 
     public void setWidthLimit(int width, boolean strict) {
-        if (mReserveOverflow) {
-            width -= mOverflowButton.getMeasuredWidth();
-        }
-        mActionItemWidthLimit = width;
+        mWidthLimit = width;
         mStrictWidthLimit = strict;
+        mWidthLimitSet = true;
+    }
+
+    public void setReserveOverflow(boolean reserveOverflow) {
+        mReserveOverflow = reserveOverflow;
+        mReserveOverflowSet = true;
     }
 
     public void setItemLimit(int itemCount) {
         mMaxItems = itemCount;
+        mMaxItemsSet = true;
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index e4c4989..fc43994 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -168,14 +168,14 @@
 
         final MenuBuilder menu = (MenuBuilder) mode.getMenu();
         mActionMenuPresenter = new ActionMenuPresenter();
-        menu.addMenuPresenter(mActionMenuPresenter);
-        mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+        mActionMenuPresenter.setReserveOverflow(true);
 
         final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                 LayoutParams.MATCH_PARENT);
-        mMenuView.setLayoutParams(layoutParams);
         if (mSplitView == null) {
-            addView(mMenuView);
+            menu.addMenuPresenter(mActionMenuPresenter);
+            mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+            addView(mMenuView, layoutParams);
         } else {
             // Allow full screen width in split mode.
             mActionMenuPresenter.setWidthLimit(
@@ -184,7 +184,10 @@
             mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
             // Span the whole width
             layoutParams.width = LayoutParams.MATCH_PARENT;
-            mSplitView.addView(mMenuView);
+            layoutParams.height = mContentHeight;
+            menu.addMenuPresenter(mActionMenuPresenter);
+            mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+            mSplitView.addView(mMenuView, layoutParams);
         }
 
         mAnimateInOnLayout = true;
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index eb97ea8..55849e5 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -327,15 +327,15 @@
             mActionMenuPresenter.setCallback(cb);
             mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter();
         }
-        builder.addMenuPresenter(mActionMenuPresenter);
-        builder.addMenuPresenter(mExpandedMenuPresenter);
 
-        final ActionMenuView menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+        ActionMenuView menuView;
         final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                 LayoutParams.MATCH_PARENT);
-        menuView.setLayoutParams(layoutParams);
         if (!mSplitActionBar) {
-            addView(menuView);
+            builder.addMenuPresenter(mActionMenuPresenter);
+            builder.addMenuPresenter(mExpandedMenuPresenter);
+            menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+            addView(menuView, layoutParams);
         } else {
             // Allow full screen width in split mode.
             mActionMenuPresenter.setWidthLimit(
@@ -344,9 +344,15 @@
             mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
             // Span the whole width
             layoutParams.width = LayoutParams.MATCH_PARENT;
+            builder.addMenuPresenter(mActionMenuPresenter);
+            builder.addMenuPresenter(mExpandedMenuPresenter);
+            menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
             if (mSplitView != null) {
-                mSplitView.addView(menuView);
-            } // We'll add this later if we missed it this time.
+                mSplitView.addView(menuView, layoutParams);
+            } else {
+                // We'll add this later if we missed it this time.
+                menuView.setLayoutParams(layoutParams);
+            }
         }
         mMenuView = menuView;
     }