added spring loaded mode for adding items to workspace

Change-Id: Ie92294fe2b1d6697d84756a2fcea91a09f72825b
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index fed0884..856507d 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -110,6 +110,9 @@
     protected boolean mAllowOverScroll = true;
     protected int mUnboundedScrollX;
 
+    // parameter that adjusts the layout to be optimized for CellLayouts with that scale factor
+    protected float mLayoutScale = 1.0f;
+
     protected static final int INVALID_POINTER = -1;
 
     protected int mActivePointerId = INVALID_POINTER;
@@ -268,7 +271,9 @@
         if (!mScroller.isFinished()) {
             mScroller.abortAnimation();
         }
-        if (getChildCount() == 0 || currentPage == mCurrentPage) {
+        // don't introduce any checks like mCurrentPage == currentPage here-- if we change the
+        // the default
+        if (getChildCount() == 0) {
             return;
         }
 
@@ -445,6 +450,32 @@
         setCurrentPage(newCurrentPage);
     }
 
+    // A layout scale of 1.0f assumes that the CellLayouts, in their unshrunken state, have a
+    // scale of 1.0f. A layout scale of 0.8f assumes the CellLayouts have a scale of 0.8f, and
+    // tightens the layout accordingly
+    public void setLayoutScale(float childrenScale) {
+        mLayoutScale = childrenScale;
+
+        // Now we need to do a re-layout, but preserving absolute X and Y coordinates
+        int childCount = getChildCount();
+        float childrenX[] = new float[childCount];
+        float childrenY[] = new float[childCount];
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            childrenX[i] = child.getX();
+            childrenY[i] = child.getY();
+        }
+        onLayout(false, mLeft, mTop, mRight, mBottom);
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            child.setX(childrenX[i]);
+            child.setY(childrenY[i]);
+        }
+        // Also, the page offset has changed  (since the pages are now smaller);
+        // update the page offset, but again preserving absolute X and Y coordinates
+        moveToNewPageWithoutMovingCellLayouts(mCurrentPage);
+    }
+
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
@@ -466,17 +497,21 @@
         for (int i = 0; i < childCount; i++) {
             final View child = getChildAt(i);
             if (child.getVisibility() != View.GONE) {
-                final int childWidth = child.getMeasuredWidth();
+                final int childWidth = getScaledMeasuredWidth(child);
                 final int childHeight = child.getMeasuredHeight();
                 int childTop = mPaddingTop;
                 if (mCenterPagesVertically) {
                     childTop += ((getMeasuredHeight() - verticalPadding) - childHeight) / 2;
                 }
+
                 child.layout(childLeft, childTop,
-                        childLeft + childWidth, childTop + childHeight);
+                        childLeft + child.getMeasuredWidth(), childTop + childHeight);
                 childLeft += childWidth + mPageSpacing;
             }
         }
+        if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
+            mFirstLayout = false;
+        }
     }
 
     protected void updateAdjacentPagesAlpha() {
@@ -487,7 +522,7 @@
                 final int childCount = getChildCount();
                 for (int i = 0; i < childCount; ++i) {
                     View layout = (View) getChildAt(i);
-                    int childWidth = layout.getMeasuredWidth();
+                    int childWidth = getScaledMeasuredWidth(layout);
                     int halfChildWidth = (childWidth / 2);
                     int childCenter = getChildOffset(i) + halfChildWidth;
 
@@ -503,11 +538,11 @@
                     int distanceFromScreenCenter = childCenter - screenCenter;
                     if (distanceFromScreenCenter > 0) {
                         if (i > 0) {
-                            d += getChildAt(i - 1).getMeasuredWidth() / 2;
+                            d += getScaledMeasuredWidth(getChildAt(i - 1)) / 2;
                         }
                     } else {
                         if (i < childCount - 1) {
-                            d += getChildAt(i + 1).getMeasuredWidth() / 2;
+                            d += getScaledMeasuredWidth(getChildAt(i + 1)) / 2;
                         }
                     }
                     d += mPageSpacing;
@@ -553,7 +588,7 @@
         // page.
         final int pageCount = getChildCount();
         if (pageCount > 0) {
-            final int pageWidth = getChildAt(0).getMeasuredWidth();
+            final int pageWidth = getScaledMeasuredWidth(getChildAt(0));
             final int screenWidth = getMeasuredWidth();
             int x = getRelativeChildOffset(0) + pageWidth;
             int leftScreen = 0;
@@ -563,7 +598,7 @@
                 x += pageWidth + mPageSpacing;
                 // replace above line with this if you don't assume all pages have same width as 0th
                 // page:
-                // x += getChildAt(leftScreen).getMeasuredWidth();
+                // x += getScaledMeasuredWidth(getChildAt(leftScreen));
             }
             rightScreen = leftScreen;
             while (x < mScrollX + screenWidth) {
@@ -572,7 +607,7 @@
                 // replace above line with this if you don't assume all pages have same width as 0th
                 // page:
                 //if (rightScreen < pageCount) {
-                //    x += getChildAt(rightScreen).getMeasuredWidth();
+                //    x += getScaledMeasuredWidth(getChildAt(rightScreen));
                 //}
             }
             rightScreen = Math.min(getChildCount() - 1, rightScreen);
@@ -1049,7 +1084,7 @@
         int right;
         for (int i = 0; i < childCount; ++i) {
             left = getRelativeChildOffset(i);
-            right = (left + getChildAt(i).getMeasuredWidth());
+            right = (left + getScaledMeasuredWidth(getChildAt(i)));
             if (left <= relativeOffset && relativeOffset <= right) {
                 return i;
             }
@@ -1067,11 +1102,15 @@
 
         int offset = getRelativeChildOffset(0);
         for (int i = 0; i < index; ++i) {
-            offset += getChildAt(i).getMeasuredWidth() + mPageSpacing;
+            offset += getScaledMeasuredWidth(getChildAt(i)) + mPageSpacing;
         }
         return offset;
     }
 
+    protected int getScaledMeasuredWidth(View child) {
+        return (int) (child.getMeasuredWidth() * mLayoutScale + 0.5f);
+    }
+
     int getPageNearestToCenterOfScreen() {
         int minDistanceFromScreenCenter = getMeasuredWidth();
         int minDistanceFromScreenCenterIndex = -1;
@@ -1079,7 +1118,7 @@
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; ++i) {
             View layout = (View) getChildAt(i);
-            int childWidth = layout.getMeasuredWidth();
+            int childWidth = getScaledMeasuredWidth(layout);
             int halfChildWidth = (childWidth / 2);
             int childCenter = getChildOffset(i) + halfChildWidth;
             int distanceFromScreenCenter = Math.abs(childCenter - screenCenter);