Merge "Fix bug where 00:00 duration is shown for voicemails without a duration."
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index 5bcfa6b..f331dd0 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -54,6 +54,7 @@
         MARK_VOICEMAIL_READ,
         MARK_CALL_READ,
         GET_CALL_DETAILS,
+        UPDATE_DURATION
     }
 
     private static final class CallDetailQuery {
@@ -413,6 +414,33 @@
         });
     }
 
+
+    /**
+     * 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<Void, Void, Void>() {
+            @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 be02e4c..7b149e2 100644
--- a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
@@ -326,7 +326,7 @@
             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 93ff002..2bb4de9 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -36,6 +36,7 @@
 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 @@
         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);
diff --git a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
index 4e00a46..c0d1203 100644
--- a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
@@ -158,7 +158,7 @@
 
     public void testVoicemailDuration_Zero() {
         setVoicemailPhoneCallDetailsWithDuration(0);
-        assertDurationExactEquals("00:00");
+        assertLocationAndDateExactEquals("Jun 3 at 1:00 PM");
     }
 
     public void testVoicemailDuration_EvenMinute() {