Adding hint for launcher to pre-create custom workspace screen.

Change-Id: I150fb8b6ff13053bf4b0b49f2b510630ed50714a
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 321c4e7..e84c708 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -444,6 +444,11 @@
         sPausedFromUserAction = true;
     }
 
+    /** To be overriden by subclasses to hint to Launcher that we have custom content */
+    protected boolean hasCustomContentToLeft() {
+        return false;
+    }
+
     private void updateGlobalIcons() {
         boolean searchVisible = false;
         boolean voiceVisible = false;
@@ -868,13 +873,13 @@
     }
 
     // Add a fullscreen unpadded view to the workspace to the left all other screens.
-    public QSBScroller addCustomContentToLeft(View customContent) {
-        return addCustomContentToLeft(customContent, null);
+    public QSBScroller addToCustomContentPage(View customContent) {
+        return addToCustomContentPage(customContent, null);
     }
 
-    public QSBScroller addCustomContentToLeft(View customContent,
+    public QSBScroller addToCustomContentPage(View customContent,
             CustomContentCallbacks callbacks) {
-        mWorkspace.addCustomContentToLeft(customContent, callbacks);
+        mWorkspace.addToCustomContentPage(customContent, callbacks);
         return mQsbScroller;
     }
 
@@ -3718,6 +3723,11 @@
             mSavedState = null;
         }
 
+        // Create the custom content page here before onLayout to prevent flashing
+        if (!mWorkspace.hasCustomContent() && hasCustomContentToLeft()) {
+            mWorkspace.createCustomContentPage();
+        }
+
         mWorkspace.restoreInstanceStateForRemainingPages();
 
         // If we received the result of any pending adds while the loader was running (e.g. the
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 91f5396..1727c72 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -528,19 +528,10 @@
         return screenId;
     }
 
-    public void addCustomContentToLeft(View customContent, CustomContentCallbacks callbacks) {
+    public void createCustomContentPage() {
         CellLayout customScreen = (CellLayout)
                 mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null);
 
-        int spanX = customScreen.getCountX();
-        int spanY = customScreen.getCountY();
-
-        CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, spanX, spanY);
-        lp.canReorder  = false;
-        lp.isFullscreen = true;
-
-        customScreen.addViewToCellLayout(customContent, 0, 0, lp, true);
-
         Rect p = new Rect();
         AppWidgetHostView.getDefaultPaddingForWidget(mLauncher, mLauncher.getComponentName(), p);
 
@@ -549,13 +540,28 @@
 
         addFullScreenPage(customScreen);
 
-        mCustomContentCallbacks = callbacks;
-
         // Ensure that the current page and default page are maintained.
         mDefaultPage++;
         setCurrentPage(getCurrentPage() + 1);
     }
 
+    public void addToCustomContentPage(View customContent, CustomContentCallbacks callbacks) {
+        if (getPageIndexForScreenId(CUSTOM_CONTENT_SCREEN_ID) < 0) {
+            throw new RuntimeException("Expected custom content screen to exist");
+        }
+
+        // Add the custom content to the full screen custom page
+        CellLayout customScreen = getScreenWithId(CUSTOM_CONTENT_SCREEN_ID);
+        int spanX = customScreen.getCountX();
+        int spanY = customScreen.getCountY();
+        CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, spanX, spanY);
+        lp.canReorder  = false;
+        lp.isFullscreen = true;
+        customScreen.addViewToCellLayout(customContent, 0, 0, lp, true);
+
+        mCustomContentCallbacks = callbacks;
+    }
+
     public long commitExtraEmptyScreen() {
         CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID);
         mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID);
@@ -1293,7 +1299,7 @@
         }
     }
 
-    private boolean hasCustomContent() {
+    public boolean hasCustomContent() {
         return (mScreenOrder.size() > 0 && mScreenOrder.get(0) == CUSTOM_CONTENT_SCREEN_ID);
     }