Merge "Call duration should be verbalized as hours, minutes, seconds." into lmp-mr1-dev
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index c70bd6e..4bc9855 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -32,6 +32,7 @@
 import android.telecom.VideoProfile;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
+import android.text.format.DateUtils;
 import android.view.Display;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -47,6 +48,7 @@
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.TextView;
+
 import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
 import com.android.contacts.common.widget.FloatingActionButtonController;
 import com.android.incallui.service.PhoneNumberService;
@@ -592,12 +594,15 @@
     }
 
     @Override
-    public void setPrimaryCallElapsedTime(boolean show, String callTimeElapsed) {
+    public void setPrimaryCallElapsedTime(boolean show, long duration) {
         if (show) {
             if (mElapsedTime.getVisibility() != View.VISIBLE) {
                 AnimUtils.fadeIn(mElapsedTime, AnimUtils.DEFAULT_DURATION);
             }
+            String callTimeElapsed = DateUtils.formatElapsedTime(duration / 1000);
+            String durationDescription = InCallDateUtils.formatDetailedDuration(duration);
             mElapsedTime.setText(callTimeElapsed);
+            mElapsedTime.setContentDescription(durationDescription);
         } else {
             // hide() animation has no effect if it is already hidden.
             AnimUtils.fadeOut(mElapsedTime, AnimUtils.DEFAULT_DURATION);
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index a039637..0d04f48 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -33,7 +33,6 @@
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
-import android.text.format.DateUtils;
 
 import com.android.incallui.ContactInfoCache.ContactCacheEntry;
 import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
@@ -226,7 +225,7 @@
         } else {
             Log.d(this, "Canceling the calltime timer");
             mCallTimer.cancel();
-            ui.setPrimaryCallElapsedTime(false, null);
+            ui.setPrimaryCallElapsedTime(false, 0);
         }
 
         // Set the call state
@@ -357,13 +356,13 @@
 
         if (ui == null || mPrimary == null || mPrimary.getState() != Call.State.ACTIVE) {
             if (ui != null) {
-                ui.setPrimaryCallElapsedTime(false, null);
+                ui.setPrimaryCallElapsedTime(false, 0);
             }
             mCallTimer.cancel();
         } else {
             final long callStart = mPrimary.getConnectTimeMillis();
             final long duration = System.currentTimeMillis() - callStart;
-            ui.setPrimaryCallElapsedTime(true, DateUtils.formatElapsedTime(duration / 1000));
+            ui.setPrimaryCallElapsedTime(true, duration);
         }
     }
 
@@ -734,7 +733,7 @@
         void setCallState(int state, int videoState, int sessionModificationState,
                 DisconnectCause disconnectCause, String connectionLabel,
                 Drawable connectionIcon, String gatewayNumber);
-        void setPrimaryCallElapsedTime(boolean show, String duration);
+        void setPrimaryCallElapsedTime(boolean show, long duration);
         void setPrimaryName(String name, boolean nameIsNumber);
         void setPrimaryImage(Drawable image);
         void setPrimaryPhoneNumber(String phoneNumber);
diff --git a/InCallUI/src/com/android/incallui/InCallDateUtils.java b/InCallUI/src/com/android/incallui/InCallDateUtils.java
new file mode 100644
index 0000000..88c5354
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallDateUtils.java
@@ -0,0 +1,56 @@
+package com.android.incallui;
+
+import android.content.res.Resources;
+
+/**
+ * Methods to parse time and date information in the InCallUi
+ */
+public class InCallDateUtils {
+    public InCallDateUtils() {
+
+    }
+
+    /**
+     * Return given duration in a human-friendly format. For example, "4
+     * minutes 3 seconds" or "3 hours 1 second". Returns the hours, minutes and seconds in that
+     * order if they exist.
+     */
+    public static String formatDetailedDuration(long millis) {
+        int hours = 0;
+        int minutes = 0;
+        int seconds = 0;
+        int elapsedSeconds = (int) (millis / 1000);
+        if (elapsedSeconds >= 3600) {
+            hours = elapsedSeconds / 3600;
+            elapsedSeconds -= hours * 3600;
+        }
+        if (elapsedSeconds >= 60) {
+            minutes = elapsedSeconds / 60;
+            elapsedSeconds -= minutes * 60;
+        }
+        seconds = elapsedSeconds;
+
+        final Resources res = Resources.getSystem();
+        StringBuilder duration = new StringBuilder();
+        if (hours > 0) {
+            duration.append(res.getQuantityString(
+                    com.android.internal.R.plurals.duration_hours, hours, hours));
+        }
+        if (minutes > 0) {
+            if (hours > 0) {
+                duration.append(' ');
+            }
+            duration.append(res.getQuantityString(
+                    com.android.internal.R.plurals.duration_minutes, minutes, minutes));
+        }
+        if (seconds > 0) {
+            if (hours > 0 || minutes > 0) {
+                duration.append(' ');
+            }
+            duration.append(res.getQuantityString(
+                    com.android.internal.R.plurals.duration_seconds, seconds, seconds));
+        }
+        return duration.toString();
+    }
+
+}