Tweaking folder cling to support large folders.

Change-Id: I3c500463fba8db71807ad4fc27c6923f3e1d0770
diff --git a/res/layout-land/folder_cling.xml b/res/layout-land/folder_cling.xml
index 171e395..1f4a115 100644
--- a/res/layout-land/folder_cling.xml
+++ b/res/layout-land/folder_cling.xml
@@ -20,39 +20,29 @@
     <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_marginStart="10dp"
-        android:layout_marginEnd="10dp"
-        android:layout_marginTop="40dp"
-        android:layout_marginBottom="20dp">
+        android:layout_marginStart="15dp"
+        android:layout_marginEnd="15dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp">
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:orientation="vertical">
-            <LinearLayout
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:paddingTop="20dp"
+            android:paddingBottom="20dp"
+            android:orientation="vertical"
+            android:background="@drawable/cling">
+            <TextView
+                style="@style/ClingTitleText"
+                android:id="@+id/folder_cling_title"
+                android:text="@string/folder_cling_title" />
+            <TextView
+                style="@style/ClingText"
+                android:id="@+id/folder_cling_create_folder"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingLeft="20dp"
-                android:paddingRight="20dp"
-                android:paddingTop="20dp"
-                android:paddingBottom="20dp"
-                android:orientation="vertical"
-                android:background="@drawable/cling">
-                <TextView
-                    style="@style/ClingTitleText"
-                    android:id="@+id/folder_cling_title"
-                    android:text="@string/folder_cling_title" />
-                <TextView
-                    style="@style/ClingText"
-                    android:id="@+id/folder_cling_create_folder"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/folder_cling_create_folder" />
-            </LinearLayout>
-            <ImageView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_horizontal"
-                android:src="@drawable/cling_arrow_down" />
+                android:text="@string/folder_cling_create_folder" />
         </LinearLayout>
     </FrameLayout>
     <Button
diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml
index 2b9a9f3..86fc1ed 100644
--- a/res/layout-land/launcher.xml
+++ b/res/layout-land/launcher.xml
@@ -57,6 +57,11 @@
         <!-- The Workspace cling must appear under the AppsCustomizePagedView below to ensure
              that it is still visible during the transition to AllApps and doesn't overlay on
              top of that view. -->
+        <FrameLayout
+            android:id="@+id/cling_scrim"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone" />
         <include layout="@layout/first_run_cling"
             android:id="@+id/first_run_cling"
             android:layout_width="match_parent"
diff --git a/res/layout-port/folder_cling.xml b/res/layout-port/folder_cling.xml
index bd4b5e2..1f4a115 100644
--- a/res/layout-port/folder_cling.xml
+++ b/res/layout-port/folder_cling.xml
@@ -20,39 +20,29 @@
     <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_marginStart="20dp"
-        android:layout_marginEnd="20dp"
+        android:layout_marginStart="15dp"
+        android:layout_marginEnd="15dp"
         android:layout_marginTop="10dp"
         android:layout_marginBottom="10dp">
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:orientation="vertical">
-            <LinearLayout
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:paddingTop="20dp"
+            android:paddingBottom="20dp"
+            android:orientation="vertical"
+            android:background="@drawable/cling">
+            <TextView
+                style="@style/ClingTitleText"
+                android:id="@+id/folder_cling_title"
+                android:text="@string/folder_cling_title" />
+            <TextView
+                style="@style/ClingText"
+                android:id="@+id/folder_cling_create_folder"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingLeft="20dp"
-                android:paddingRight="20dp"
-                android:paddingTop="20dp"
-                android:paddingBottom="20dp"
-                android:orientation="vertical"
-                android:background="@drawable/cling">
-                <TextView
-                    style="@style/ClingTitleText"
-                    android:id="@+id/folder_cling_title"
-                    android:text="@string/folder_cling_title" />
-                <TextView
-                    style="@style/ClingText"
-                    android:id="@+id/folder_cling_create_folder"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="@string/folder_cling_create_folder" />
-            </LinearLayout>
-            <ImageView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_horizontal"
-                android:src="@drawable/cling_arrow_down" />
+                android:text="@string/folder_cling_create_folder" />
         </LinearLayout>
     </FrameLayout>
     <Button
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index faef7a5..ef2f3ac 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -64,6 +64,11 @@
         <!-- The Workspace cling must appear under the AppsCustomizePagedView below to ensure
              that it is still visible during the transition to AllApps and doesn't overlay on
              top of that view. -->
+        <FrameLayout
+            android:id="@+id/cling_scrim"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone" />
         <include layout="@layout/first_run_cling"
             android:id="@+id/first_run_cling"
             android:layout_width="match_parent"
@@ -74,7 +79,6 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:visibility="gone" />
-
         <include layout="@layout/folder_cling"
             android:id="@+id/folder_cling"
             android:layout_width="match_parent"
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 43a856d..e4278d9 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -36,5 +36,5 @@
     <color name="folder_items_text_color">#FF333333</color>
     <color name="outline_color">#FFFFFFFF</color>
     
-    <color name="first_run_cling_circle_background_color">#FF83AEE8</color>
+    <color name="first_run_cling_circle_background_color">#FF8BB4E9</color>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6c05f7d..ac372fd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -228,7 +228,7 @@
     <!-- The title text for the workspace cling [CHAR_LIMIT=none] -->
     <string name="first_run_cling_title">Welcome!</string>
     <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
-    <string name="first_run_cling_description">Make yourself at Home</string>
+    <string name="first_run_cling_description">Make yourself at Home.</string>
     <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
     <string name="first_run_cling_custom_content_hint"></string>
     <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
@@ -238,15 +238,15 @@
     <!-- The title text for the workspace cling [CHAR_LIMIT=none] -->
     <string name="workspace_cling_title">Organize your space</string>
     <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
-    <string name="workspace_cling_move_item">Touch &amp; hold background to manage wallpaper, widgets and settings</string>
+    <string name="workspace_cling_move_item">Touch &amp; hold background to manage wallpaper, widgets and settings.</string>
     <!-- The title text for the All Apps cling [CHAR_LIMIT=none] -->
     <string name="all_apps_cling_title">Choose some apps</string>
     <!-- The description of how to pick up and add an item to the workspace [CHAR_LIMIT=none] -->
     <string name="all_apps_cling_add_item">To add an app to your Home screen, touch &amp; hold it.</string>
     <!-- The title text for the Folder cling [CHAR_LIMIT=none] -->
-    <string name="folder_cling_title">Create new folders for your apps</string>
+    <string name="folder_cling_title">Here\'s a folder</string>
     <!-- The description of how to create a folder [CHAR_LIMIT=none] -->
-    <string name="folder_cling_create_folder">Touch &amp; hold an app, then move it on top of another app icon</string>
+    <string name="folder_cling_create_folder">To create one like this, touch &amp; hold an app, then move it over another.</string>
     <!-- The text on the button to dismiss a cling [CHAR_LIMIT=none] -->
     <string name="cling_dismiss">OK</string>
     <!-- Error message on dummy custom cling layout [DO NOT TRANSLATE] -->
diff --git a/src/com/android/launcher3/Cling.java b/src/com/android/launcher3/Cling.java
index 7ca6990..2656ad6 100644
--- a/src/com/android/launcher3/Cling.java
+++ b/src/com/android/launcher3/Cling.java
@@ -70,6 +70,9 @@
     private Paint mBubblePaint;
     private Paint mDotPaint;
 
+    private View mScrimView;
+    private int mBackgroundColor;
+
     private final Rect mInsets = new Rect();
 
     public Cling(Context context) {
@@ -91,9 +94,11 @@
 
     }
 
-    void init(Launcher l, int[] positionData) {
+    void init(Launcher l, View scrim) {
         if (!mIsInitialized) {
             mLauncher = l;
+            mScrimView = scrim;
+            mBackgroundColor = 0xdd000000;
             setOnLongClickListener(this);
 
             mErasePaint = new Paint();
@@ -128,10 +133,7 @@
             content.animate()
                     .alpha(1f)
                     .setDuration(duration)
-                    .setListener(new AnimatorListenerAdapter() {
-                        public void onAnimationEnd(Animator animation) {
-                        };
-                    })
+                    .setListener(null)
                     .start();
             setAlpha(1f);
         } else {
@@ -142,11 +144,24 @@
                     .alpha(1f)
                     .setInterpolator(new AccelerateInterpolator())
                     .setDuration(duration)
+                    .setListener(null)
                     .start();
             } else {
                 setAlpha(1f);
             }
         }
+
+        // Show the scrim if necessary
+        if (mScrimView != null) {
+            mScrimView.setVisibility(View.VISIBLE);
+            mScrimView.setAlpha(0f);
+            mScrimView.animate()
+                    .alpha(1f)
+                    .setDuration(duration)
+                    .setListener(null)
+                    .start();
+        }
+
         setFocusableInTouchMode(true);
         post(new Runnable() {
             public void run() {
@@ -160,26 +175,42 @@
         if (mDrawIdentifier.equals(FIRST_RUN_PORTRAIT) ||
                 mDrawIdentifier.equals(FIRST_RUN_LANDSCAPE)) {
             View content = getContent();
-            ObjectAnimator anim = LauncherAnimUtils.ofFloat(content, "alpha", 0f);
-            anim.setDuration(duration);
-            anim.addListener(new AnimatorListenerAdapter() {
-                public void onAnimationEnd(Animator animation) {
-                    // We are about to trigger the workspace cling, so don't do anything else
-                    setVisibility(View.GONE);
-                    postCb.run();
-                };
-            });
-            anim.start();
+            content.animate()
+                .alpha(0f)
+                .setDuration(duration)
+                .setListener(new AnimatorListenerAdapter() {
+                    public void onAnimationEnd(Animator animation) {
+                        // We are about to trigger the workspace cling, so don't do anything else
+                        setVisibility(View.GONE);
+                        postCb.run();
+                    };
+                })
+                .start();
         } else {
-            ObjectAnimator anim = LauncherAnimUtils.ofFloat(this, "alpha", 0f);
-            anim.setDuration(duration);
-            anim.addListener(new AnimatorListenerAdapter() {
-                public void onAnimationEnd(Animator animation) {
-                    setVisibility(View.GONE);
-                    postCb.run();
-                };
-            });
-            anim.start();
+            animate()
+                .alpha(0f)
+                .setDuration(duration)
+                .setListener(new AnimatorListenerAdapter() {
+                    public void onAnimationEnd(Animator animation) {
+                        // We are about to trigger the workspace cling, so don't do anything else
+                        setVisibility(View.GONE);
+                        postCb.run();
+                    };
+                })
+                .start();
+        }
+
+        // Show the scrim if necessary
+        if (mScrimView != null) {
+            mScrimView.animate()
+                .alpha(0f)
+                .setDuration(duration)
+                .setListener(new AnimatorListenerAdapter() {
+                    public void onAnimationEnd(Animator animation) {
+                        mScrimView.setVisibility(View.GONE);
+                    };
+                })
+                .start();
         }
     }
 
@@ -188,6 +219,12 @@
         mIsInitialized = false;
     }
 
+    void bringScrimToFront() {
+        if (mScrimView != null) {
+            mScrimView.bringToFront();
+        }
+    }
+
     @Override
     public void setInsets(Rect insets) {
         mInsets.set(insets);
@@ -262,13 +299,12 @@
             // Draw the background
             Bitmap eraseBg = null;
             Canvas eraseCanvas = null;
-            if (mBackground != null) {
+            if (mScrimView != null) {
+                // Skip drawing the background
+                mScrimView.setBackgroundColor(mBackgroundColor);
+            } else if (mBackground != null) {
                 mBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
                 mBackground.draw(canvas);
-            } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) ||
-                    mDrawIdentifier.equals(FOLDER_LANDSCAPE) ||
-                    mDrawIdentifier.equals(FOLDER_LARGE)) {
-                canvas.drawColor(0xcc000000);
             } else if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) ||
                     mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
                     mDrawIdentifier.equals(WORKSPACE_LARGE)) {
@@ -276,9 +312,9 @@
                 eraseBg = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(),
                         Bitmap.Config.ARGB_8888);
                 eraseCanvas = new Canvas(eraseBg);
-                eraseCanvas.drawColor(0xdd000000);
+                eraseCanvas.drawColor(mBackgroundColor);
             } else {
-                canvas.drawColor(0xdd000000);
+                canvas.drawColor(mBackgroundColor);
             }
 
             // Draw everything else
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java
index a71d9b2..a4cb117 100644
--- a/src/com/android/launcher3/Folder.java
+++ b/src/com/android/launcher3/Folder.java
@@ -453,8 +453,9 @@
                 setLayerType(LAYER_TYPE_NONE, null);
                 Cling cling = mLauncher.showFirstRunFoldersCling();
                 if (cling != null) {
-                    cling.bringToFront();
+                    cling.bringScrimToFront();
                     bringToFront();
+                    cling.bringToFront();
                 }
                 setFocusOnFirstChild();
             }
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 149a523..63168a3 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -274,7 +274,7 @@
     private boolean mUserPresent = true;
     private boolean mVisible = false;
     private boolean mAttached = false;
-    private static final boolean DISABLE_CLINGS = true;
+    private static final boolean DISABLE_CLINGS = false;
     private static final boolean DISABLE_CUSTOM_CLINGS = true;
 
     private static LocaleConfiguration sLocaleConfiguration = null;
@@ -4064,11 +4064,15 @@
         return true;
     }
 
-    private Cling initCling(int clingId, int[] positionData, boolean animate,
+    private Cling initCling(int clingId, int scrimId, boolean animate,
                             boolean dimNavBarVisibilty) {
-        final Cling cling = (Cling) findViewById(clingId);
+        Cling cling = (Cling) findViewById(clingId);
+        View scrim = null;
+        if (scrimId > 0) {
+            scrim = findViewById(R.id.scrim);
+        }
         if (cling != null) {
-            cling.init(this, positionData);
+            cling.init(this, scrim);
             cling.show(animate, SHOW_CLING_DURATION);
 
             if (dimNavBarVisibilty) {
@@ -4087,7 +4091,6 @@
             final Runnable cleanUpClingCb = new Runnable() {
                 public void run() {
                     cling.cleanup();
-                    /*
                     // We should update the shared preferences on a background thread
                     new Thread("dismissClingThread") {
                         public void run() {
@@ -4096,7 +4099,6 @@
                             editor.commit();
                         }
                     }.start();
-                    */
                     if (postAnimationCb != null) {
                         postAnimationCb.run();
                     }
@@ -4177,7 +4179,7 @@
                     ccHint.setVisibility(View.VISIBLE);
                 }
             }
-            initCling(R.id.first_run_cling, null, false, true);
+            initCling(R.id.first_run_cling, 0, false, true);
         } else {
             removeCling(R.id.first_run_cling);
         }
@@ -4194,7 +4196,7 @@
         // Enable the clings only if they have not been dismissed before
         if (isClingsEnabled() &&
                 !mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
-            initCling(R.id.workspace_cling, null, false, true);
+            initCling(R.id.workspace_cling, 0, false, true);
         } else {
             removeCling(R.id.workspace_cling);
         }
@@ -4203,7 +4205,8 @@
         // Enable the clings only if they have not been dismissed before
         if (isClingsEnabled() &&
                 !mSharedPrefs.getBoolean(Cling.FOLDER_CLING_DISMISSED_KEY, false)) {
-            Cling cling = initCling(R.id.folder_cling, null, true, true);
+            Cling cling = initCling(R.id.folder_cling, R.id.cling_scrim,
+                    true, true);
             return cling;
         } else {
             removeCling(R.id.folder_cling);