Merge "Import translations. DO NOT MERGE" into klp-dev
diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java
index 84bd4b4..d731786 100644
--- a/src/com/android/dialer/list/PhoneFavoriteFragment.java
+++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java
@@ -15,6 +15,9 @@
  */
 package com.android.dialer.list;
 
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.LoaderManager;
@@ -404,19 +407,42 @@
         if (mItemIdLeftMap.isEmpty()) {
             return;
         }
+        final AnimatorSet animSet = new AnimatorSet();
+        final ArrayList<Animator> animators = new ArrayList<Animator>();
         for (int i = 0; i < list.size(); i++) {
             final View child = row.getChildAt(i);
             final ContactEntry entry = list.get(i);
             final long itemId = mContactTileAdapter.getAdjustedItemId(entry.id);
 
             if (containsId(idsInPlace, itemId)) {
-                child.setAlpha(0.0f);
-                child.animate().alpha(1.0f)
-                        .setDuration(mAnimationDuration)
-                        .start();
+                animators.add(ObjectAnimator.ofFloat(
+                        child, "alpha", 0.0f, 1.0f));
                 break;
+            } else {
+                Integer startLeft = mItemIdLeftMap.get(itemId);
+                int left = child.getLeft();
+                if (startLeft != null) {
+                    if (startLeft != left) {
+                        int delta = startLeft - left;
+                        if (DEBUG) {
+                            Log.d(TAG, "Found itemId: " + itemId + " for tileview child " + i +
+                                    " Left: " + left +
+                                    " Delta: " + delta);
+                        }
+                        animators.add(ObjectAnimator.ofFloat(
+                                child, "translationX", delta, 0.0f));
+                    }
+                } else {
+                    // In case the last square row is pushed up from the non-square section.
+                    animators.add(ObjectAnimator.ofFloat(
+                            child, "translationX", left, 0.0f));
+                }
             }
         }
+        if (animators.size() > 0) {
+            animSet.setDuration(mAnimationDuration).playTogether(animators);
+            animSet.start();
+        }
     }
 
     /*
@@ -437,6 +463,8 @@
             public boolean onPreDraw() {
                 observer.removeOnPreDrawListener(this);
                 final int firstVisiblePosition = mListView.getFirstVisiblePosition();
+                final AnimatorSet animSet = new AnimatorSet();
+                final ArrayList<Animator> animators = new ArrayList<Animator>();
                 for (int i = 0; i < mListView.getChildCount(); i++) {
                     final View child = mListView.getChildAt(i);
                     int position = firstVisiblePosition + i;
@@ -450,17 +478,12 @@
                     final long itemId = mAdapter.getItemId(position);
 
                     if (containsId(idsInPlace, itemId)) {
-                        child.setAlpha(0.0f);
-                        child.animate().alpha(1.0f)
-                                .setDuration(mAnimationDuration)
-                                .start();
+                        animators.add(ObjectAnimator.ofFloat(
+                                child, "alpha", 0.0f, 1.0f));
+                        break;
                     } else {
                         Integer startTop = mItemIdTopMap.get(itemId);
                         final int top = child.getTop();
-                        if (DEBUG) {
-                            Log.d(TAG, "Found itemId: " + itemId + " for listview child " + i +
-                                    " Top: " + top);
-                        }
                         int delta = 0;
                         if (startTop != null) {
                             if (startTop != top) {
@@ -473,14 +496,30 @@
                             int childHeight = child.getHeight() + mListView.getDividerHeight();
                             startTop = top + (i > 0 ? childHeight : -childHeight);
                             delta = startTop - top;
+                        } else {
+                            // In case the first non-square row is pushed down
+                            // from the square section.
+                            animators.add(ObjectAnimator.ofFloat(
+                                    child, "alpha", 0.0f, 1.0f));
+                        }
+                        if (DEBUG) {
+                            Log.d(TAG, "Found itemId: " + itemId + " for listview child " + i +
+                                    " Top: " + top +
+                                    " Delta: " + delta);
                         }
 
                         if (delta != 0) {
-                            child.setTranslationY(delta);
-                            child.animate().setDuration(mAnimationDuration).translationY(0);
+                            animators.add(ObjectAnimator.ofFloat(
+                                    child, "translationY", delta, 0.0f));
                         }
                     }
                 }
+
+                if (animators.size() > 0) {
+                    animSet.setDuration(mAnimationDuration).playTogether(animators);
+                    animSet.start();
+                }
+
                 mItemIdTopMap.clear();
                 mItemIdLeftMap.clear();
                 return true;
diff --git a/src/com/android/dialer/list/PhoneFavoriteListView.java b/src/com/android/dialer/list/PhoneFavoriteListView.java
index 04bbe6b..4e0b8ff 100644
--- a/src/com/android/dialer/list/PhoneFavoriteListView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteListView.java
@@ -105,7 +105,8 @@
 
     private final AnimatorListenerAdapter mDragShadowOverAnimatorListener =
             new AnimatorListenerAdapter() {
-        private void recycleDragShadow() {
+        @Override
+        public void onAnimationEnd(Animator animation) {
             if (mDragShadowBitmap != null) {
                 mDragShadowBitmap.recycle();
                 mDragShadowBitmap = null;
@@ -113,16 +114,6 @@
             mDragShadowOverlay.setVisibility(GONE);
             mDragShadowOverlay.setImageBitmap(null);
         }
-
-        @Override
-        public void onAnimationCancel(Animator animation) {
-            recycleDragShadow();
-        }
-
-        @Override
-        public void onAnimationEnd(Animator animation) {
-            recycleDragShadow();
-        }
     };
 
     public PhoneFavoriteListView(Context context) {
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index 2e18118..2b232e8 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -407,7 +407,7 @@
         return mColumnCount * mMaxTiledRows;
     }
 
-    protected int getRowIndex(int entryIndex) {
+    public int getRowIndex(int entryIndex) {
         if (entryIndex < mMaxTiledRows * mColumnCount) {
             return entryIndex / mColumnCount;
         } else {
@@ -593,11 +593,14 @@
      */
     private void markDropArea(int itemIndex) {
         if (isIndexInBound(mDragEnteredEntryIndex) && isIndexInBound(itemIndex)) {
+            mDataSetChangedListener.cacheOffsetsForDatasetChange();
             // Remove the old placeholder item and place the new placeholder item.
+            final int oldIndex = mDragEnteredEntryIndex;
             mContactEntries.remove(mDragEnteredEntryIndex);
             mDragEnteredEntryIndex = itemIndex;
             mContactEntries.add(mDragEnteredEntryIndex, ContactEntry.BLANK_ENTRY);
             ContactEntry.BLANK_ENTRY.id = mDraggedEntry.id;
+            mDataSetChangedListener.onDataSetChangedForAnimation();
             notifyDataSetChanged();
         }
     }
diff --git a/src/com/android/dialer/list/SwipeHelper.java b/src/com/android/dialer/list/SwipeHelper.java
index ce46ec3..03300df4 100644
--- a/src/com/android/dialer/list/SwipeHelper.java
+++ b/src/com/android/dialer/list/SwipeHelper.java
@@ -337,24 +337,12 @@
                 invalidateGlobalRegion(animView);
             }
         });
-        anim.addListener(new Animator.AnimatorListener() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-            }
-
+        anim.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
                 animView.setAlpha(mStartAlpha);
                 mCallback.onDragCancelled(mCurrView);
             }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-            }
-
-            @Override
-            public void onAnimationRepeat(Animator animation) {
-            }
         });
         anim.start();
     }