diff options
Diffstat (limited to 'src')
3 files changed, 64 insertions, 14 deletions
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java index 3c7e080b4..4304002da 100644 --- a/src/com/android/dialer/calllog/CallLogAdapter.java +++ b/src/com/android/dialer/calllog/CallLogAdapter.java @@ -116,9 +116,13 @@ public class CallLogAdapter extends GroupingListAdapter 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 @@ public class CallLogAdapter extends GroupingListAdapter CallLogListItemViewHolder viewHolder = CallLogListItemViewHolder.create( view, mContext, + mExpandCollapseListener, mPhoneNumberUtilsWrapper, mCallLogViewsHelper, mVoicemailPlaybackPresenter); @@ -297,7 +302,6 @@ public class CallLogAdapter extends GroupingListAdapter viewHolder.callLogEntryView.setAccessibilityDelegate(mAccessibilityDelegate); viewHolder.primaryActionView.setTag(viewHolder); - viewHolder.primaryActionView.setOnClickListener(mExpandCollapseListener); return viewHolder; } @@ -402,7 +406,6 @@ public class CallLogAdapter extends GroupingListAdapter 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 1d6a4340a..f54720b31 100644 --- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java +++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java @@ -145,8 +145,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder 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 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder super(rootView); mContext = context; + mExpandCollapseListener = expandCollapseListener; mPhoneNumberUtilsWrapper = phoneNumberUtilsWrapper; mCallLogListItemHelper = callLogListItemHelper; mVoicemailPlaybackPresenter = voicemailPlaybackPresenter; @@ -182,17 +187,20 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder 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 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder 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 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder 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 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder actionsView.setVisibility(View.GONE); } } + + updatePrimaryActionButton(show); } public void expandVoicemailTranscriptionView(boolean isExpanded) { @@ -402,12 +422,17 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder @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 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder 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 d47e9e213..cc6437627 100644 --- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java +++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java @@ -178,6 +178,18 @@ public class VoicemailPlaybackPresenter 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 @@ public class VoicemailPlaybackPresenter mView.onSpeakerphoneOn(false); checkForContent(); - } } @@ -341,7 +352,9 @@ public class VoicemailPlaybackPresenter public void run() { if (mIsWaitingForResult.getAndSet(false)) { mContext.getContentResolver().unregisterContentObserver(this); - mView.setFetchContentTimeout(); + if (mView != null) { + mView.setFetchContentTimeout(); + } } } @@ -384,7 +397,11 @@ public class VoicemailPlaybackPresenter * and it will call {@link #onError()} otherwise. */ private void prepareToPlayContent() { + if (mView == null) { + return; + } mIsPrepared = false; + mView.setIsBuffering(); try { @@ -402,7 +419,11 @@ public class VoicemailPlaybackPresenter */ @Override public void onPrepared(MediaPlayer mp) { + if (mView == null) { + return; + } mIsPrepared = true; + mDuration.set(mMediaPlayer.getDuration()); mView.enableUiElements(); @@ -421,7 +442,7 @@ public class VoicemailPlaybackPresenter */ @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; } |