Allow determining # of rows/columns for All Apps and Customize at run time

DO NOT MERGE

Change-Id: I9ba0add8f2b2ffb324468768ad058c8426db6894
diff --git a/src/com/android/launcher2/AllAppsPagedView.java b/src/com/android/launcher2/AllAppsPagedView.java
index 87d255e..522f7d7 100644
--- a/src/com/android/launcher2/AllAppsPagedView.java
+++ b/src/com/android/launcher2/AllAppsPagedView.java
@@ -65,6 +65,8 @@
     private final LayoutInflater mInflater;
     private boolean mAllowHardwareLayerCreation;
 
+    private boolean mFirstMeasure = true;
+
     private int mPageContentWidth;
 
     public AllAppsPagedView(Context context) {
@@ -102,6 +104,31 @@
         mCenterPagesVertically = false;
     }
 
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+        if (mFirstMeasure) {
+            mFirstMeasure = false;
+
+            // TODO: actually calculate mCellCountX/mCellCountY as some function of
+            // widthSize and heightSize
+            //mCellCountX = ?;
+            //mCellCountY = ?;
+
+            // Since mCellCountX/mCellCountY changed, we need to update the pages
+            invalidatePageData();
+
+            // Create a dummy page and set it up to find out the content width (used by our parent)
+            PagedViewCellLayout layout = new PagedViewCellLayout(getContext());
+            setupPage(layout);
+            mPageContentWidth = layout.getContentWidth();
+        }
+    }
+
     void allowHardwareLayerCreation() {
         // This is called after the first time we launch into All Apps. Before that point,
         // there's no need for hardware layers here since there's a hardware layer set on the
@@ -459,6 +486,11 @@
 
     @Override
     public void syncPages() {
+        if (mFirstMeasure) {
+            // We don't know our size yet, which means we haven't calculated cell count x/y;
+            // onMeasure will call us once we figure out our size
+            return;
+        }
         // ensure that we have the right number of pages (min of 1, since we have placeholders)
         int numPages = Math.max(1,
                 (int) Math.ceil((float) mFilteredApps.size() / (mCellCountX * mCellCountY)));
diff --git a/src/com/android/launcher2/AllAppsTabbed.java b/src/com/android/launcher2/AllAppsTabbed.java
index ee7bfc0..e11113f 100644
--- a/src/com/android/launcher2/AllAppsTabbed.java
+++ b/src/com/android/launcher2/AllAppsTabbed.java
@@ -117,16 +117,6 @@
             }
         });
 
-        // Set the width of the tab bar properly
-        int pageWidth = mAllApps.getPageContentWidth();
-        View allAppsTabBar = (View) findViewById(R.id.all_apps_tab_bar);
-        if (allAppsTabBar == null) throw new Resources.NotFoundException();
-        int tabWidgetPadding = 0;
-        final int childCount = tabWidget.getChildCount();
-        if (childCount > 0) {
-            tabWidgetPadding += tabWidget.getChildAt(0).getPaddingLeft() * 2;
-        }
-        allAppsTabBar.getLayoutParams().width = pageWidth + tabWidgetPadding;
 
         // It needs to be INVISIBLE so that it will be measured in the layout.
         // Otherwise the animations is messed up when we show it for the first time.
@@ -171,7 +161,20 @@
 
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        mFirstLayout = false;
+        if (mFirstLayout) {
+            mFirstLayout = false;
+            // Set the width of the tab bar properly
+            int pageWidth = mAllApps.getPageContentWidth();
+            TabWidget tabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);
+            View allAppsTabBar = (View) findViewById(R.id.all_apps_tab_bar);
+            if (allAppsTabBar == null) throw new Resources.NotFoundException();
+            int tabWidgetPadding = 0;
+            final int childCount = tabWidget.getChildCount();
+            if (childCount > 0) {
+                tabWidgetPadding += tabWidget.getChildAt(0).getPaddingLeft() * 2;
+            }
+            allAppsTabBar.getLayoutParams().width = pageWidth + tabWidgetPadding;
+        }
         super.onLayout(changed, l, t, r, b);
     }
 
diff --git a/src/com/android/launcher2/CustomizePagedView.java b/src/com/android/launcher2/CustomizePagedView.java
index 92b73a0..cf1aa6b 100644
--- a/src/com/android/launcher2/CustomizePagedView.java
+++ b/src/com/android/launcher2/CustomizePagedView.java
@@ -54,6 +54,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.View.MeasureSpec;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.LinearInterpolator;
 import android.widget.Checkable;
@@ -124,6 +125,8 @@
     private final Canvas mCanvas = new Canvas();
     private final LayoutInflater mInflater;
 
+    private boolean mFirstMeasure = true;
+
     private final float mTmpFloatPos[] = new float[2];
     private final float ANIMATION_SCALE = 0.5f;
 
@@ -190,6 +193,31 @@
         mCenterPagesVertically = false;
     }
 
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+        if (mFirstMeasure) {
+            mFirstMeasure = false;
+
+            // TODO: actually calculate mCellCountX/mCellCountY as some function of
+            // widthSize and heightSize
+            //mCellCountX = ?
+            //mCellCountY = ?
+
+            // Since mCellCountX/mCellCountY changed, we need to update the pages
+            invalidatePageData();
+
+            // Create a dummy page and set it up to find out the content width (used by our parent)
+            PagedViewCellLayout layout = new PagedViewCellLayout(getContext());
+            setupPage(layout);
+            mPageContentWidth = layout.getContentWidth();
+        }
+    }
+
     public void setLauncher(Launcher launcher) {
         Context context = getContext();
         mLauncher = launcher;
@@ -1095,6 +1123,11 @@
 
     @Override
     public void syncPages() {
+        if (mFirstMeasure) {
+            // We don't know our size yet, which means we haven't calculated cell count x/y;
+            // onMeasure will call us once we figure out our size
+            return;
+        }
         boolean enforceMinimumPagedWidths = false;
         boolean centerPagedViewCellLayouts = false;
         switch (mCustomizationType) {
diff --git a/src/com/android/launcher2/CustomizeTrayTabHost.java b/src/com/android/launcher2/CustomizeTrayTabHost.java
index 3e04025..765c41d 100644
--- a/src/com/android/launcher2/CustomizeTrayTabHost.java
+++ b/src/com/android/launcher2/CustomizeTrayTabHost.java
@@ -110,17 +110,6 @@
                 }
             }
         });
-
-        // Set the width of the tab bar properly
-        int pageWidth = customizePagedView.getPageContentWidth();
-        TabWidget customizeTabBar = (TabWidget) findViewById(com.android.internal.R.id.tabs);
-        if (customizeTabBar == null) throw new Resources.NotFoundException();
-        int tabWidgetPadding = 0;
-        final int childCount = tabWidget.getChildCount();
-        if (childCount > 0) {
-            tabWidgetPadding += tabWidget.getChildAt(0).getPaddingLeft() * 2;
-        }
-        customizeTabBar.getLayoutParams().width = pageWidth + tabWidgetPadding;
     }
 
     @Override
@@ -145,7 +134,23 @@
 
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        mFirstLayout = false;
+        if (mFirstLayout) {
+            mFirstLayout = false;
+
+            final CustomizePagedView customizePagedView =
+                (CustomizePagedView) findViewById(R.id.customization_drawer_tab_contents);
+            TabWidget tabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);
+            // Set the width of the tab bar properly
+            int pageWidth = customizePagedView.getPageContentWidth();
+            TabWidget customizeTabBar = (TabWidget) findViewById(com.android.internal.R.id.tabs);
+            if (customizeTabBar == null) throw new Resources.NotFoundException();
+            int tabWidgetPadding = 0;
+            final int childCount = tabWidget.getChildCount();
+            if (childCount > 0) {
+                tabWidgetPadding += tabWidget.getChildAt(0).getPaddingLeft() * 2;
+            }
+            customizeTabBar.getLayoutParams().width = pageWidth + tabWidgetPadding;
+        }
         super.onLayout(changed, l, t, r, b);
     }