Merge "Add play voicemail primary action to call log." into mnc-dev
diff --git a/res/drawable-hdpi/ic_play_arrow_24dp.png b/res/drawable-hdpi/ic_play_arrow_24dp.png
new file mode 100644
index 0000000..57c9fa5
--- /dev/null
+++ b/res/drawable-hdpi/ic_play_arrow_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_play_arrow_24dp.png b/res/drawable-mdpi/ic_play_arrow_24dp.png
new file mode 100644
index 0000000..c61e948
--- /dev/null
+++ b/res/drawable-mdpi/ic_play_arrow_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_play_arrow_24dp.png b/res/drawable-xhdpi/ic_play_arrow_24dp.png
new file mode 100644
index 0000000..a3c80e7
--- /dev/null
+++ b/res/drawable-xhdpi/ic_play_arrow_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_play_arrow_24dp.png b/res/drawable-xxhdpi/ic_play_arrow_24dp.png
new file mode 100644
index 0000000..547ef30
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_play_arrow_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_play_arrow_24dp.png b/res/drawable-xxxhdpi/ic_play_arrow_24dp.png
new file mode 100644
index 0000000..be5c062
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_play_arrow_24dp.png
Binary files differ
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 3c7e080..4304002 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -116,9 +116,13 @@
                 return;
             }
 
+            // Always reset the voicemail playback state on expand or collapse.
+            mVoicemailPlaybackPresenter.reset();
+
             if (viewHolder.getAdapterPosition() == mCurrentlyExpandedPosition) {
                 // Hide actions, if the clicked item is the expanded item.
                 viewHolder.showActions(false);
+
                 mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
                 mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
             } else {
@@ -289,6 +293,7 @@
         CallLogListItemViewHolder viewHolder = CallLogListItemViewHolder.create(
                 view,
                 mContext,
+                mExpandCollapseListener,
                 mPhoneNumberUtilsWrapper,
                 mCallLogViewsHelper,
                 mVoicemailPlaybackPresenter);
@@ -297,7 +302,6 @@
         viewHolder.callLogEntryView.setAccessibilityDelegate(mAccessibilityDelegate);
 
         viewHolder.primaryActionView.setTag(viewHolder);
-        viewHolder.primaryActionView.setOnClickListener(mExpandCollapseListener);
 
         return viewHolder;
     }
@@ -402,7 +406,6 @@
             mCurrentlyExpandedPosition = position;
         }
         views.showActions(mCurrentlyExpandedPosition == position);
-        views.updatePrimaryActionButton();
 
         String nameForDefaultImage = null;
         if (TextUtils.isEmpty(info.name)) {
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 1d6a434..f54720b 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -145,8 +145,12 @@
 
     private final int mPhotoSize;
 
+    private View.OnClickListener mExpandCollapseListener;
+    private boolean mVoicemailPrimaryActionButtonClicked;
+
     private CallLogListItemViewHolder(
             Context context,
+            View.OnClickListener expandCollapseListener,
             PhoneNumberUtilsWrapper phoneNumberUtilsWrapper,
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
@@ -160,6 +164,7 @@
         super(rootView);
 
         mContext = context;
+        mExpandCollapseListener = expandCollapseListener;
         mPhoneNumberUtilsWrapper = phoneNumberUtilsWrapper;
         mCallLogListItemHelper = callLogListItemHelper;
         mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
@@ -182,17 +187,20 @@
         quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
 
         primaryActionButtonView.setOnClickListener(this);
+        primaryActionView.setOnClickListener(mExpandCollapseListener);
     }
 
     public static CallLogListItemViewHolder create(
             View view,
             Context context,
+            View.OnClickListener expandCollapseListener,
             PhoneNumberUtilsWrapper phoneNumberUtilsWrapper,
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter) {
 
         return new CallLogListItemViewHolder(
                 context,
+                expandCollapseListener,
                 phoneNumberUtilsWrapper,
                 callLogListItemHelper,
                 voicemailPlaybackPresenter,
@@ -243,8 +251,17 @@
         bindActionButtons();
     }
 
-    public void updatePrimaryActionButton() {
-        if (TextUtils.isEmpty(voicemailUri)) {
+    private void updatePrimaryActionButton(boolean isExpanded) {
+        if (!TextUtils.isEmpty(voicemailUri)) {
+            // Treat as voicemail list item; show play button if not expanded.
+            if (!isExpanded) {
+                primaryActionButtonView.setImageResource(R.drawable.ic_play_arrow_24dp);
+                primaryActionButtonView.setVisibility(View.VISIBLE);
+            } else {
+                primaryActionButtonView.setVisibility(View.GONE);
+            }
+        } else {
+            // Treat as normal list item; show call button, if possible.
             boolean canPlaceCallToNumber =
                     PhoneNumberUtilsWrapper.canPlaceCallsTo(number, numberPresentation);
 
@@ -306,7 +323,8 @@
 
             Uri uri = Uri.parse(voicemailUri);
             mVoicemailPlaybackPresenter.setPlaybackView(
-                    voicemailPlaybackView, uri, false /* startPlayingImmediately */);
+                    voicemailPlaybackView, uri, mVoicemailPrimaryActionButtonClicked);
+            mVoicemailPrimaryActionButtonClicked = false;
 
             CallLogAsyncTaskUtil.markVoicemailAsRead(mContext, uri);
         } else {
@@ -356,6 +374,8 @@
                 actionsView.setVisibility(View.GONE);
             }
         }
+
+        updatePrimaryActionButton(show);
     }
 
     public void expandVoicemailTranscriptionView(boolean isExpanded) {
@@ -402,12 +422,17 @@
 
     @Override
     public void onClick(View view) {
-        final IntentProvider intentProvider = (IntentProvider) view.getTag();
-        if (intentProvider != null) {
-            final Intent intent = intentProvider.getIntent(mContext);
-            // See IntentProvider.getCallDetailIntentProvider() for why this may be null.
-            if (intent != null) {
-                DialerUtils.startActivityWithErrorToast(mContext, intent);
+        if (view.getId() == R.id.primary_action_button && !TextUtils.isEmpty(voicemailUri)) {
+            mVoicemailPrimaryActionButtonClicked = true;
+            mExpandCollapseListener.onClick(primaryActionView);
+        } else {
+            final IntentProvider intentProvider = (IntentProvider) view.getTag();
+            if (intentProvider != null) {
+                final Intent intent = intentProvider.getIntent(mContext);
+                // See IntentProvider.getCallDetailIntentProvider() for why this may be null.
+                if (intent != null) {
+                    DialerUtils.startActivityWithErrorToast(mContext, intent);
+                }
             }
         }
     }
@@ -421,6 +446,7 @@
 
         CallLogListItemViewHolder viewHolder = new CallLogListItemViewHolder(
                 context,
+                null /* expandCollapseListener */,
                 phoneNumberUtilsWrapper,
                 new CallLogListItemHelper(phoneCallDetailsHelper, resources),
                 null /* voicemailPlaybackPresenter */,
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index d47e9e2..cc64376 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -178,6 +178,18 @@
         mMediaPlayer.setOnCompletionListener(this);
     }
 
+    public void reset() {
+        pausePlayback();
+
+        mView = null;
+        mVoicemailUri = null;
+
+        mIsPrepared = false;
+        mIsPlaying = false;
+        mPosition = 0;
+        mDuration.set(0);
+    }
+
     /**
      * Specify the view which this presenter controls and the voicemail for playback.
      */
@@ -204,7 +216,6 @@
             mView.onSpeakerphoneOn(false);
 
             checkForContent();
-
         }
     }
 
@@ -341,7 +352,9 @@
         public void run() {
             if (mIsWaitingForResult.getAndSet(false)) {
                 mContext.getContentResolver().unregisterContentObserver(this);
-                mView.setFetchContentTimeout();
+                if (mView != null) {
+                    mView.setFetchContentTimeout();
+                }
             }
         }
 
@@ -384,7 +397,11 @@
      * and it will call {@link #onError()} otherwise.
      */
     private void prepareToPlayContent() {
+        if (mView == null) {
+            return;
+        }
         mIsPrepared = false;
+
         mView.setIsBuffering();
 
         try {
@@ -402,7 +419,11 @@
      */
     @Override
     public void onPrepared(MediaPlayer mp) {
+        if (mView == null) {
+            return;
+        }
         mIsPrepared = true;
+
         mDuration.set(mMediaPlayer.getDuration());
 
         mView.enableUiElements();
@@ -421,7 +442,7 @@
      */
     @Override
     public boolean onError(MediaPlayer mp, int what, int extra) {
-        handleError(new IllegalStateException("MediaPlayer error listener invoked"));
+        handleError(new IllegalStateException("MediaPlayer error listener invoked: " + extra));
         return true;
     }
 
diff --git a/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java b/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
index b3906f8..6f4b68b 100644
--- a/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
@@ -147,7 +147,7 @@
      */
     @MediumTest
     public void testCallViewIsNotVisibleForPrivateAndUnknownNumbers() {
-        final int SIZE = 100;
+        final int SIZE = 50;
         mList = new CallLogListItemViewHolder[SIZE];
 
         // Insert the first batch of entries.
@@ -320,7 +320,6 @@
         CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
                 mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
         bindViewForTest(viewHolder);
-        viewHolder.updatePrimaryActionButton();
 
         // The primaryActionView tag is set in the
         // {@link com.android.dialer.calllog.CallLogAdapter#bindView} method.  If it is possible
@@ -453,7 +452,6 @@
             }
         });
         getInstrumentation().waitForIdleSync();
-        viewHolder.updatePrimaryActionButton();
     }
 
     private void bindViewForTest(CallLogListItemViewHolder viewHolder) {