Initial changes to restore clings.

Change-Id: Ie23e6e9f39679e8d35955a4a7db804d03f8b4d3f
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 89d4cb3..3bbb39e 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -202,8 +202,8 @@
     static final int APPWIDGET_HOST_ID = 1024;
     private static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300;
     private static final int EXIT_SPRINGLOADED_MODE_LONG_TIMEOUT = 600;
-    private static final int SHOW_CLING_DURATION = 550;
-    private static final int DISMISS_CLING_DURATION = 250;
+    private static final int SHOW_CLING_DURATION = 250;
+    private static final int DISMISS_CLING_DURATION = 200;
 
     private static final Object sLock = new Object();
     private static int sScreen = DEFAULT_SCREEN;
@@ -422,7 +422,6 @@
         setContentView(R.layout.launcher);
         setupViews();
         grid.layout(this);
-        showFirstRunWorkspaceCling();
 
         registerContentObservers();
 
@@ -464,6 +463,8 @@
 
         // On large interfaces, we want the screen to auto-rotate based on the current orientation
         unlockScreenOrientation(true);
+
+        showFirstRunCling();
     }
 
     protected void onUserLeaveHint() {
@@ -4080,47 +4081,30 @@
         return true;
     }
 
-    private Cling initCling(int clingId, int[] positionData, boolean animate, int delay) {
+    private Cling initCling(int clingId, int[] positionData, boolean animate,
+                            boolean dimNavBarVisibilty) {
         final Cling cling = (Cling) findViewById(clingId);
         if (cling != null) {
             cling.init(this, positionData);
-            cling.setVisibility(View.VISIBLE);
-            cling.setLayerType(View.LAYER_TYPE_HARDWARE, null);
-            if (animate) {
-                cling.buildLayer();
-                cling.setAlpha(0f);
-                cling.animate()
-                    .alpha(1f)
-                    .setInterpolator(new AccelerateInterpolator())
-                    .setDuration(SHOW_CLING_DURATION)
-                    .setStartDelay(delay)
-                    .start();
-            } else {
-                cling.setAlpha(1f);
+            cling.show(animate, SHOW_CLING_DURATION);
+
+            if (dimNavBarVisibilty) {
+                cling.setSystemUiVisibility(cling.getSystemUiVisibility() |
+                        View.SYSTEM_UI_FLAG_LOW_PROFILE);
             }
-            cling.setFocusableInTouchMode(true);
-            cling.post(new Runnable() {
-                public void run() {
-                    cling.setFocusable(true);
-                    cling.requestFocus();
-                }
-            });
-            mHideFromAccessibilityHelper.setImportantForAccessibilityToNo(
-                    mDragLayer, clingId == R.id.all_apps_cling);
         }
         return cling;
     }
 
-    private void dismissCling(final Cling cling, final String flag, int duration) {
+    private void dismissCling(final Cling cling, final Runnable postAnimationCb,
+                              final String flag, int duration, boolean restoreNavBarVisibilty) {
         // To catch cases where siblings of top-level views are made invisible, just check whether
         // the cling is directly set to GONE before dismissing it.
         if (cling != null && cling.getVisibility() != View.GONE) {
-            ObjectAnimator anim = LauncherAnimUtils.ofFloat(cling, "alpha", 0f);
-            anim.setDuration(duration);
-            anim.addListener(new AnimatorListenerAdapter() {
-                public void onAnimationEnd(Animator animation) {
-                    cling.setVisibility(View.GONE);
+            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() {
@@ -4129,10 +4113,23 @@
                             editor.commit();
                         }
                     }.start();
-                };
-            });
-            anim.start();
+                    */
+                    if (postAnimationCb != null) {
+                        postAnimationCb.run();
+                    }
+                }
+            };
+            if (duration <= 0) {
+                cleanUpClingCb.run();
+            } else {
+                cling.hide(duration, cleanUpClingCb);
+            }
             mHideFromAccessibilityHelper.restoreImportantForAccessibility(mDragLayer);
+
+            if (restoreNavBarVisibilty) {
+                cling.setSystemUiVisibility(cling.getSystemUiVisibility() &
+                        ~View.SYSTEM_UI_FLAG_LOW_PROFILE);
+            }
         }
     }
 
@@ -4162,10 +4159,9 @@
         return false;
     }
 
-    public void showFirstRunWorkspaceCling() {
-        // Enable the clings only if they have not been dismissed before
+    public void showFirstRunCling() {
         if (isClingsEnabled() &&
-                !mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false) &&
+                !mSharedPrefs.getBoolean(Cling.FIRST_RUN_CLING_DISMISSED_KEY, false) &&
                 !skipCustomClingIfNoAccounts() ) {
             // If we're not using the default workspace layout, replace workspace cling
             // with a custom workspace cling (usually specified in an overlay)
@@ -4181,25 +4177,27 @@
                 clingParent.addView(customCling, clingIndex);
                 customCling.setId(R.id.workspace_cling);
             }
-            initCling(R.id.workspace_cling, null, false, 0);
+            initCling(R.id.first_run_cling, null, false, true);
         } else {
-            removeCling(R.id.workspace_cling);
+            removeCling(R.id.first_run_cling);
         }
     }
-    public void showFirstRunAllAppsCling(int[] position) {
+
+    public void showFirstRunWorkspaceCling() {
         // Enable the clings only if they have not been dismissed before
         if (isClingsEnabled() &&
-                !mSharedPrefs.getBoolean(Cling.ALLAPPS_CLING_DISMISSED_KEY, false)) {
-            initCling(R.id.all_apps_cling, position, true, 0);
+                !mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
+            initCling(R.id.workspace_cling, null, false, true);
         } else {
-            removeCling(R.id.all_apps_cling);
+            removeCling(R.id.workspace_cling);
         }
     }
     public Cling showFirstRunFoldersCling() {
         // Enable the clings only if they have not been dismissed before
         if (isClingsEnabled() &&
                 !mSharedPrefs.getBoolean(Cling.FOLDER_CLING_DISMISSED_KEY, false)) {
-            return initCling(R.id.folder_cling, null, true, 0);
+            Cling cling = initCling(R.id.folder_cling, null, true, true);
+            return cling;
         } else {
             removeCling(R.id.folder_cling);
             return null;
@@ -4215,17 +4213,34 @@
         }
         return false;
     }
+    public void dismissFirstRunCling(View v) {
+        Cling cling = (Cling) findViewById(R.id.first_run_cling);
+        Runnable cb = new Runnable() {
+            public void run() {
+                // Show the workspace cling next
+                showFirstRunWorkspaceCling();
+            }
+        };
+        dismissCling(cling, cb, Cling.FIRST_RUN_CLING_DISMISSED_KEY,
+                DISMISS_CLING_DURATION, false);
+    }
     public void dismissWorkspaceCling(View v) {
         Cling cling = (Cling) findViewById(R.id.workspace_cling);
-        dismissCling(cling, Cling.WORKSPACE_CLING_DISMISSED_KEY, DISMISS_CLING_DURATION);
-    }
-    public void dismissAllAppsCling(View v) {
-        Cling cling = (Cling) findViewById(R.id.all_apps_cling);
-        dismissCling(cling, Cling.ALLAPPS_CLING_DISMISSED_KEY, DISMISS_CLING_DURATION);
+        Runnable cb = null;
+        if (v == null) {
+            cb = new Runnable() {
+                public void run() {
+                    mWorkspace.enterOverviewMode();
+                }
+            };
+        }
+        dismissCling(cling, cb, Cling.WORKSPACE_CLING_DISMISSED_KEY,
+                DISMISS_CLING_DURATION, true);
     }
     public void dismissFolderCling(View v) {
         Cling cling = (Cling) findViewById(R.id.folder_cling);
-        dismissCling(cling, Cling.FOLDER_CLING_DISMISSED_KEY, DISMISS_CLING_DURATION);
+        dismissCling(cling, null, Cling.FOLDER_CLING_DISMISSED_KEY,
+                DISMISS_CLING_DURATION, true);
     }
 
     /**