Change initial load animation of main list

Make each row slide up and fade in

Bug: 30318643

Change-Id: Ie05352a92142cbfb15c942896abf8d479f4e915d
diff --git a/res/anim/slide_and_fade_in.xml b/res/anim/slide_and_fade_in.xml
new file mode 100644
index 0000000..c362da6
--- /dev/null
+++ b/res/anim/slide_and_fade_in.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+     android:interpolator="@android:interpolator/linear_out_slow_in">
+    <alpha
+        android:duration="@integer/lists_on_load_animation_duration"
+        android:fromAlpha="0.0"
+        android:toAlpha="1.0"/>
+    <translate
+        android:duration="@integer/lists_on_load_animation_duration"
+        android:fromYDelta="5%"
+        android:toYDelta="0"/>
+</set>
diff --git a/res/anim/slide_and_fade_in_layout_animation.xml b/res/anim/slide_and_fade_in_layout_animation.xml
new file mode 100644
index 0000000..7f7e558
--- /dev/null
+++ b/res/anim/slide_and_fade_in_layout_animation.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:animation="@anim/slide_and_fade_in"
+                 android:delay="10%"/>
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 3bb0ae5..f1392f8 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -348,6 +348,7 @@
 
         if (mAllFragment == null) {
             mAllFragment = new DefaultContactBrowseListFragment();
+            mAllFragment.setAnimateOnLoad(true);
             transaction.add(R.id.tab_pager, mAllFragment, ALL_TAG);
         }
 
@@ -775,10 +776,6 @@
                 mCurTransaction = mFragmentManager.beginTransaction();
             }
             Fragment f = getFragment(position);
-            if (!mIsRecreatedInstance && (f instanceof DefaultContactBrowseListFragment)) {
-                mCurTransaction.setCustomAnimations(android.R.animator.fade_in,
-                        android.R.animator.fade_out);
-            }
             mCurTransaction.show(f);
 
             // Non primary pages are not visible.
diff --git a/src/com/android/contacts/list/MultiSelectContactsListFragment.java b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
index 937d4c2..8b55047 100644
--- a/src/com/android/contacts/list/MultiSelectContactsListFragment.java
+++ b/src/com/android/contacts/list/MultiSelectContactsListFragment.java
@@ -16,6 +16,23 @@
 
 package com.android.contacts.list;
 
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.support.v4.view.ViewCompat;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.AbsListView;
+import android.widget.ImageView;
+import android.widget.TextView;
+
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactEntryListFragment;
 import com.android.contacts.common.list.MultiSelectEntryContactListAdapter;
@@ -28,20 +45,6 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.model.account.GoogleAccountType;
 
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.provider.ContactsContract;
-import android.support.v4.view.ViewCompat;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.AbsListView;
-import android.widget.ImageView;
-import android.widget.TextView;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.TreeSet;
@@ -54,6 +57,7 @@
         extends ContactEntryListFragment<T>
         implements SelectedContactsListener {
 
+    protected boolean mAnimateOnLoad;
     private static final String TAG = "MultiContactsList";
 
     public interface OnCheckBoxListActionListener {
@@ -89,12 +93,26 @@
         mSearchResultClicked = false;
     }
 
+    public void setAnimateOnLoad(boolean shouldAnimate) {
+        mAnimateOnLoad = shouldAnimate;
+    }
+
     @Override
     public void onSelectedContactsChanged() {
         if (mCheckBoxListListener != null) mCheckBoxListListener.onSelectedContactIdsChanged();
     }
 
     @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        super.onCreateView(inflater, container, savedInstanceState);
+        if (savedInstanceState == null && mAnimateOnLoad) {
+            setLayoutAnimation(getListView(), R.anim.slide_and_fade_in_layout_animation);
+        }
+        return getView();
+    }
+
+    @Override
     public void onSelectedContactsChangedViaCheckBox() {
         if (getAdapter().getSelectedContactIds().size() == 0) {
             // Last checkbox has been unchecked. So we should stop displaying checkboxes.
@@ -283,6 +301,27 @@
         return searchState;
     }
 
+    protected void setLayoutAnimation(final ViewGroup view, int animationId) {
+        if (view == null) {
+            return;
+        }
+        view.setLayoutAnimationListener(new Animation.AnimationListener() {
+            @Override
+            public void onAnimationStart(Animation animation) {
+            }
+
+            @Override
+            public void onAnimationEnd(Animation animation) {
+                view.setLayoutAnimation(null);
+            }
+
+            @Override
+            public void onAnimationRepeat(Animation animation) {
+            }
+        });
+        view.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(getActivity(), animationId));
+    }
+
     @Override
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
             int totalItemCount) {