Move view expand logic to CallLogListItemViews.

Bug: 19372817
Change-Id: I92d9f001155d4a059c89bc4b00abcef4e817f32d
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 1733068..d1a164a 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -64,8 +64,6 @@
         implements ViewTreeObserver.OnPreDrawListener, CallLogGroupBuilder.GroupCreator {
     private static final String TAG = CallLogAdapter.class.getSimpleName();
 
-    private static final int VOICEMAIL_TRANSCRIPTION_MAX_LINES = 10;
-
     /** The enumeration of {@link android.os.AsyncTask} objects used in this class. */
     public enum Tasks {
         REMOVE_CALL_LOG_ENTRIES,
@@ -257,9 +255,6 @@
     /** Can be set to true by tests to disable processing of requests. */
     private volatile boolean mRequestProcessingDisabled = false;
 
-    private int mCallLogBackgroundColor;
-    private int mExpandedBackgroundColor;
-    private float mExpandedTranslationZ;
     private int mPhotoSize;
 
     /** Listener for the primary or secondary actions in the list.
@@ -349,9 +344,6 @@
 
         Resources resources = mContext.getResources();
         CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
-        mCallLogBackgroundColor = resources.getColor(R.color.background_dialer_list_items);
-        mExpandedBackgroundColor = resources.getColor(R.color.call_log_expanded_background_color);
-        mExpandedTranslationZ = resources.getDimension(R.dimen.call_log_expanded_translation_z);
         mPhotoSize = resources.getDimensionPixelSize(R.dimen.contact_photo_size);
 
         mContactPhotoManager = ContactPhotoManager.getInstance(mContext);
@@ -733,7 +725,12 @@
 
         // Restore expansion state of the row on rebind.  Inflate the actions ViewStub if required,
         // and set its visibility state accordingly.
-        expandOrCollapseActions(callLogItemView, isExpanded(rowId));
+        views.expandOrCollapseActions(
+                isExpanded(rowId),
+                mOnReportButtonClickListener,
+                mActionListener,
+                mPhoneNumberUtilsWrapper,
+                mCallLogViewsHelper);
 
         if (TextUtils.isEmpty(name)) {
             details = new PhoneCallDetails(number, numberPresentation, formattedNumber, countryIso,
@@ -845,54 +842,6 @@
         }
     }
 
-    /**
-     * Expands or collapses the view containing the CALLBACK/REDIAL, VOICEMAIL and DETAILS action
-     * buttons.
-     *
-     * @param callLogItem The call log entry parent view.
-     * @param isExpanded The new expansion state of the view.
-     */
-    private void expandOrCollapseActions(View callLogItem, boolean isExpanded) {
-        final CallLogListItemViews views = (CallLogListItemViews) callLogItem.getTag();
-
-        expandVoicemailTranscriptionView(views, isExpanded);
-        if (isExpanded) {
-            // Inflate the view stub if necessary, and wire up the event handlers.
-            views.inflateActionViewStub(callLogItem, mOnReportButtonClickListener, mActionListener,
-                    mPhoneNumberUtilsWrapper, mCallLogViewsHelper);
-
-            views.actionsView.setVisibility(View.VISIBLE);
-            views.actionsView.setAlpha(1.0f);
-            views.callLogEntryView.setBackgroundColor(mExpandedBackgroundColor);
-            views.callLogEntryView.setTranslationZ(mExpandedTranslationZ);
-            callLogItem.setTranslationZ(mExpandedTranslationZ); // WAR
-        } else {
-            // When recycling a view, it is possible the actionsView ViewStub was previously
-            // inflated so we should hide it in this case.
-            if (views.actionsView != null) {
-                views.actionsView.setVisibility(View.GONE);
-            }
-
-            views.callLogEntryView.setBackgroundColor(mCallLogBackgroundColor);
-            views.callLogEntryView.setTranslationZ(0);
-            callLogItem.setTranslationZ(0); // WAR
-        }
-    }
-
-    public static void expandVoicemailTranscriptionView(CallLogListItemViews views,
-            boolean isExpanded) {
-        if (views.callType != Calls.VOICEMAIL_TYPE) {
-            return;
-        }
-
-        final TextView view = views.phoneCallDetailsViews.voicemailTranscriptionView;
-        if (TextUtils.isEmpty(view.getText())) {
-            return;
-        }
-        view.setMaxLines(isExpanded ? VOICEMAIL_TRANSCRIPTION_MAX_LINES : 1);
-        view.setSingleLine(!isExpanded);
-    }
-
     /** Checks whether the contact info from the call log matches the one from the contacts db. */
     private boolean callLogInfoMatches(ContactInfo callLogInfo, ContactInfo info) {
         // The call log only contains a subset of the fields in the contacts db.
@@ -1070,7 +1019,7 @@
     void bindViewForTest(View view, Context context, Cursor cursor) {
         bindStandAloneView(view, context, cursor);
         CallLogListItemViews views = CallLogListItemViews.fromView(context, view);
-        views.inflateActionViewStub(view, mOnReportButtonClickListener, mActionListener,
+        views.inflateActionViewStub(mOnReportButtonClickListener, mActionListener,
                 mPhoneNumberUtilsWrapper, mCallLogViewsHelper);
     }
 
@@ -1172,7 +1121,12 @@
         boolean expanded = toggleExpansion(views.rowId);
 
         // Trigger loading of the viewstub and visual expand or collapse.
-        expandOrCollapseActions(view, expanded);
+        views.expandOrCollapseActions(
+                expanded,
+                mOnReportButtonClickListener,
+                mActionListener,
+                mPhoneNumberUtilsWrapper,
+                mCallLogViewsHelper);
 
         // Animate the expansion or collapse.
         if (mCallItemExpandedListener != null) {
@@ -1182,11 +1136,15 @@
 
             // Animate the collapse of the previous item if it is still visible on screen.
             if (mPreviouslyExpanded != NONE_EXPANDED) {
-                View previousItem = mCallItemExpandedListener.getViewForCallId(
-                        mPreviouslyExpanded);
+                View previousItem = mCallItemExpandedListener.getViewForCallId(mPreviouslyExpanded);
 
                 if (previousItem != null) {
-                    expandOrCollapseActions(previousItem, false);
+                    ((CallLogListItemViews) previousItem.getTag()).expandOrCollapseActions(
+                            false /* isExpanded */,
+                            mOnReportButtonClickListener,
+                            mActionListener,
+                            mPhoneNumberUtilsWrapper,
+                            mCallLogViewsHelper);
                     if (animate) {
                         mCallItemExpandedListener.onItemExpanded(previousItem);
                     }
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index c4e453c..7b5907c 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -556,7 +556,7 @@
                 if (!isExpand) {
                     viewHolder.actionsView.setVisibility(View.VISIBLE);
                 }
-                CallLogAdapter.expandVoicemailTranscriptionView(viewHolder, !isExpand);
+                viewHolder.expandVoicemailTranscriptionView(!isExpand);
 
                 // Set up the fade effect for the action buttons.
                 if (isExpand) {
@@ -625,7 +625,7 @@
                             // is defaulting to the value (0) at the start of the expand animation.
                             viewHolder.actionsView.setAlpha(1);
                         }
-                        CallLogAdapter.expandVoicemailTranscriptionView(viewHolder, isExpand);
+                        viewHolder.expandVoicemailTranscriptionView(isExpand);
                     }
                 });
 
diff --git a/src/com/android/dialer/calllog/CallLogListItemViews.java b/src/com/android/dialer/calllog/CallLogListItemViews.java
index b9a76a8..427732e 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViews.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViews.java
@@ -17,8 +17,10 @@
 package com.android.dialer.calllog;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.provider.CallLog.Calls;
 import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewStub;
@@ -40,6 +42,8 @@
  * if the call log list item is eventually represented as a UI component.
  */
 public final class CallLogListItemViews {
+    /** The root view of the call log list item */
+    public final View rootView;
     /** The quick contact badge for the contact. */
     public final QuickContactBadge quickContactView;
     /** The primary action view of the entry. */
@@ -123,10 +127,17 @@
      */
     public boolean canBeReportedAsInvalid;
 
+    private static final int VOICEMAIL_TRANSCRIPTION_MAX_LINES = 10;
+
     private Context mContext;
 
+    private int mCallLogBackgroundColor;
+    private int mExpandedBackgroundColor;
+    private float mExpandedTranslationZ;
+
     private CallLogListItemViews(
             Context context,
+            View rootView,
             QuickContactBadge quickContactView,
             View primaryActionView,
             PhoneCallDetailsViews phoneCallDetailsViews,
@@ -134,11 +145,17 @@
             TextView dayGroupHeader) {
         mContext = context;
 
+        this.rootView = rootView;
         this.quickContactView = quickContactView;
         this.primaryActionView = primaryActionView;
         this.phoneCallDetailsViews = phoneCallDetailsViews;
         this.callLogEntryView = callLogEntryView;
         this.dayGroupHeader = dayGroupHeader;
+
+        Resources resources = mContext.getResources();
+        mCallLogBackgroundColor = resources.getColor(R.color.background_dialer_list_items);
+        mExpandedBackgroundColor = resources.getColor(R.color.call_log_expanded_background_color);
+        mExpandedTranslationZ = resources.getDimension(R.dimen.call_log_expanded_translation_z);
     }
 
     /**
@@ -149,12 +166,11 @@
      * @param callLogItem The call log list item view.
      */
     public void inflateActionViewStub(
-            final View callLogItem,
             final CallLogAdapter.OnReportButtonClickListener onReportButtonClickListener,
             View.OnClickListener actionListener,
             PhoneNumberUtilsWrapper phoneNumberUtilsWrapper,
             CallLogListItemHelper callLogViewsHelper) {
-        ViewStub stub = (ViewStub) callLogItem.findViewById(R.id.call_log_entry_actions_stub);
+        ViewStub stub = (ViewStub) rootView.findViewById(R.id.call_log_entry_actions_stub);
         if (stub != null) {
             actionsView = (ViewGroup) stub.inflate();
         }
@@ -266,9 +282,63 @@
         callLogViewsHelper.setActionContentDescriptions(this);
     }
 
+    /**
+     * Expands or collapses the view containing the CALLBACK/REDIAL, VOICEMAIL and DETAILS action
+     * buttons.
+     *
+     * TODO: Reduce number of classes which need to be passed in to inflate the action view stub.
+     *     1) Instantiate them in this class, and store local references.
+     *     2) Set them on the CallLogListItemHelper and use it for inflation.
+     *     3) Implement a parent view for a call log list item, and store references in that class.
+     */
+    public void expandOrCollapseActions(
+            boolean isExpanded,
+            final CallLogAdapter.OnReportButtonClickListener onReportButtonClickListener,
+            View.OnClickListener actionListener,
+            PhoneNumberUtilsWrapper phoneNumberUtilsWrapper,
+            CallLogListItemHelper callLogViewsHelper) {
+        expandVoicemailTranscriptionView(isExpanded);
+
+        if (isExpanded) {
+            // Inflate the view stub if necessary, and wire up the event handlers.
+            inflateActionViewStub(onReportButtonClickListener, actionListener,
+                    phoneNumberUtilsWrapper, callLogViewsHelper);
+
+            actionsView.setVisibility(View.VISIBLE);
+            actionsView.setAlpha(1.0f);
+            callLogEntryView.setBackgroundColor(mExpandedBackgroundColor);
+            callLogEntryView.setTranslationZ(mExpandedTranslationZ);
+            rootView.setTranslationZ(mExpandedTranslationZ); // WAR
+        } else {
+            // When recycling a view, it is possible the actionsView ViewStub was previously
+            // inflated so we should hide it in this case.
+            if (actionsView != null) {
+                actionsView.setVisibility(View.GONE);
+            }
+
+            callLogEntryView.setBackgroundColor(mCallLogBackgroundColor);
+            callLogEntryView.setTranslationZ(0);
+            rootView.setTranslationZ(0); // WAR
+        }
+    }
+
+    public void expandVoicemailTranscriptionView(boolean isExpanded) {
+        if (callType != Calls.VOICEMAIL_TYPE) {
+            return;
+        }
+
+        final TextView view = phoneCallDetailsViews.voicemailTranscriptionView;
+        if (TextUtils.isEmpty(view.getText())) {
+            return;
+        }
+        view.setMaxLines(isExpanded ? VOICEMAIL_TRANSCRIPTION_MAX_LINES : 1);
+        view.setSingleLine(!isExpanded);
+    }
+
     public static CallLogListItemViews fromView(Context context, View view) {
         return new CallLogListItemViews(
                 context,
+                view,
                 (QuickContactBadge) view.findViewById(R.id.quick_contact_photo),
                 view.findViewById(R.id.primary_action_view),
                 PhoneCallDetailsViews.fromView(view),
@@ -280,6 +350,7 @@
     public static CallLogListItemViews createForTest(Context context) {
         CallLogListItemViews views = new CallLogListItemViews(
                 context,
+                new View(context),
                 new QuickContactBadge(context),
                 new View(context),
                 PhoneCallDetailsViews.createForTest(context),