IMS: Add support to display IMS related call logs.

1) Add config to enable/disable IMS call log.
2) Add IMS call type in call log activities.
3) Show "4G voice call" in call log details for VoLTE calls.

Change-Id: I5bc5f3651b27ed6a64d081188e45af492c72aa61
CRs-Fixed: 938465
diff --git a/InCallUI/res/values-mcc460-mnc00/qticonfig.xml b/InCallUI/res/values-mcc460-mnc00/qticonfig.xml
index 9adbd11..c0f6e217 100644
--- a/InCallUI/res/values-mcc460-mnc00/qticonfig.xml
+++ b/InCallUI/res/values-mcc460-mnc00/qticonfig.xml
@@ -35,4 +35,6 @@
     <bool name="config_display_data_usage_toast">false</bool>
     <!-- Config to show/hide call duration in call detail -->
     <bool name="call_duration_enabled">false</bool>
+    <!-- Config to enable/disable ims call log -->
+    <bool name="ims_call_type_enabled">true</bool>
 </resources>
diff --git a/InCallUI/res/values-mcc460-mnc02/qticonfig.xml b/InCallUI/res/values-mcc460-mnc02/qticonfig.xml
index 6115c7b..e2ba8a9 100644
--- a/InCallUI/res/values-mcc460-mnc02/qticonfig.xml
+++ b/InCallUI/res/values-mcc460-mnc02/qticonfig.xml
@@ -35,4 +35,6 @@
     <bool name="config_display_data_usage_toast">false</bool>
     <!-- Config to show/hide call duration in call detail -->
     <bool name="call_duration_enabled">false</bool>
+    <!-- Config to enable/disable ims call log -->
+    <bool name="ims_call_type_enabled">true</bool>
 </resources>
diff --git a/InCallUI/res/values-mcc460-mnc07/qticonfig.xml b/InCallUI/res/values-mcc460-mnc07/qticonfig.xml
index 9adbd11..c0f6e217 100644
--- a/InCallUI/res/values-mcc460-mnc07/qticonfig.xml
+++ b/InCallUI/res/values-mcc460-mnc07/qticonfig.xml
@@ -35,4 +35,6 @@
     <bool name="config_display_data_usage_toast">false</bool>
     <!-- Config to show/hide call duration in call detail -->
     <bool name="call_duration_enabled">false</bool>
+    <!-- Config to enable/disable ims call log -->
+    <bool name="ims_call_type_enabled">true</bool>
 </resources>
diff --git a/InCallUI/res/values-mcc460-mnc08/qticonfig.xml b/InCallUI/res/values-mcc460-mnc08/qticonfig.xml
index 9adbd11..c0f6e217 100644
--- a/InCallUI/res/values-mcc460-mnc08/qticonfig.xml
+++ b/InCallUI/res/values-mcc460-mnc08/qticonfig.xml
@@ -35,4 +35,6 @@
     <bool name="config_display_data_usage_toast">false</bool>
     <!-- Config to show/hide call duration in call detail -->
     <bool name="call_duration_enabled">false</bool>
+    <!-- Config to enable/disable ims call log -->
+    <bool name="ims_call_type_enabled">true</bool>
 </resources>
diff --git a/InCallUI/res/values/qticonfig.xml b/InCallUI/res/values/qticonfig.xml
index 557fa90..259454c 100644
--- a/InCallUI/res/values/qticonfig.xml
+++ b/InCallUI/res/values/qticonfig.xml
@@ -42,4 +42,6 @@
     <bool name="def_incallui_clearcode_enabled">false</bool>
     <!-- Config to show/hide call duration in call detail -->
     <bool name="call_duration_enabled">true</bool>
+    <!-- Config to enable/disable ims call log -->
+    <bool name="ims_call_type_enabled">false</bool>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 200b6fe..9682095 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -110,6 +110,9 @@
     <string name="type_incoming_video" msgid="82323391702796181">"视频通话来电"</string>
     <string name="type_outgoing_video" msgid="2858140021680755266">"拨出的视频通话"</string>
     <string name="type_missed_video" msgid="954396897034220545">"错过的视频通话"</string>
+    <string name="type_incoming_volte">4G语音通话来电</string>
+    <string name="type_outgoing_volte">外拨4G语音通话</string>
+    <string name="type_missed_volte">未接4G语音通话</string>
     <string name="type_voicemail" msgid="5153139450668549908">"语音信箱"</string>
     <string name="type_rejected" msgid="7783201828312472691">"拒接的来电"</string>
     <string name="type_blocked" msgid="3521686227115330015">"屏蔽的来电"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cb85684..c2fe867 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -365,6 +365,15 @@
     <!-- Title for missed video call in call details screen [CHAR LIMIT=60] -->
     <string name="type_missed_video">Missed video call</string>
 
+    <!-- Title for incoming 4G voice call in call details screen [CHAR LIMIT=60] -->
+    <string name="type_incoming_volte">Incoming 4G voice call</string>
+
+    <!-- Title for outgoing 4G voice call in call details screen [CHAR LIMIT=60] -->
+    <string name="type_outgoing_volte">Outgoing 4G voice call</string>
+
+    <!-- Title for missed 4G voice call in call details screen [CHAR LIMIT=60] -->
+    <string name="type_missed_volte">Missed 4G voice call</string>
+
     <!-- Title for voicemail details screen -->
     <string name="type_voicemail">Voicemail</string>
 
diff --git a/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java b/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
index 8af66af..85039f7 100644
--- a/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
+++ b/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
@@ -20,6 +20,7 @@
 import android.provider.CallLog.Calls;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -30,6 +31,7 @@
 import com.android.dialer.PhoneCallDetails;
 import com.android.dialer.R;
 import com.android.dialer.util.DialerUtils;
+import com.android.dialer.util.AppCompatConstants;
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
@@ -107,10 +109,30 @@
         int callType = details.callTypes[0];
         boolean isVideoCall = (details.features & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO
                 && CallUtil.isVideoEnabled(mContext);
-
+        boolean isVoLTE = (callType == AppCompatConstants.INCOMING_IMS_TYPE) ||
+                          (callType == AppCompatConstants.OUTGOING_IMS_TYPE) ||
+                          (callType == AppCompatConstants.MISSED_IMS_TYPE);
+        Log.d("CallDetailHistoryAdapter", "isVideoCall = " + isVideoCall
+                    + ", isVoLTE = " + isVoLTE);
         callTypeIconView.clear();
         callTypeIconView.add(callType);
         callTypeIconView.setShowVideo(isVideoCall);
+        boolean imsCallLogEnabled = mContext.getResources()
+                .getBoolean(R.bool.ims_call_type_enabled);
+        if (!imsCallLogEnabled && isVoLTE) {
+            switch (callType) {
+                case AppCompatConstants.INCOMING_IMS_TYPE:
+                    callType = Calls.INCOMING_TYPE;
+                    break;
+                case AppCompatConstants.OUTGOING_IMS_TYPE:
+                    callType = Calls.OUTGOING_TYPE;
+                    break;
+                case AppCompatConstants.MISSED_IMS_TYPE:
+                    callType = Calls.MISSED_TYPE;
+                    break;
+                default:
+            }
+        }
         callTypeTextView.setText(mCallTypeHelper.getCallTypeText(callType, isVideoCall));
         // Set the date.
         CharSequence dateValue = DateUtils.formatDateRange(mContext, details.date, details.date,
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index cf86bad..853767b 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -195,13 +195,32 @@
         }
 
         if (callType > CALL_TYPE_ALL) {
-            where.append(" AND (").append(Calls.TYPE).append(" = ?)");
+            if (where.length() > 0) {
+                where.append(" AND ");
+            }
+
+            if ((callType == Calls.INCOMING_TYPE) || (callType == Calls.OUTGOING_TYPE)
+                    || (callType == Calls.MISSED_TYPE)) {
+                where.append(String.format("(%s = ? OR %s = ?)",
+                        Calls.TYPE, Calls.TYPE));
+            } else {
+                where.append(String.format("(%s = ?)", Calls.TYPE));
+            }
             selectionArgs.add(Integer.toString(callType));
+            if (callType == Calls.INCOMING_TYPE) {
+                selectionArgs.add(Integer.toString(AppCompatConstants.INCOMING_IMS_TYPE));
+            } else if (callType == Calls.OUTGOING_TYPE) {
+                selectionArgs.add(Integer.toString(AppCompatConstants.OUTGOING_IMS_TYPE));
+            } else if (callType == Calls.MISSED_TYPE) {
+                selectionArgs.add(Integer.toString(AppCompatConstants.MISSED_IMS_TYPE));
+            }
         } else {
+            // Add a clause to fetch only items of type voicemail.
             where.append(" AND NOT ");
             where.append("(" + Calls.TYPE + " = " + AppCompatConstants.CALLS_VOICEMAIL_TYPE + ")");
         }
 
+        // Add a clause to fetch only items newer than the requested date
         if (newerThan > 0) {
             where.append(" AND (").append(Calls.DATE).append(" > ?)");
             selectionArgs.add(Long.toString(newerThan));
diff --git a/src/com/android/dialer/calllog/CallTypeHelper.java b/src/com/android/dialer/calllog/CallTypeHelper.java
index acc114c..10736b2 100644
--- a/src/com/android/dialer/calllog/CallTypeHelper.java
+++ b/src/com/android/dialer/calllog/CallTypeHelper.java
@@ -37,6 +37,12 @@
     private final CharSequence mOutgoingVideoName;
     /** Name used to identify missed video calls. */
     private final CharSequence mMissedVideoName;
+    /** Name used to identify incoming video calls. */
+    private final CharSequence mIncomingVoLTEName;
+    /** Name used to identify outgoing video calls. */
+    private final CharSequence mOutgoingVoLTEName;
+    /** Name used to identify missed video calls. */
+    private final CharSequence mMissedVoLTEName;
     /** Name used to identify voicemail calls. */
     private final CharSequence mVoicemailName;
     /** Name used to identify rejected calls. */
@@ -56,6 +62,9 @@
         mIncomingVideoName = resources.getString(R.string.type_incoming_video);
         mOutgoingVideoName = resources.getString(R.string.type_outgoing_video);
         mMissedVideoName = resources.getString(R.string.type_missed_video);
+        mIncomingVoLTEName = resources.getString(R.string.type_incoming_volte);
+        mOutgoingVoLTEName = resources.getString(R.string.type_outgoing_volte);
+        mMissedVoLTEName = resources.getString(R.string.type_missed_volte);
         mVoicemailName = resources.getString(R.string.type_voicemail);
         mRejectedName = resources.getString(R.string.type_rejected);
         mBlockedName = resources.getString(R.string.type_blocked);
@@ -73,6 +82,13 @@
                     return mIncomingName;
                 }
 
+            case AppCompatConstants.INCOMING_IMS_TYPE:
+                if (isVideoCall) {
+                    return mIncomingVideoName;
+                } else {
+                    return mIncomingVoLTEName;
+                }
+
             case AppCompatConstants.CALLS_OUTGOING_TYPE:
                 if (isVideoCall) {
                     return mOutgoingVideoName;
@@ -80,6 +96,13 @@
                     return mOutgoingName;
                 }
 
+            case AppCompatConstants.OUTGOING_IMS_TYPE:
+                if (isVideoCall) {
+                    return mOutgoingVideoName;
+                } else {
+                    return mOutgoingVoLTEName;
+                }
+
             case AppCompatConstants.CALLS_MISSED_TYPE:
                 if (isVideoCall) {
                     return mMissedVideoName;
@@ -87,6 +110,13 @@
                     return mMissedName;
                 }
 
+            case AppCompatConstants.MISSED_IMS_TYPE:
+                if (isVideoCall) {
+                    return mMissedVideoName;
+                } else {
+                    return mMissedVoLTEName;
+                }
+
             case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
                 return mVoicemailName;
 
@@ -105,14 +135,17 @@
     public Integer getHighlightedColor(int callType) {
         switch (callType) {
             case AppCompatConstants.CALLS_INCOMING_TYPE:
+            case AppCompatConstants.INCOMING_IMS_TYPE:
                 // New incoming calls are not highlighted.
                 return null;
 
             case AppCompatConstants.CALLS_OUTGOING_TYPE:
+            case AppCompatConstants.OUTGOING_IMS_TYPE:
                 // New outgoing calls are not highlighted.
                 return null;
 
             case AppCompatConstants.CALLS_MISSED_TYPE:
+            case AppCompatConstants.MISSED_IMS_TYPE:
                 return mNewMissedColor;
 
             case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
@@ -129,6 +162,8 @@
     public static boolean isMissedCallType(int callType) {
         return (callType != AppCompatConstants.CALLS_INCOMING_TYPE
                 && callType != AppCompatConstants.CALLS_OUTGOING_TYPE
+                && callType != AppCompatConstants.INCOMING_IMS_TYPE
+                && callType != AppCompatConstants.OUTGOING_IMS_TYPE
                 && callType != AppCompatConstants.CALLS_VOICEMAIL_TYPE);
     }
 }
diff --git a/src/com/android/dialer/calllog/CallTypeIconsView.java b/src/com/android/dialer/calllog/CallTypeIconsView.java
index 1474843..b272ff6 100644
--- a/src/com/android/dialer/calllog/CallTypeIconsView.java
+++ b/src/com/android/dialer/calllog/CallTypeIconsView.java
@@ -110,10 +110,13 @@
     private Drawable getCallTypeDrawable(int callType) {
         switch (callType) {
             case AppCompatConstants.CALLS_INCOMING_TYPE:
+            case AppCompatConstants.INCOMING_IMS_TYPE:
                 return sResources.incoming;
             case AppCompatConstants.CALLS_OUTGOING_TYPE:
+            case AppCompatConstants.OUTGOING_IMS_TYPE:
                 return sResources.outgoing;
             case AppCompatConstants.CALLS_MISSED_TYPE:
+            case AppCompatConstants.MISSED_IMS_TYPE:
                 return sResources.missed;
             case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
                 return sResources.voicemail;
diff --git a/src/com/android/dialer/util/AppCompatConstants.java b/src/com/android/dialer/util/AppCompatConstants.java
index 1d52eee..15c1460 100644
--- a/src/com/android/dialer/util/AppCompatConstants.java
+++ b/src/com/android/dialer/util/AppCompatConstants.java
@@ -27,4 +27,7 @@
     public static final int CALLS_REJECTED_TYPE = 5;
     // Added to android.provider.CallLog.Calls in N+.
     public static final int CALLS_BLOCKED_TYPE = 6;
+    public static final int INCOMING_IMS_TYPE = 8;
+    public static final int OUTGOING_IMS_TYPE = 9;
+    public static final int MISSED_IMS_TYPE = 10;
 }