Merge "Add EabProvider and EabControllerImpl"
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 9f04116..867a273 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -16,6 +16,7 @@
 
 package com.android.ims;
 
+import android.annotation.NonNull;
 import android.app.PendingIntent;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
@@ -41,6 +42,7 @@
 import android.telephony.ims.ImsService;
 import android.telephony.ims.ProvisioningManager;
 import android.telephony.ims.RegistrationManager;
+import android.telephony.ims.RtpHeaderExtensionType;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
 import android.telephony.ims.aidl.IImsConfig;
 import android.telephony.ims.aidl.IImsConfigCallback;
@@ -66,6 +68,7 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Set;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
@@ -2030,6 +2033,27 @@
     }
 
     /**
+     * Informs the {@link ImsService} of the {@link RtpHeaderExtensionType}s which the framework
+     * intends to use for incoming and outgoing calls.
+     * <p>
+     * See {@link RtpHeaderExtensionType} for more information.
+     * @param types The RTP header extension types to use for incoming and outgoing calls, or
+     *              empty list if none defined.
+     * @throws ImsException
+     */
+    public void setOfferedRtpHeaderExtensionTypes(@NonNull Set<RtpHeaderExtensionType> types)
+            throws ImsException {
+        MmTelFeatureConnection c = getOrThrowExceptionIfServiceUnavailable();
+
+        try {
+            c.changeOfferedRtpHeaderExtensionTypes(types);
+        } catch (RemoteException e) {
+            throw new ImsException("setOfferedRtpHeaderExtensionTypes()", e,
+                    ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+        }
+    }
+
+    /**
      * Creates a {@link ImsCall} to make a call.
      *
      * @param profile a call profile to make the call
diff --git a/src/java/com/android/ims/MmTelFeatureConnection.java b/src/java/com/android/ims/MmTelFeatureConnection.java
index a45efe4..cc7eace 100644
--- a/src/java/com/android/ims/MmTelFeatureConnection.java
+++ b/src/java/com/android/ims/MmTelFeatureConnection.java
@@ -24,6 +24,7 @@
 import android.telephony.TelephonyManager;
 import android.telephony.ims.ImsCallProfile;
 import android.telephony.ims.ImsService;
+import android.telephony.ims.RtpHeaderExtensionType;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
 import android.telephony.ims.aidl.IImsConfig;
 import android.telephony.ims.aidl.IImsConfigCallback;
@@ -44,6 +45,9 @@
 import com.android.ims.internal.IImsUt;
 import com.android.telephony.Rlog;
 
+import java.util.ArrayList;
+import java.util.Set;
+
 /**
  * A container of the IImsServiceController binder, which implements all of the ImsFeatures that
  * the platform currently supports: MMTel
@@ -342,6 +346,15 @@
         }
     }
 
+    public void changeOfferedRtpHeaderExtensionTypes(Set<RtpHeaderExtensionType> types)
+            throws RemoteException {
+        synchronized (mLock) {
+            checkServiceIsReady();
+            getServiceInterface(mBinder).changeOfferedRtpHeaderExtensionTypes(
+                    new ArrayList<>(types));
+        }
+    }
+
     public IImsCallSession createCallSession(ImsCallProfile profile)
             throws RemoteException {
         synchronized (mLock) {
diff --git a/src/java/com/android/ims/rcs/uce/UceController.java b/src/java/com/android/ims/rcs/uce/UceController.java
index b7ac41b..1983198 100644
--- a/src/java/com/android/ims/rcs/uce/UceController.java
+++ b/src/java/com/android/ims/rcs/uce/UceController.java
@@ -366,14 +366,14 @@
         if (uriList == null || c == null) {
             logw("requestCapabilities: parameter is empty");
             if (c != null) {
-                c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE);
+                c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
             }
             return;
         }
 
         if (isUnavailable()) {
             logw("requestCapabilities: controller is unavailable");
-            c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE);
+            c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
             return;
         }
 
@@ -392,14 +392,14 @@
         if (uri == null || c == null) {
             logw("requestCapabilities: parameter is empty");
             if (c != null) {
-                c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE);
+                c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
             }
             return;
         }
 
         if (isUnavailable()) {
             logw("requestAvailability: controller is unavailable");
-            c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE);
+            c.onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
             return;
         }
 
diff --git a/tests/src/com/android/ims/ImsFeatureContainerTest.java b/tests/src/com/android/ims/ImsFeatureContainerTest.java
index 77bc12d..e6a5997 100644
--- a/tests/src/com/android/ims/ImsFeatureContainerTest.java
+++ b/tests/src/com/android/ims/ImsFeatureContainerTest.java
@@ -19,7 +19,12 @@
 import static org.junit.Assert.assertEquals;
 
 import android.os.Parcel;
+import android.os.RemoteException;
+import android.telephony.ims.DelegateRequest;
 import android.telephony.ims.ImsService;
+import android.telephony.ims.aidl.ISipDelegate;
+import android.telephony.ims.aidl.ISipDelegateMessageCallback;
+import android.telephony.ims.aidl.ISipDelegateStateCallback;
 import android.telephony.ims.aidl.ISipTransport;
 import android.telephony.ims.feature.ImsFeature;
 import android.telephony.ims.feature.MmTelFeature;
@@ -40,7 +45,14 @@
     private ImsConfigImplBase mImsConfig = new ImsConfigImplBase();
     private ImsRegistrationImplBase mImsReg = new ImsRegistrationImplBase();
     private ISipTransport mSipTransport = new ISipTransport.Stub() {
-        // Add implementation once available
+        @Override
+        public void createSipDelegate(int subId, DelegateRequest request,
+                ISipDelegateStateCallback dc, ISipDelegateMessageCallback mc) {
+        }
+
+        @Override
+        public void destroySipDelegate(ISipDelegate delegate, int reason) {
+        }
     };
 
     @Test
diff --git a/tests/src/com/android/ims/rcs/uce/UceControllerTest.java b/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
index a53370b..63f399f 100644
--- a/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
+++ b/tests/src/com/android/ims/rcs/uce/UceControllerTest.java
@@ -135,7 +135,7 @@
         List<Uri> uriList = new ArrayList<>();
         uceController.requestCapabilities(uriList, mCapabilitiesCallback);
 
-        verify(mCapabilitiesCallback).onError(RcsUceAdapter.ERROR_GENERIC_FAILURE);
+        verify(mCapabilitiesCallback).onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
         verify(mTaskManager, never()).triggerCapabilityRequestTask(any(), any(), any());
     }
 
@@ -161,7 +161,7 @@
         Uri contact = Uri.fromParts("sip", "test", null);
         uceController.requestAvailability(contact, mCapabilitiesCallback);
 
-        verify(mCapabilitiesCallback).onError(RcsUceAdapter.ERROR_GENERIC_FAILURE);
+        verify(mCapabilitiesCallback).onError(RcsUceAdapter.ERROR_GENERIC_FAILURE, 0L);
         verify(mTaskManager, never()).triggerAvailabilityRequestTask(any(), any(), any());
     }