Merge "Add ability to disable video conferencing." into nyc-mr1-dev
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 3ed8356..19b1d8a 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -71,6 +71,7 @@
         private boolean mIsVideoPresenceSupported;
         private boolean mIsVideoPauseSupported;
         private boolean mIsMergeCallSupported;
+        private boolean mIsVideoConferencingSupported;
 
         AccountEntry(Phone phone, boolean isEmergency, boolean isDummy) {
             mPhone = phone;
@@ -189,6 +190,7 @@
                 instantLetteringExtras = getPhoneAccountExtras();
             }
             mIsMergeCallSupported = isCarrierMergeCallSupported();
+            mIsVideoConferencingSupported = isCarrierVideoConferencingSupported();
 
             if (isEmergency && mContext.getResources().getBoolean(
                     R.bool.config_emergency_account_emergency_calls_only)) {
@@ -244,7 +246,8 @@
             // Check if IMS video pause is supported.
             PersistableBundle b =
                     PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
-            return b.getBoolean(CarrierConfigManager.KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL);
+            return b != null &&
+                    b.getBoolean(CarrierConfigManager.KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL);
         }
 
         /**
@@ -256,7 +259,8 @@
         private boolean isCarrierVideoPresenceSupported() {
             PersistableBundle b =
                     PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
-            return b.getBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL);
+            return b != null &&
+                    b.getBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL);
         }
 
         /**
@@ -267,7 +271,8 @@
         private boolean isCarrierInstantLetteringSupported() {
             PersistableBundle b =
                     PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
-            return b.getBoolean(CarrierConfigManager.KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL);
+            return b != null &&
+                    b.getBoolean(CarrierConfigManager.KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL);
         }
 
         /**
@@ -278,7 +283,8 @@
         private boolean isCarrierMergeCallSupported() {
             PersistableBundle b =
                     PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
-            return b.getBoolean(CarrierConfigManager.KEY_SUPPORT_CONFERENCE_CALL_BOOL);
+            return b != null &&
+                    b.getBoolean(CarrierConfigManager.KEY_SUPPORT_CONFERENCE_CALL_BOOL);
         }
 
         /**
@@ -289,7 +295,20 @@
         private boolean isCarrierEmergencyVideoCallsAllowed() {
             PersistableBundle b =
                     PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
-            return b.getBoolean(CarrierConfigManager.KEY_ALLOW_EMERGENCY_VIDEO_CALLS_BOOL);
+            return b != null &&
+                    b.getBoolean(CarrierConfigManager.KEY_ALLOW_EMERGENCY_VIDEO_CALLS_BOOL);
+        }
+
+        /**
+         * Determines from carrier config whether video conferencing is supported.
+         *
+         * @return {@code true} if video conferencing is supported, {@code false} otherwise.
+         */
+        private boolean isCarrierVideoConferencingSupported() {
+            PersistableBundle b =
+                    PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+            return b != null &&
+                    b.getBoolean(CarrierConfigManager.KEY_SUPPORT_VIDEO_CONFERENCE_CALL_BOOL);
         }
 
         /**
@@ -339,6 +358,14 @@
         public boolean isMergeCallSupported() {
             return mIsMergeCallSupported;
         }
+
+        /**
+         * Indicates whether this account supports video conferencing.
+         * @return {@code true} if the account supports video conferencing, {@code false} otherwise.
+         */
+        public boolean isVideoConferencingSupported() {
+            return mIsVideoConferencingSupported;
+        }
     }
 
     private OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =
@@ -430,6 +457,22 @@
     }
 
     /**
+     * Determines if the {@link AccountEntry} associated with a {@link PhoneAccountHandle} supports
+     * video conferencing.
+     *
+     * @param handle The {@link PhoneAccountHandle}.
+     * @return {@code True} if video conferencing is supported.
+     */
+    boolean isVideoConferencingSupported(PhoneAccountHandle handle) {
+        for (AccountEntry entry : mAccounts) {
+            if (entry.getPhoneAccountHandle().equals(handle)) {
+                return entry.isVideoConferencingSupported();
+            }
+        }
+        return false;
+    }
+
+    /**
      * @return Reference to the {@code TelecomAccountRegistry}'s subscription manager.
      */
     SubscriptionManager getSubscriptionManager() {
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 40e4ef9..c1d54d8 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -296,7 +296,7 @@
 
         final TelephonyConnection connection =
                 createConnectionFor(phone, null, true /* isOutgoing */, request.getAccountHandle(),
-                        request.getTelecomCallId(), request.getAddress());
+                        request.getTelecomCallId(), request.getAddress(), request.getVideoState());
         if (connection == null) {
             return Connection.createFailedConnection(
                     DisconnectCauseUtil.toTelecomDisconnectCause(
@@ -378,10 +378,15 @@
             return Connection.createCanceledConnection();
         }
 
+        // We should rely on the originalConnection to get the video state.  The request coming
+        // from Telecom does not know the video state of the incoming call.
+        int videoState = originalConnection != null ? originalConnection.getVideoState() :
+                VideoProfile.STATE_AUDIO_ONLY;
+
         Connection connection =
                 createConnectionFor(phone, originalConnection, false /* isOutgoing */,
                         request.getAccountHandle(), request.getTelecomCallId(),
-                        request.getAddress());
+                        request.getAddress(), videoState);
         if (connection == null) {
             return Connection.createCanceledConnection();
         } else {
@@ -478,11 +483,16 @@
             return Connection.createCanceledConnection();
         }
 
+        // We should rely on the originalConnection to get the video state.  The request coming
+        // from Telecom does not know the video state of the unknown call.
+        int videoState = unknownConnection != null ? unknownConnection.getVideoState() :
+                VideoProfile.STATE_AUDIO_ONLY;
+
         TelephonyConnection connection =
                 createConnectionFor(phone, unknownConnection,
                         !unknownConnection.isIncoming() /* isOutgoing */,
                         request.getAccountHandle(), request.getTelecomCallId(),
-                        request.getAddress());
+                        request.getAddress(), videoState);
 
         if (connection == null) {
             return Connection.createCanceledConnection();
@@ -546,7 +556,8 @@
             boolean isOutgoing,
             PhoneAccountHandle phoneAccountHandle,
             String telecomCallId,
-            Uri address) {
+            Uri address,
+            int videoState) {
         TelephonyConnection returnConnection = null;
         int phoneType = phone.getPhoneType();
         if (phoneType == TelephonyManager.PHONE_TYPE_GSM) {
@@ -564,9 +575,13 @@
                             phoneAccountHandle));
             boolean isEmergencyCall = (address != null && PhoneNumberUtils.isEmergencyNumber(
                     address.getSchemeSpecificPart()));
-            returnConnection.setConferenceSupported(!isEmergencyCall
-                    && TelecomAccountRegistry.getInstance(this).isMergeCallSupported(
-                            phoneAccountHandle));
+            boolean isVideoCall = VideoProfile.isVideo(videoState);
+            boolean isConferencingSupported = TelecomAccountRegistry.getInstance(this)
+                    .isMergeCallSupported(phoneAccountHandle);
+            boolean isVideoConferencingSupported = TelecomAccountRegistry.getInstance(this)
+                    .isVideoConferencingSupported(phoneAccountHandle);
+            returnConnection.setConferenceSupported(!isEmergencyCall && isConferencingSupported
+                    && (!isVideoCall || (isVideoCall && isVideoConferencingSupported)));
         }
         return returnConnection;
     }