New folder visualization, renaming, staggering reorder

Change-Id: I62963d225e6ea5d2ec9d8ebc8a6d73099f5d6c7f
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java
index af47bea..c4d75d6 100644
--- a/src/com/android/launcher2/DragLayer.java
+++ b/src/com/android/launcher2/DragLayer.java
@@ -25,6 +25,7 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewParent;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
@@ -62,13 +63,13 @@
         mLauncher = launcher;
         mDragController = controller;
     }
-    
+
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
         return mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
     }
 
-    private boolean handleTouchDown(MotionEvent ev) {
+    private boolean handleTouchDown(MotionEvent ev, boolean intercept) {
         Rect hitRect = new Rect();
         int x = (int) ev.getX();
         int y = (int) ev.getY();
@@ -85,17 +86,21 @@
                 }
             }
         }
-        if (mCurrentFolder != null) {
-            mCurrentFolder.getHitRect(hitRect);
-            int[] screenPos = new int[2];
-            View parent = (View) mCurrentFolder.getParent();
-            if (parent != null) {
-                parent.getLocationOnScreen(screenPos);
-                hitRect.offset(screenPos[0], screenPos[1]);
+
+        if (mCurrentFolder != null && intercept) {
+            if (mCurrentFolder.isEditingName()) {
+                getDescendantRectRelativeToSelf(mCurrentFolder.getEditTextRegion(), hitRect);
                 if (!hitRect.contains(x, y)) {
-                    mLauncher.closeFolder();
+                    mCurrentFolder.dismissEditingName();
+                    return true;
                 }
             }
+
+            getDescendantRectRelativeToSelf(mCurrentFolder, hitRect);
+            if (!hitRect.contains(x, y)) {
+                mLauncher.closeFolder();
+                return true;
+            }
         }
         return false;
     }
@@ -103,7 +108,7 @@
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
-            if (handleTouchDown(ev)) {
+            if (handleTouchDown(ev, true)) {
                 return true;
             }
         }
@@ -121,7 +126,7 @@
 
         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
             if (ev.getAction() == MotionEvent.ACTION_DOWN) {
-                if (handleTouchDown(ev)) {
+                if (handleTouchDown(ev, false)) {
                     return true;
                 }
             }
@@ -143,6 +148,18 @@
         return mDragController.onTouchEvent(ev);
     }
 
+    private void getDescendantRectRelativeToSelf(View descendant, Rect r) {
+        descendant.getHitRect(r);
+
+        ViewParent viewParent = descendant.getParent();
+        while (viewParent instanceof View && viewParent != this) {
+            final View view = (View)viewParent;
+            r.offset(view.getLeft() + (int) (view.getTranslationX() + 0.5f) - view.getScrollX(),
+                    view.getTop() + (int) (view.getTranslationY() + 0.5f) - view.getScrollY());
+            viewParent = view.getParent();
+        }
+    }
+
     @Override
     public boolean dispatchUnhandledMove(View focused, int direction) {
         return mDragController.dispatchUnhandledMove(focused, direction);