Tweaking page indicators to support add page icon, remembering widget picker page (Bug 10787439)

Change-Id: Iab0b5676aa9c34a610b4b968940abc81c913c234
diff --git a/src/com/android/launcher3/AppsCustomizePagedView.java b/src/com/android/launcher3/AppsCustomizePagedView.java
index ee33f3a..a36f444 100644
--- a/src/com/android/launcher3/AppsCustomizePagedView.java
+++ b/src/com/android/launcher3/AppsCustomizePagedView.java
@@ -941,8 +941,12 @@
     }
 
     public void setContentType(ContentType type) {
+        int page = getCurrentPage();
+        if (mContentType != type) {
+            page = 0;
+        }
         mContentType = type;
-        invalidatePageData(0, true);
+        invalidatePageData(page, true);
     }
 
     public ContentType getContentType() {
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 9777ea9..ad7d238 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1451,7 +1451,6 @@
                 // Reset AllApps to its initial state only if we are not in the middle of
                 // processing a multi-step drop
                 if (mAppsCustomizeTabHost != null && mPendingAddInfo.container == ItemInfo.NO_ID) {
-                    mAppsCustomizeTabHost.reset();
                     showWorkspaceAndExitOverviewMode(false);
                 }
             } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
@@ -1670,8 +1669,8 @@
                         imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                     }
 
-                    // Reset AllApps to its initial state
-                    if (!alreadyOnHome && mAppsCustomizeTabHost != null) {
+                    // Reset the apps customize page
+                    if (mAppsCustomizeTabHost != null) {
                         mAppsCustomizeTabHost.reset();
                     }
                 }
diff --git a/src/com/android/launcher3/PageIndicator.java b/src/com/android/launcher3/PageIndicator.java
index a9016d5..52c8447 100644
--- a/src/com/android/launcher3/PageIndicator.java
+++ b/src/com/android/launcher3/PageIndicator.java
@@ -49,6 +49,20 @@
             new ArrayList<PageIndicatorMarker>();
     private int mActiveMarkerIndex;
 
+    public static class PageMarkerResources {
+        int activeId;
+        int inactiveId;
+
+        public PageMarkerResources() {
+            activeId = R.drawable.ic_pageindicator_current;
+            inactiveId = R.drawable.ic_pageindicator_default;
+        }
+        public PageMarkerResources(int aId, int iaId) {
+            activeId = aId;
+            inactiveId = iaId;
+        }
+    }
+
     public PageIndicator(Context context) {
         this(context, null);
     }
@@ -155,17 +169,20 @@
         mWindowRange[1] = windowEnd;
     }
 
-    void addMarker(int index, int layoutId, boolean allowAnimations) {
+    void addMarker(int index, PageMarkerResources marker, boolean allowAnimations) {
         index = Math.max(0, Math.min(index, mMarkers.size()));
 
-        PageIndicatorMarker marker =
-            (PageIndicatorMarker) mLayoutInflater.inflate(layoutId, this, false);
-        mMarkers.add(index, marker);
+        PageIndicatorMarker m =
+            (PageIndicatorMarker) mLayoutInflater.inflate(R.layout.page_indicator_marker,
+                    this, false);
+        m.setMarkerDrawables(marker.activeId, marker.inactiveId);
+
+        mMarkers.add(index, m);
         offsetWindowCenterTo(mActiveMarkerIndex, allowAnimations);
     }
-    void addMarkers(ArrayList<Integer> layoutIds, boolean allowAnimations) {
-        for (int i = 0; i < layoutIds.size(); ++i) {
-            addMarker(Integer.MAX_VALUE, layoutIds.get(i), allowAnimations);
+    void addMarkers(ArrayList<PageMarkerResources> markers, boolean allowAnimations) {
+        for (int i = 0; i < markers.size(); ++i) {
+            addMarker(Integer.MAX_VALUE, markers.get(i), allowAnimations);
         }
     }
 
diff --git a/src/com/android/launcher3/PageIndicatorMarker.java b/src/com/android/launcher3/PageIndicatorMarker.java
index 1ad0abb..b1025d6 100644
--- a/src/com/android/launcher3/PageIndicatorMarker.java
+++ b/src/com/android/launcher3/PageIndicatorMarker.java
@@ -19,10 +19,12 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.LayoutTransition;
 import android.content.Context;
+import android.content.res.Resources;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ImageView;
 import android.widget.FrameLayout;
 import com.android.launcher3.R;
 
@@ -32,8 +34,8 @@
 
     private static final int MARKER_FADE_DURATION = 175;
 
-    private View mActiveMarker;
-    private View mInactiveMarker;
+    private ImageView mActiveMarker;
+    private ImageView mInactiveMarker;
     private boolean mIsActive = false;
 
     public PageIndicatorMarker(Context context) {
@@ -49,8 +51,14 @@
     }
 
     protected void onFinishInflate() {
-        mActiveMarker = findViewById(R.id.active);
-        mInactiveMarker = findViewById(R.id.inactive);
+        mActiveMarker = (ImageView) findViewById(R.id.active);
+        mInactiveMarker = (ImageView) findViewById(R.id.inactive);
+    }
+
+    void setMarkerDrawables(int activeResId, int inactiveResId) {
+        Resources r = getResources();
+        mActiveMarker.setImageDrawable(r.getDrawable(activeResId));
+        mInactiveMarker.setImageDrawable(r.getDrawable(inactiveResId));
     }
 
     void activate(boolean immediate) {
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index d8fc983..763dfa1 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -337,7 +337,8 @@
             mPageIndicator = (PageIndicator) parent.findViewById(mPageIndicatorViewId);
             mPageIndicator.removeAllMarkers(mAllowPagedViewAnimations);
 
-            ArrayList<Integer> markers = new ArrayList<Integer>();
+            ArrayList<PageIndicator.PageMarkerResources> markers =
+                    new ArrayList<PageIndicator.PageMarkerResources>();
             for (int i = 0; i < getChildCount(); ++i) {
                 markers.add(getPageIndicatorMarker(i));
             }
@@ -424,8 +425,8 @@
     PageIndicator getPageIndicator() {
         return mPageIndicator;
     }
-    protected int getPageIndicatorMarker(int pageIndex) {
-        return R.layout.page_indicator_marker;
+    protected PageIndicator.PageMarkerResources getPageIndicatorMarker(int pageIndex) {
+        return new PageIndicator.PageMarkerResources();
     }
 
     public void setPageSwitchListener(PageSwitchListener pageSwitchListener) {
@@ -969,7 +970,8 @@
         // add/remove pages
         if (mPageIndicator != null && !isReordering(false)) {
             int pageIndex = indexOfChild(child);
-            mPageIndicator.addMarker(pageIndex, getPageIndicatorMarker(pageIndex),
+            mPageIndicator.addMarker(pageIndex,
+                    getPageIndicatorMarker(pageIndex),
                     mAllowPagedViewAnimations);
         }
 
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index c0b2ae3..2f58571 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -4221,10 +4221,16 @@
     }
 
     @Override
-    protected int getPageIndicatorMarker(int pageIndex) {
-        if (getScreenIdForPageIndex(pageIndex) == CUSTOM_CONTENT_SCREEN_ID) {
-            return R.layout.custom_content_page_indicator_marker;
+    protected PageIndicator.PageMarkerResources getPageIndicatorMarker(int pageIndex) {
+        long screenId = getScreenIdForPageIndex(pageIndex);
+        if (screenId == EXTRA_EMPTY_SCREEN_ID) {
+            int count = mScreenOrder.size() - (hasCustomContent() ? 1 : 0);
+            if (count > 1) {
+                return new PageIndicator.PageMarkerResources(R.drawable.ic_pageindicator_add,
+                        R.drawable.ic_pageindicator_add);
+            }
         }
+
         return super.getPageIndicatorMarker(pageIndex);
     }