From 6d8399afae309207237456c27b336d948ed912ff Mon Sep 17 00:00:00 2001 From: Sarmad Hashmi Date: Wed, 10 Feb 2016 17:41:12 -0800 Subject: Fix bug where 00:00 duration is shown for voicemails without a duration. Instead of showing a 00:00 duration, nothing is displayed. When the content is loaded, the duration field for the call log entry associated with the voicemail is updated with the duration fetched from the mediaplayer. The proper duration is then displayed in MM:SS format. BUG=24175525 Change-Id: I1cafebae4fcbc749f573accfcf8833b598675f0b (cherry picked from commit 6f3016d9065564bf09a5759f16563a05abbe105d) --- .../dialer/calllog/CallLogAsyncTaskUtil.java | 28 ++++++++++++++++++++++ .../dialer/calllog/PhoneCallDetailsHelper.java | 2 +- .../voicemail/VoicemailPlaybackPresenter.java | 7 ++++++ 3 files changed, 36 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java index bb7bdbd0a..df6dc7de4 100644 --- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java +++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java @@ -52,6 +52,7 @@ public class CallLogAsyncTaskUtil { DELETE_BLOCKED_CALL, MARK_VOICEMAIL_READ, GET_CALL_DETAILS, + UPDATE_DURATION } private static final class CallDetailQuery { @@ -379,6 +380,33 @@ public class CallLogAsyncTaskUtil { }); } + + /** + * Updates the duration of a voicemail call log entry. + */ + public static void updateVoicemailDuration( + final Context context, + final Uri voicemailUri, + final int duration) { + if (!PermissionsUtil.hasPhonePermissions(context)) { + return; + } + + if (sAsyncTaskExecutor == null) { + initTaskExecutor(); + } + + sAsyncTaskExecutor.submit(Tasks.UPDATE_DURATION, new AsyncTask() { + @Override + public Void doInBackground(Void... params) { + ContentValues values = new ContentValues(1); + values.put(CallLog.Calls.DURATION, duration); + context.getContentResolver().update(voicemailUri, values, null, null); + return null; + } + }); + } + @VisibleForTesting public static void resetForTest() { sAsyncTaskExecutor = null; diff --git a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java index be02e4c1b..7b149e24e 100644 --- a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java +++ b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java @@ -326,7 +326,7 @@ public class PhoneCallDetailsHelper { text = dateText; } - if (details.callTypes[0] == Calls.VOICEMAIL_TYPE) { + if (details.callTypes[0] == Calls.VOICEMAIL_TYPE && details.duration > 0) { views.callLocationAndDate.setText(mResources.getString( R.string.voicemailCallLogDateTimeFormatWithDuration, text, getVoicemailDuration(details))); diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java index 93ff00270..2bb4de932 100644 --- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java +++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java @@ -36,6 +36,7 @@ import android.view.WindowManager.LayoutParams; import android.widget.SeekBar; import com.android.dialer.R; +import com.android.dialer.calllog.CallLogAsyncTaskUtil; import com.android.dialer.util.AsyncTaskExecutor; import com.android.dialer.util.AsyncTaskExecutors; import com.android.common.io.MoreCloseables; @@ -557,6 +558,12 @@ public class VoicemailPlaybackPresenter implements MediaPlayer.OnPreparedListene Log.d(TAG, "onPrepared"); mIsPrepared = true; + // Update the duration in the database if it was not previously retrieved + if (mDuration.get() == 0) { + CallLogAsyncTaskUtil.updateVoicemailDuration(mContext, mVoicemailUri, + mMediaPlayer.getDuration() / 1000); + } + mDuration.set(mMediaPlayer.getDuration()); Log.d(TAG, "onPrepared: mPosition=" + mPosition); -- cgit v1.2.3