Merge "Rename Internet calling SIP calling" into lmp-dev
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 6d6ba5d..6a292c5 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -120,6 +120,17 @@
                 ConnectionService.VideoCallProvider videoCallProvider) {
             setVideoCallProvider(videoCallProvider);
         }
+
+        /**
+         * Used by the {@link com.android.internal.telephony.Connection} to report a change in the
+         * audio quality for the current call.
+         *
+         * @param audioQuality The audio quality.
+         */
+        @Override
+        public void onAudioQualityChanged(int audioQuality) {
+            setAudioQuality(audioQuality);
+        }
     };
 
     private com.android.internal.telephony.Connection mOriginalConnection;
@@ -127,7 +138,7 @@
 
     /**
      * Determines if the {@link TelephonyConnection} has local video capabilities.
-     * This is used when {@link TelephonyConnection#updateCallCapabilities(boolean)}} is called,
+     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called,
      * ensuring the appropriate {@link CallCapabilities} are set.  Since {@link CallCapabilities}
      * can be rebuilt at any time it is necessary to track the video capabilities between rebuild.
      * The {@link CallCapabilities} (including video capabilities) are communicated to the telecomm
@@ -137,7 +148,7 @@
 
     /**
      * Determines if the {@link TelephonyConnection} has remote video capabilities.
-     * This is used when {@link TelephonyConnection#updateCallCapabilities(boolean)}} is called,
+     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called,
      * ensuring the appropriate {@link CallCapabilities} are set.  Since {@link CallCapabilities}
      * can be rebuilt at any time it is necessary to track the video capabilities between rebuild.
      * The {@link CallCapabilities} (including video capabilities) are communicated to the telecomm
@@ -145,6 +156,13 @@
      */
     private boolean mRemoteVideoCapable;
 
+    /**
+     * Determines the current audio quality for the {@link TelephonyConnection}.
+     * This is used when {@link TelephonyConnection#updateCallCapabilities}} is called to indicate
+     * whether a call has the {@link android.telecomm.CallCapabilities#VoLTE} capability.
+     */
+    private int mAudioQuality;
+
     protected TelephonyConnection(com.android.internal.telephony.Connection originalConnection) {
         Log.v(this, "new TelephonyConnection, originalConnection: " + originalConnection);
         mOriginalConnection = originalConnection;
@@ -159,6 +177,7 @@
         setLocalVideoCapable(mOriginalConnection.isLocalVideoCapable());
         setRemoteVideoCapable(mOriginalConnection.isRemoteVideoCapable());
         setVideoCallProvider(mOriginalConnection.getVideoCallProvider());
+        setAudioQuality(mOriginalConnection.getAudioQuality());
 
         updateHandle();
     }
@@ -305,6 +324,7 @@
     protected final void updateCallCapabilities() {
         int newCallCapabilities = buildCallCapabilities();
         newCallCapabilities = applyVideoCapabilities(newCallCapabilities);
+        newCallCapabilities = applyAudioQualityCapabilities(newCallCapabilities);
 
         if (getCallCapabilities() != newCallCapabilities) {
             setCallCapabilities(newCallCapabilities);
@@ -464,20 +484,45 @@
     private int applyVideoCapabilities(int capabilities) {
         int currentCapabilities = capabilities;
         if (mRemoteVideoCapable) {
-            currentCapabilities |= CallCapabilities.SUPPORTS_VT_REMOTE;
+            currentCapabilities = applyCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_REMOTE);
         } else {
-            currentCapabilities &= ~CallCapabilities.SUPPORTS_VT_REMOTE;
+            currentCapabilities = removeCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_REMOTE);
         }
 
         if (mLocalVideoCapable) {
-            currentCapabilities |= CallCapabilities.SUPPORTS_VT_LOCAL;
+            currentCapabilities = applyCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_LOCAL);
         } else {
-            currentCapabilities &= ~CallCapabilities.SUPPORTS_VT_LOCAL;
+            currentCapabilities = removeCapability(currentCapabilities,
+                    CallCapabilities.SUPPORTS_VT_LOCAL);
         }
         return currentCapabilities;
     }
 
     /**
+     * Applies the audio capabilities to the {@code CallCapabilities} bit-mask.  A call with high
+     * definition audio is considered to have the {@code VoLTE} call capability as VoLTE uses high
+     * definition audio.
+     *
+     * @param callCapabilities The {@code CallCapabilities} bit-mask.
+     * @return The capabilities with the audio capabilities applied.
+     */
+    private int applyAudioQualityCapabilities(int callCapabilities) {
+        int currentCapabilities = callCapabilities;
+
+        if (mAudioQuality ==
+                com.android.internal.telephony.Connection.AUDIO_QUALITY_HIGH_DEFINITION) {
+            currentCapabilities = applyCapability(currentCapabilities, CallCapabilities.VoLTE);
+        } else {
+            currentCapabilities = removeCapability(currentCapabilities, CallCapabilities.VoLTE);
+        }
+
+        return currentCapabilities;
+    }
+
+    /**
      * Returns the local video capability state for the connection.
      *
      * @return {@code True} if the connection has local video capabilities.
@@ -517,6 +562,17 @@
         updateCallCapabilities();
     }
 
+    /**
+     * Sets the current call audio quality.  Used during rebuild of the
+     * {@link CallCapabilities} to set or unset the {@link CallCapabilities#VoLTE} capability.
+     *
+     * @param audioQuality The audio quality.
+     */
+    public void setAudioQuality(int audioQuality) {
+        mAudioQuality = audioQuality;
+        updateCallCapabilities();
+    }
+
     private static Uri getHandleFromAddress(String address) {
         // Address can be null for blocked calls.
         if (address == null) {
@@ -524,4 +580,28 @@
         }
         return Uri.fromParts(TelephonyConnectionService.SCHEME_TEL, address, null);
     }
+
+    /**
+     * Applies a capability to a capabilities bit-mask.
+     *
+     * @param capabilities The capabilities bit-mask.
+     * @param capability The capability to apply.
+     * @return The capabilities bit-mask with the capability applied.
+     */
+    private int applyCapability(int capabilities, int capability) {
+        int newCapabilities = capabilities | capability;
+        return newCapabilities;
+    }
+
+    /**
+     * Removes a capability from a capabilities bit-mask.
+     *
+     * @param capabilities The capabilities bit-mask.
+     * @param capability The capability to remove.
+     * @return The capabilities bit-mask with the capability removed.
+     */
+    private int removeCapability(int capabilities, int capability) {
+        int newCapabilities = capabilities & ~capability;
+        return newCapabilities;
+    }
 }