IMS: Handle incoming conference call

Show Incoming conference call on UI when incoming conference call
is received.

Change-Id: I5701624712122b876e0e284217d3c0aa8a0e6351
CRs-Fixed: 992617
diff --git a/InCallUI/res/values/qtistrings.xml b/InCallUI/res/values/qtistrings.xml
index 963276e..c926b57 100644
--- a/InCallUI/res/values/qtistrings.xml
+++ b/InCallUI/res/values/qtistrings.xml
@@ -30,7 +30,7 @@
   -->
 
 <!-- The xml contains Qti specific resource strings neede for any value added features. -->
-<resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Dtermine whether emergency calls should be marked. -->
     <bool name="mark_emergency_call">true</bool>
     <!-- Call substate label -->
@@ -133,4 +133,14 @@
     <string name="session_modify_cause_downgrade_lipsync">Call downgraded due to lipsync</string>
     <!-- Session modify cause code downgrade generic error -->
     <string name="session_modify_cause_downgrade_generic_error">Call downgraded due to generic error</string>
+
+    <!-- In-call screen: status label for an incoming conference call [CHAR LIMIT=25] -->
+    <string name="card_title_incoming_conf_call">Incoming conference call</string>
+    <!-- In-call screen: status label for an incoming video conference call [CHAR LIMIT=25] -->
+    <string name="card_title_incoming_video_conf_call">Incoming video conference</string>
+    <!-- The "label" of the in-call Notification for an incoming conference ringing call. [CHAR LIMIT=60] -->
+    <string name="notification_incoming_conf_call">Incoming conference call</string>
+    <!-- Title displayed in the overlay for incoming conference calls which include the name of the provider.
+         [CHAR LIMIT=40] -->
+    <string name="incoming_conf_via_template">Incoming conference via <xliff:g id="provider_name">%s</xliff:g></string>
 </resources>
diff --git a/InCallUI/src/com/android/incallui/Call.java b/InCallUI/src/com/android/incallui/Call.java
index 5ba8ab5..5717fe4 100644
--- a/InCallUI/src/com/android/incallui/Call.java
+++ b/InCallUI/src/com/android/incallui/Call.java
@@ -988,4 +988,16 @@
     public String toSimpleString() {
         return super.toString();
     }
+
+    public boolean isIncomingConfCall() {
+        int callState = getState();
+        if (callState == State.INCOMING || callState == State.CALL_WAITING) {
+            Bundle extras = getExtras();
+            boolean incomingConf = (extras == null)? false :
+                    extras.getBoolean(QtiImsExtUtils.QTI_IMS_INCOMING_CONF_EXTRA_KEY, false);
+            Log.d(this, "isIncomingConfCall = " + incomingConf);
+            return incomingConf;
+        }
+        return false;
+    }
 }
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index 2bca6f2..c46e472 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -1197,7 +1197,17 @@
                 break;
             case Call.State.INCOMING:
             case Call.State.CALL_WAITING:
-                if (isWifi && hasSuggestedLabel) {
+                if (isConference) {
+                    if (isAccount) {
+                        callStateLabel = context.getString(
+                                R.string.incoming_conf_via_template, label);
+                    } else if (VideoUtils.isVideoCall(videoState)) {
+                        callStateLabel = context.getString(
+                                R.string.card_title_incoming_video_conf_call);
+                    } else {
+                        callStateLabel = context.getString(R.string.card_title_incoming_conf_call);
+                    }
+                } else if (isWifi && hasSuggestedLabel) {
                     callStateLabel = label;
                 } else if (isAccount) {
                     callStateLabel = context.getString(R.string.incoming_via_template, label);
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 8b2a4ab..7bc7b8f 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -443,6 +443,7 @@
                     || (mPrimaryContactInfo == null ? false
                             : mPrimaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
             InCallPresenter.getInstance().setThemeColors();
+            boolean isConfCall = mPrimary.isConferenceCall() || mPrimary.isIncomingConfCall();
             getUi().setCallState(
                     mPrimary.getState(),
                     mPrimary.getVideoState(),
@@ -452,7 +453,7 @@
                     getCallStateIcon(),
                     getGatewayNumber(),
                     mPrimary.hasProperty(Details.PROPERTY_WIFI),
-                    mPrimary.isConferenceCall(),
+                    isConfCall,
                     isWorkCall);
 
             maybeShowHdAudioIcon();
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index b6bb45a..1a6fa96 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -588,7 +588,9 @@
         }
 
         if (isIncomingOrWaiting) {
-            if (call.hasProperty(Details.PROPERTY_WIFI)) {
+            if (call.isIncomingConfCall()) {
+                resId = R.string.notification_incoming_conf_call;
+            } else if (call.hasProperty(Details.PROPERTY_WIFI)) {
                 resId = R.string.notification_incoming_call_wifi;
             } else {
                 resId = R.string.notification_incoming_call;