Action bar tab layout tweaks.

Let tabs consume the full action bar when the menu is empty and other
elements are disabled when the tab bar would normally split onto a
second row..

Fix bug 4489724 - bug in ActionBarImpl#cleanupTabs.

Change-Id: I28a235d339137add0b106c6e733a6767fa547810
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index 183cfbd..6cfeb87 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -176,6 +176,8 @@
             }
             mActionView.setEmbeddedTabView(mTabScrollView);
         }
+        mActionView.setCollapsable(!mHasEmbeddedTabs &&
+                getNavigationMode() == NAVIGATION_MODE_TABS);
 
         TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar);
         mContentHeight = a.getLayoutDimension(R.styleable.ActionBar_height, 0);
@@ -307,7 +309,9 @@
             selectTab(null);
         }
         mTabs.clear();
-        mTabScrollView.removeAllTabs();
+        if (mTabScrollView != null) {
+            mTabScrollView.removeAllTabs();
+        }
         mSavedTabPosition = INVALID_POSITION;
     }
 
@@ -887,6 +891,7 @@
                 }
                 break;
         }
+        mActionView.setCollapsable(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs);
     }
 
     @Override
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index f1618e1..1726390 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -96,13 +96,26 @@
     @Override
     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        int nonTabHeight = 0;
+        final int count = getChildCount();
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+            if (child == mTabContainer) {
+                continue;
+            }
+
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            nonTabHeight = Math.max(nonTabHeight,
+                    child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
+        }
+
         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));
+                        Math.min(nonTabHeight + mTabContainer.getMeasuredHeight(), maxHeight));
             }
         }
     }
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index ff04735..ef8481f 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -111,6 +111,7 @@
     private boolean mSplitActionBar;
     private boolean mUserTitle;
     private boolean mIncludeTabs;
+    private boolean mIsCollapsable;
 
     private MenuBuilder mOptionsMenu;
     
@@ -629,8 +630,30 @@
         mContextView = view;
     }
 
+    public void setCollapsable(boolean collapsable) {
+        mIsCollapsable = collapsable;
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        final int childCount = getChildCount();
+        if (mIsCollapsable) {
+            int visibleChildren = 0;
+            for (int i = 0; i < childCount; i++) {
+                final View child = getChildAt(i);
+                if (child.getVisibility() != GONE &&
+                        !(child == mMenuView && mMenuView.getChildCount() == 0)) {
+                    visibleChildren++;
+                }
+            }
+
+            if (visibleChildren == 0) {
+                // No size for an empty action bar when collapsable.
+                setMeasuredDimension(0, 0);
+                return;
+            }
+        }
+
         int widthMode = MeasureSpec.getMode(widthMeasureSpec);
         if (widthMode != MeasureSpec.EXACTLY) {
             throw new IllegalStateException(getClass().getSimpleName() + " can only be used " +
@@ -761,8 +784,7 @@
 
         if (mContentHeight <= 0) {
             int measuredHeight = 0;
-            final int count = getChildCount();
-            for (int i = 0; i < count; i++) {
+            for (int i = 0; i < childCount; i++) {
                 View v = getChildAt(i);
                 int paddedViewHeight = v.getMeasuredHeight() + verticalPadding;
                 if (paddedViewHeight > measuredHeight) {
@@ -791,6 +813,11 @@
         final int y = getPaddingTop();
         final int contentHeight = b - t - getPaddingTop() - getPaddingBottom();
 
+        if (contentHeight <= 0) {
+            // Nothing to do if we can't see anything.
+            return;
+        }
+
         if (mHomeLayout.getVisibility() != GONE) {
             x += positionChild(mHomeLayout, x, y, contentHeight);
         }