Introduce IMS Cross SIM registration

Introduce IMS Cross SIM registration

Bug: 171391883
Test: Build
Change-Id: Idd79a0a1f453a36587b89257e88437c96bf6ff4e
diff --git a/core/api/current.txt b/core/api/current.txt
index 2c095eb..99790b5 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -38764,6 +38764,7 @@
     field public static final int DIRECTION_UNKNOWN = -1; // 0xffffffff
     field public static final int PROPERTY_ASSISTED_DIALING = 512; // 0x200
     field public static final int PROPERTY_CONFERENCE = 1; // 0x1
+    field public static final int PROPERTY_CROSS_SIM = 16384; // 0x4000
     field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4
     field public static final int PROPERTY_ENTERPRISE_CALL = 32; // 0x20
     field public static final int PROPERTY_GENERIC_CONFERENCE = 2; // 0x2
@@ -39057,6 +39058,7 @@
     field public static final String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER";
     field public static final String EXTRA_SIP_INVITE = "android.telecom.extra.SIP_INVITE";
     field public static final int PROPERTY_ASSISTED_DIALING = 512; // 0x200
+    field public static final int PROPERTY_CROSS_SIM = 8192; // 0x2000
     field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 32; // 0x20
     field public static final int PROPERTY_HIGH_DEF_AUDIO = 4; // 0x4
     field public static final int PROPERTY_IS_ADHOC_CONFERENCE = 4096; // 0x1000
@@ -42577,6 +42579,7 @@
     method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
     method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
     method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
+    field public static final int ATTR_EPDG_OVER_CELL_INTERNET = 1; // 0x1
     field public static final int REGISTRATION_STATE_NOT_REGISTERED = 0; // 0x0
     field public static final int REGISTRATION_STATE_REGISTERED = 2; // 0x2
     field public static final int REGISTRATION_STATE_REGISTERING = 1; // 0x1
@@ -42584,8 +42587,10 @@
 
   public static class RegistrationManager.RegistrationCallback {
     ctor public RegistrationManager.RegistrationCallback();
-    method public void onRegistered(int);
-    method public void onRegistering(int);
+    method @Deprecated public void onRegistered(int);
+    method public void onRegistered(int, int);
+    method @Deprecated public void onRegistering(int);
+    method public void onRegistering(int, int);
     method public void onTechnologyChangeFailed(int, @NonNull android.telephony.ims.ImsReasonInfo);
     method public void onUnregistered(@NonNull android.telephony.ims.ImsReasonInfo);
   }
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 370751c..a562721 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -12150,6 +12150,7 @@
     field public static final String EXTRA_EXTENDING_TO_CONFERENCE_SUPPORTED = "android.telephony.ims.extra.EXTENDING_TO_CONFERENCE_SUPPORTED";
     field public static final String EXTRA_FORWARDED_NUMBER = "android.telephony.ims.extra.FORWARDED_NUMBER";
     field public static final String EXTRA_IS_CALL_PULL = "CallPull";
+    field public static final String EXTRA_IS_CROSS_SIM_CALL = "android.telephony.ims.extra.IS_CROSS_SIM_CALL";
     field public static final String EXTRA_LOCATION = "android.telephony.ims.extra.LOCATION";
     field public static final String EXTRA_OI = "oi";
     field public static final String EXTRA_OIR = "oir";
@@ -12292,6 +12293,8 @@
 
   @Deprecated public static class ImsMmTelManager.RegistrationCallback extends android.telephony.ims.RegistrationManager.RegistrationCallback {
     ctor @Deprecated public ImsMmTelManager.RegistrationCallback();
+    method @Deprecated public void onRegistered(int);
+    method @Deprecated public void onRegistering(int);
   }
 
   public final class ImsReasonInfo implements android.os.Parcelable {
@@ -12931,6 +12934,7 @@
     method public void triggerFullNetworkRegistration(@IntRange(from=100, to=699) int, @Nullable String);
     method public void triggerSipDelegateDeregistration();
     method public void updateSipDelegateRegistration();
+    field public static final int REGISTRATION_TECH_CROSS_SIM = 2; // 0x2
     field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1
     field public static final int REGISTRATION_TECH_LTE = 0; // 0x0
     field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 3a593b9..5715b31 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -292,6 +292,17 @@
     <!-- WFC, summary for Wi-Fi Only -->
     <string name="wfc_mode_wifi_only_summary">Wi-Fi only</string>
 
+    <!-- Template for showing mobile network operator name while Cross SIM calling is active -->
+    <string-array name="crossSimSpnFormats" translatable="false">
+        <item>@string/crossSimFormat_spn</item>
+        <item>@string/crossSimFormat_spn_cross_sim_calling</item>
+    </string-array>
+
+    <!-- Spn during Cross-SIM Calling: "<operator> " [CHAR LIMIT=NONE] -->
+    <string name="crossSimFormat_spn"><xliff:g id="spn" example="Operator">%s</xliff:g></string>
+    <!-- Spn during Cross SIM Calling: "<operator> Cross-SIM Calling" [CHAR LIMIT=NONE] -->
+    <string name="crossSimFormat_spn_cross_sim_calling"><xliff:g id="spn" example="Operator">%s</xliff:g> Cross-SIM Calling</string>
+
     <!--
         {0} is one of "bearerServiceCode*"
         {1} is dialing number
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 31b4edd..c2a3951 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -874,6 +874,7 @@
   <java-symbol type="string" name="wfc_mode_wifi_preferred_summary" />
   <java-symbol type="string" name="wfc_mode_cellular_preferred_summary" />
   <java-symbol type="string" name="wfc_mode_wifi_only_summary" />
+  <java-symbol type="array" name="crossSimSpnFormats" />
   <java-symbol type="string" name="policydesc_disableCamera" />
   <java-symbol type="string" name="policydesc_encryptedStorage" />
   <java-symbol type="string" name="policydesc_expirePassword" />
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 1238e7b..044ea80 100755
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -607,6 +607,11 @@
          */
         public static final int PROPERTY_IS_ADHOC_CONFERENCE = 0x00002000;
 
+        /**
+         * Connection is using Cross SIM Calling.
+         */
+        public static final int PROPERTY_CROSS_SIM = 0x00004000;
+
         //******************************************************************************************
         // Next PROPERTY value: 0x00004000
         //******************************************************************************************
@@ -798,6 +803,9 @@
             if (hasProperty(properties, PROPERTY_IS_ADHOC_CONFERENCE)) {
                 builder.append(" PROPERTY_IS_ADHOC_CONFERENCE");
             }
+            if (hasProperty(properties, PROPERTY_CROSS_SIM)) {
+                builder.append(" PROPERTY_CROSS_SIM");
+            }
             builder.append("]");
             return builder.toString();
         }
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 724a9e4..7a21b3a 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -527,9 +527,17 @@
      */
     public static final int PROPERTY_IS_ADHOC_CONFERENCE = 1 << 12;
 
+    /**
+     * Connection is using cross sim technology.
+     * <p>
+     * Indicates that the {@link Connection} is using a cross sim technology which would
+     * register IMS over internet APN of default data subscription.
+     * <p>
+     */
+    public static final int PROPERTY_CROSS_SIM = 1 << 13;
 
     //**********************************************************************************************
-    // Next PROPERTY value: 1<<13
+    // Next PROPERTY value: 1<<14
     //**********************************************************************************************
 
     /**
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index a6e870f..e96c5bdc 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -9953,6 +9953,8 @@
      * Valid return results are:
      *  - {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} for LTE registration,
      *  - {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN} for IWLAN registration, or
+     *  - {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM} for registration over
+     *  other sim's internet, or
      *  - {@link ImsRegistrationImplBase#REGISTRATION_TECH_NONE} if we are not registered or the
      *  result is unavailable.
      *  Use {@link ImsMmTelManager.RegistrationCallback} instead.
diff --git a/telephony/java/android/telephony/ims/ImsCallProfile.java b/telephony/java/android/telephony/ims/ImsCallProfile.java
index b15f4ed..1faae42 100644
--- a/telephony/java/android/telephony/ims/ImsCallProfile.java
+++ b/telephony/java/android/telephony/ims/ImsCallProfile.java
@@ -445,6 +445,15 @@
     public static final String EXTRA_FORWARDED_NUMBER =
             "android.telephony.ims.extra.FORWARDED_NUMBER";
 
+    /**
+     * Extra key with an {@code boolean} value which can be set in
+     * {@link #setCallExtraBoolean(String, boolean)} to indicate whether call is a cross sim call.
+     * <p>
+     * Valid values are true if call is cross sim call else false.
+     */
+    public static final String EXTRA_IS_CROSS_SIM_CALL =
+            "android.telephony.ims.extra.IS_CROSS_SIM_CALL";
+
     /** @hide */
     public int mServiceType;
     /** @hide */
diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java
index fe443f8..fcb4782 100644
--- a/telephony/java/android/telephony/ims/ImsMmTelManager.java
+++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java
@@ -716,6 +716,7 @@
      *
      * @param imsRegTech The IMS registration technology, can be one of the following:
      *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE},
+     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM},
      *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
      * @param capability The IMS MmTel capability to query, can be one of the following:
      *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
@@ -750,6 +751,7 @@
      *
      * @param imsRegTech The IMS registration technology, can be one of the following:
      *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE},
+     *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM},
      *         {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
      * @param capability The IMS MmTel capability to query, can be one of the following:
      *         {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
diff --git a/telephony/java/android/telephony/ims/ImsRcsManager.java b/telephony/java/android/telephony/ims/ImsRcsManager.java
index ad461c0..f39e30b 100644
--- a/telephony/java/android/telephony/ims/ImsRcsManager.java
+++ b/telephony/java/android/telephony/ims/ImsRcsManager.java
@@ -390,6 +390,7 @@
      * @param capability The RCS capability to query.
      * @param radioTech The radio tech that this capability failed for, defined as
      * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} or
+     * {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM} or
      * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}.
      * @return true if the RCS capability is capable for this subscription, false otherwise. This
      * does not necessarily mean that we are registered for IMS and the capability is available, but
diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java
index 1a78e16..8ed4838 100644
--- a/telephony/java/android/telephony/ims/RegistrationManager.java
+++ b/telephony/java/android/telephony/ims/RegistrationManager.java
@@ -24,6 +24,7 @@
 import android.annotation.RequiresPermission;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Bundle;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.ims.aidl.IImsRegistrationCallback;
 import android.telephony.ims.feature.ImsFeature;
@@ -70,6 +71,29 @@
      */
     int REGISTRATION_STATE_REGISTERED = 2;
 
+    /**
+     * @hide
+     */
+    // Defines the underlying radio technology type that we have registered for IMS over.
+    @IntDef(prefix = "ATTR_",
+            value = {
+                    ATTR_EPDG_OVER_CELL_INTERNET,
+            },
+            flag = true)
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ImsAttributes {}
+
+    /**
+     * Attribute to specify if EPDG tunnel is setup over cellular internet.
+     * if EPDG tunnel is setup over cellular internet then this bit will be set else the same will
+     * not be set.
+     */
+    int ATTR_EPDG_OVER_CELL_INTERNET = 0x00000001;
+
+    //******************************************************************************************
+    // Next attribute value: 0x00000002
+    //******************************************************************************************
+
 
     /**@hide*/
     // Translate ImsRegistrationImplBase API to new AccessNetworkConstant because WLAN
@@ -83,6 +107,11 @@
                         AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
                 put(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN,
                         AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
+                /* As the cross sim will be using ePDG tunnel over internet, it behaves
+                   like IWLAN in most cases. Hence setting the access type as IWLAN
+                 */
+                put(ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM,
+                        AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
             }};
 
     /**
@@ -96,6 +125,7 @@
 
             private final RegistrationCallback mLocalCallback;
             private Executor mExecutor;
+            private Bundle mBundle = new Bundle();
 
             RegistrationBinder(RegistrationCallback localCallback) {
                 mLocalCallback = localCallback;
@@ -107,8 +137,18 @@
 
                 final long callingIdentity = Binder.clearCallingIdentity();
                 try {
+                    mExecutor.execute(() -> {
+                        mLocalCallback.onRegistered(getAccessType(imsRadioTech));
+                    });
+                    int attributes = 0;
+                    if (imsRadioTech == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
+                        attributes = changeBitmask(attributes, ATTR_EPDG_OVER_CELL_INTERNET,
+                                true);
+                    }
+                    final int finalattributes = attributes;
                     mExecutor.execute(() ->
-                            mLocalCallback.onRegistered(getAccessType(imsRadioTech)));
+                            mLocalCallback.onRegistered(getAccessType(imsRadioTech),
+                                    finalattributes));
                 } finally {
                     restoreCallingIdentity(callingIdentity);
                 }
@@ -122,6 +162,15 @@
                 try {
                     mExecutor.execute(() ->
                             mLocalCallback.onRegistering(getAccessType(imsRadioTech)));
+                    int attributes = 0;
+                    if (imsRadioTech == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM) {
+                        attributes = changeBitmask(attributes, ATTR_EPDG_OVER_CELL_INTERNET,
+                                true);
+                    }
+                    final int finalattributes = attributes;
+                    mExecutor.execute(() ->
+                            mLocalCallback.onRegistering(getAccessType(imsRadioTech),
+                                    finalattributes));
                 } finally {
                     restoreCallingIdentity(callingIdentity);
                 }
@@ -175,6 +224,22 @@
                 }
                 return RegistrationManager.IMS_REG_TO_ACCESS_TYPE_MAP.get(regType);
             }
+
+            /**
+             * Changes a attribute bit-mask to add or remove an attribute.
+             *
+             * @param bitmask The bit-mask.
+             * @param bitfield The bit-field to change.
+             * @param enabled Whether the bit-field should be set or removed.
+             * @return The bit-mask with the bit-field changed.
+             */
+            private int changeBitmask(int bitmask, int bitfield, boolean enabled) {
+                if (enabled) {
+                    return bitmask | bitfield;
+                } else {
+                    return bitmask & ~bitfield;
+                }
+            }
         }
 
         private final RegistrationBinder mBinder = new RegistrationBinder(this);
@@ -183,19 +248,49 @@
          * Notifies the framework when the IMS Provider is registered to the IMS network.
          *
          * @param imsTransportType the radio access technology.
+         * @deprecated Use {@link #onRegistered(int, int)} instead.
          */
+        @Deprecated
         public void onRegistered(@AccessNetworkConstants.TransportType int imsTransportType) {
         }
 
         /**
+         * Notifies the framework when the IMS Provider is registered to the IMS network
+         * with corresponding attributes
+         *
+         * @param imsTransportType the radio access technology.
+         * @param registrationAttributes IMS registration attributes as a bitmap of attributes.
+         * Possible attributes are following
+         * <ul>
+         *     <li>{@link #ATTR_EPDG_OVER_CELL_INTERNET}</li>
+         * </ul>
+         *
+         */
+        public void onRegistered(@AccessNetworkConstants.TransportType int imsTransportType,
+                @ImsAttributes int registrationAttributes) {
+        }
+
+        /**
          * Notifies the framework when the IMS Provider is trying to register the IMS network.
          *
          * @param imsTransportType the radio access technology.
+         * @deprecated Use {@link #onRegistering(int, int)} instead.
          */
         public void onRegistering(@AccessNetworkConstants.TransportType int imsTransportType) {
         }
 
         /**
+         * Notifies the framework when the IMS Provider is trying to register the IMS network.
+         *
+         * @param imsTransportType the radio access technology.
+         * @param registrationAttributes IMS registration attributes as a bitmap of attributes.
+         * Possible attributes are following
+         */
+        public void onRegistering(@AccessNetworkConstants.TransportType int imsTransportType,
+                @ImsAttributes int registrationAttributes) {
+        }
+
+        /**
          * Notifies the framework when the IMS Provider is unregistered from the IMS network.
          *
          * @param info the {@link ImsReasonInfo} associated with why registration was disconnected.
diff --git a/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java b/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java
index 87a6873..c5b1c90 100644
--- a/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java
+++ b/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java
@@ -44,6 +44,7 @@
      * along with an associated technology, defined as
      * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} or
      * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
+     * {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM}
      */
     public static class CapabilityPair {
         private final int mCapability;
@@ -92,8 +93,9 @@
 
         /**
          * @return the stored radio technology, defined as
-         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} or
-         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
+         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE},
+         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN} or
+         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM}
          */
         public @ImsRegistrationImplBase.ImsRegistrationTech int getRadioTech() {
             return radioTech;
diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java
index 96ca022..f34c004 100644
--- a/telephony/java/android/telephony/ims/feature/ImsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java
@@ -199,8 +199,9 @@
          * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT}, or
          * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS}.
          * @param radioTech The radio tech that this capability failed for, defined as
-         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} or
-         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}.
+         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE},
+         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN} or
+         * {@link ImsRegistrationImplBase#REGISTRATION_TECH_CROSS_SIM}.
          * @param reason The reason this capability was unable to be changed, defined as
          * {@link #CAPABILITY_ERROR_GENERIC} or {@link #CAPABILITY_SUCCESS}.
          */
diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
index 088a7e2..4f753c3 100644
--- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
@@ -55,7 +55,8 @@
     @IntDef(value = {
                     REGISTRATION_TECH_NONE,
                     REGISTRATION_TECH_LTE,
-                    REGISTRATION_TECH_IWLAN
+                    REGISTRATION_TECH_IWLAN,
+                    REGISTRATION_TECH_CROSS_SIM
             })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ImsRegistrationTech {}
@@ -72,6 +73,11 @@
      */
     public static final int REGISTRATION_TECH_IWLAN = 1;
 
+    /**
+     * IMS is registered to IMS via internet over second subscription.
+     */
+    public static final int REGISTRATION_TECH_CROSS_SIM = 2;
+
     // Registration states, used to notify new ImsRegistrationImplBase#Callbacks of the current
     // state.
     // The unknown state is set as the initialization state. This is so that we do not call back
@@ -196,7 +202,8 @@
      * Notify the framework that the device is connected to the IMS network.
      *
      * @param imsRadioTech the radio access technology. Valid values are defined as
-     * {@link #REGISTRATION_TECH_LTE} and {@link #REGISTRATION_TECH_IWLAN}.
+     * {@link #REGISTRATION_TECH_LTE}, {@link #REGISTRATION_TECH_IWLAN} and
+     * {@link #REGISTRATION_TECH_CROSS_SIM}.
      */
     public final void onRegistered(@ImsRegistrationTech int imsRadioTech) {
         updateToState(imsRadioTech, RegistrationManager.REGISTRATION_STATE_REGISTERED);
@@ -214,7 +221,8 @@
      * Notify the framework that the device is trying to connect the IMS network.
      *
      * @param imsRadioTech the radio access technology. Valid values are defined as
-     * {@link #REGISTRATION_TECH_LTE} and {@link #REGISTRATION_TECH_IWLAN}.
+     * {@link #REGISTRATION_TECH_LTE}, {@link #REGISTRATION_TECH_IWLAN} and
+     * {@link #REGISTRATION_TECH_CROSS_SIM}.
      */
     public final void onRegistering(@ImsRegistrationTech int imsRadioTech) {
         updateToState(imsRadioTech, RegistrationManager.REGISTRATION_STATE_REGISTERING);
@@ -262,7 +270,8 @@
      * Notify the framework that the handover from the current radio technology to the technology
      * defined in {@code imsRadioTech} has failed.
      * @param imsRadioTech The technology that has failed to be changed. Valid values are
-     * {@link #REGISTRATION_TECH_LTE} and {@link #REGISTRATION_TECH_IWLAN}.
+     * {@link #REGISTRATION_TECH_LTE}, {@link #REGISTRATION_TECH_IWLAN} and
+     * {@link #REGISTRATION_TECH_CROSS_SIM}.
      * @param info The {@link ImsReasonInfo} for the failure to change technology.
      */
     public final void onTechnologyChangeFailed(@ImsRegistrationTech int imsRadioTech,
@@ -329,7 +338,8 @@
 
     /**
      * @return the current registration connection type. Valid values are
-     * {@link #REGISTRATION_TECH_LTE} and {@link #REGISTRATION_TECH_IWLAN}
+     * {@link #REGISTRATION_TECH_LTE}, {@link #REGISTRATION_TECH_IWLAN} and
+     * {@link #REGISTRATION_TECH_CROSS_SIM}.
      * @hide
      */
     @VisibleForTesting