Merge "IMS : Deprecate simless RTT APIs from QtiImsExtUtils"
diff --git a/extphone/src/com/qti/extphone/CiwlanConfig.aidl b/extphone/src/com/qti/extphone/CiwlanConfig.aidl
new file mode 100644
index 0000000..c0d5380
--- /dev/null
+++ b/extphone/src/com/qti/extphone/CiwlanConfig.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+parcelable CiwlanConfig;
diff --git a/extphone/src/com/qti/extphone/CiwlanConfig.java b/extphone/src/com/qti/extphone/CiwlanConfig.java
new file mode 100644
index 0000000..6bd5ea0
--- /dev/null
+++ b/extphone/src/com/qti/extphone/CiwlanConfig.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class CiwlanConfig implements Parcelable {
+
+    private static final String TAG = "CiwlanConfig";
+
+    public static final int INVALID = -1;
+    public static final int ONLY = 0;
+    public static final int PREFERRED = 1;
+
+    private int mHomeMode = INVALID;
+    private int mRoamMode = INVALID;
+
+    public CiwlanConfig(int homeMode, int roamMode) {
+        mHomeMode = homeMode;
+        mRoamMode = roamMode;
+    }
+
+    public CiwlanConfig(Parcel in) {
+        mHomeMode = in.readInt();
+        mRoamMode = in.readInt();
+    }
+
+    public String getHomeCiwlanMode() {
+        switch (mHomeMode) {
+            case ONLY:
+                return "ONLY";
+            case PREFERRED:
+                return "PREFERRED";
+            default:
+                return "INVALID";
+        }
+    }
+
+    public String getRoamCiwlanMode() {
+        switch (mRoamMode) {
+            case ONLY:
+                return "ONLY";
+            case PREFERRED:
+                return "PREFERRED";
+            default:
+                return "INVALID";
+        }
+    }
+
+    public boolean isCiwlanOnlyInHome() {
+        return mHomeMode == ONLY;
+    }
+
+    public boolean isCiwlanOnlyInRoam() {
+        return mRoamMode == ONLY;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mHomeMode);
+        out.writeInt(mRoamMode);
+    }
+
+    public static final Parcelable.Creator<CiwlanConfig> CREATOR = new Parcelable.Creator() {
+        @Override
+        public CiwlanConfig createFromParcel(Parcel in) {
+            return new CiwlanConfig(in);
+        }
+
+        @Override
+        public CiwlanConfig[] newArray(int size) {
+            return new CiwlanConfig[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        return TAG + " homeMode = " + getHomeCiwlanMode() + ", roamMode = " + getRoamCiwlanMode();
+    }
+}
diff --git a/extphone/src/com/qti/extphone/DualDataRecommendation.aidl b/extphone/src/com/qti/extphone/DualDataRecommendation.aidl
new file mode 100644
index 0000000..5c3d8f9
--- /dev/null
+++ b/extphone/src/com/qti/extphone/DualDataRecommendation.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+parcelable DualDataRecommendation;
diff --git a/extphone/src/com/qti/extphone/DualDataRecommendation.java b/extphone/src/com/qti/extphone/DualDataRecommendation.java
new file mode 100644
index 0000000..c39282b
--- /dev/null
+++ b/extphone/src/com/qti/extphone/DualDataRecommendation.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class DualDataRecommendation implements Parcelable {
+
+    private static final String TAG = "DualDataRecommendation";
+
+    // Recommended SUB
+    public static final int DDS = 1;
+    public static final int NON_DDS = 2;
+
+    // Action
+    public static final int ACTION_DATA_NOT_ALLOW = 0;
+    public static final int ACTION_DATA_ALLOW = 1;
+
+    private int mSub;
+    private int mAction;
+
+    public DualDataRecommendation(int sub, int action) {
+        mSub = sub;
+        mAction = action;
+    }
+
+    public DualDataRecommendation(Parcel in) {
+        mSub = in.readInt();
+        mAction = in.readInt();
+    }
+
+    public int getRecommendedSub() {
+        return mSub;
+    }
+
+    public int getAction() {
+        return mAction;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mSub);
+        out.writeInt(mAction);
+    }
+
+    public static final Parcelable.Creator<DualDataRecommendation> CREATOR
+            = new Parcelable.Creator() {
+        public DualDataRecommendation createFromParcel(Parcel in) {
+            return new DualDataRecommendation(in);
+        }
+
+        public DualDataRecommendation[] newArray(int size) {
+            return new DualDataRecommendation[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        return TAG + ": getRecommendedSub(): " + getRecommendedSub()
+                + " getAction: " + getAction();
+    }
+}
diff --git a/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java b/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java
index 3f1eb65..c27237c 100644
--- a/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java
+++ b/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java
@@ -71,6 +71,7 @@
     public static final int EVENT_SET_SMART_DDS_SWITCH_TOGGLE_RESPONSE = 35;
     public static final int EVENT_START_NETWORK_SCAN_RESPONSE = 36;
     public static final int EVENT_STOP_NETWORK_SCAN_RESPONSE = 37;
+    public static final int EVENT_ON_CIWLAN_CAPABILITY_CHANGE = 38;
 
     private Handler mHandler;
     IExtPhoneCallback mCallback = new IExtPhoneCallbackStub(this);
diff --git a/extphone/src/com/qti/extphone/ExtTelephonyManager.java b/extphone/src/com/qti/extphone/ExtTelephonyManager.java
index 49084bc..fc90c6a 100644
--- a/extphone/src/com/qti/extphone/ExtTelephonyManager.java
+++ b/extphone/src/com/qti/extphone/ExtTelephonyManager.java
@@ -1085,6 +1085,20 @@
         return null;
     }
 
+    public CiwlanConfig getCiwlanConfig(int slotId) throws RemoteException {
+        CiwlanConfig config = null;
+        if (!isServiceConnected()) {
+            Log.e(LOG_TAG, "service not connected!");
+            return config;
+        }
+        try {
+            config = mExtTelephonyService.getCiwlanConfig(slotId);
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "getCiwlanConfig ended in remote exception", e);
+        }
+        return config;
+    }
+
     public Client registerCallback(String packageName, IExtPhoneCallback callback) {
         Client client = null;
         if (!isServiceConnected()) {
diff --git a/extphone/src/com/qti/extphone/IExtPhone.aidl b/extphone/src/com/qti/extphone/IExtPhone.aidl
index 0f4964c..444f2c6 100644
--- a/extphone/src/com/qti/extphone/IExtPhone.aidl
+++ b/extphone/src/com/qti/extphone/IExtPhone.aidl
@@ -38,7 +38,7 @@
 
 import android.telephony.ImsiEncryptionInfo;
 
-import com.qti.extphone.Token;
+import com.qti.extphone.CiwlanConfig;
 import com.qti.extphone.Client;
 import com.qti.extphone.IDepersoResCallback;
 import com.qti.extphone.IExtPhoneCallback;
@@ -47,6 +47,7 @@
 import com.qti.extphone.QtiImeiInfo;
 import com.qti.extphone.QtiSetNetworkSelectionMode;
 import com.qti.extphone.QtiSimType;
+import com.qti.extphone.Token;
 
 interface IExtPhone {
 
@@ -584,4 +585,12 @@
      * @return - Integer Token can be used to compare with the response.
      */
     Token setSimType(in Client client, in QtiSimType[] simType);
+
+    /**
+     * Query the C_IWLAN mode
+     *
+     * @param - slotId slot ID
+     * @return - The C_IWLAN configuration (only vs preferred) for home and roaming
+     */
+    CiwlanConfig getCiwlanConfig(int slotId);
 }
diff --git a/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl b/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
index 484cedd..a068c52 100644
--- a/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
+++ b/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
@@ -30,7 +30,7 @@
 /*
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  * SPDX-License-Identifier: BSD-3-Clause-Clear
  */
 
@@ -270,7 +270,7 @@
 
     /**
      * Response to getSecureModeStatus
-     * @param - token is the same token which is received in setSmartDdsSwitchToggle
+     * @param - token is the same token which is passed in from getSecureModeStatus
      * @param - status SUCCESS/FAILURE based on RIL data module response
      * @param - enableStatus Secure Mode status - true: enabled, false: disabled
      */
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.aidl
new file mode 100644
index 0000000..8ffc0c4
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable Coordinate2D;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.java b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.java
new file mode 100644
index 0000000..251366a
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Parcelable object to handle Coordinate2D info
+ * @hide
+ */
+
+public class Coordinate2D implements Parcelable {
+
+    private int mX;
+    private int mY;
+
+    public Coordinate2D(int x, int y) {
+        mX = x;
+        mY = y;
+    }
+
+    public Coordinate2D(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public int getX() {
+        return mX;
+    }
+
+    public int getY() {
+        return mY;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeInt(mX);
+        dest.writeInt(mY);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mX = in.readInt();
+        mY = in.readInt();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<Coordinate2D> CREATOR =
+            new Creator<Coordinate2D>() {
+        @Override
+        public Coordinate2D createFromParcel(Parcel in) {
+            return new Coordinate2D(in);
+        }
+
+        @Override
+        public Coordinate2D[] newArray(int size) {
+            return new Coordinate2D[size];
+        }
+    };
+
+    public String toString() {
+        return ("{Coordinate2D: " + "x = " + mX + " , y = " + mY + "}");
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
index 9b92a80..b107e2d 100755
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
@@ -27,7 +27,7 @@
  *
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted (subject to the limitations in the
@@ -143,6 +143,15 @@
      * CODE_CONCURRENT_CALLS_NOT_POSSIBLE} */
     public static final int CODE_CONCURRENT_CALLS_NOT_POSSIBLE = 3002;
 
+    /* Call fail error code to EPSFB failure */
+    public static final int CODE_EPSFB_FAILURE = 3003;
+
+    /* Call fail error code to TWAIT_EXPIRED */
+    public static final int CODE_TWAIT_EXPIRED = 3004;
+
+    /* Call fail error code to TCP_CONNECTION_REQ */
+    public static final int CODE_TCP_CONNECTION_REQ = 3005;
+
     // Default code to use for additional call info code.
     public static final int CODE_UNSPECIFIED = -1;
 
@@ -558,4 +567,17 @@
     // requires permission "com.qti.permission.RECEIVE_ESSENTIAL_RECORDS_LOADED".
     public static final String ACTION_ESSENTIAL_RECORDS_LOADED =
         "org.codeaurora.intent.action.ESSENTIAL_RECORDS_LOADED";
+
+    // Video online service
+    public static final String EXTRA_VIDEO_ONLINE_SERVICE_SUPPORTED = "isVosSupported";
+
+    /**
+     * The value of voice/video/text is defined according to the SRTP categories
+     * and the name in the extra is defined by QC IMS service.
+     */
+    public static final String EXTRAS_SRTP_ENCRYPTION_CATEGORY = "srtpEncryptionCategory";
+    public static final int SRTP_CATEGORY_UNENCRYPTED = 0;
+    public static final int SRTP_CATEGORY_VOICE = 1 << 0;
+    public static final int SRTP_CATEGORY_VIDEO = 1 << 1;
+    public static final int SRTP_CATEGORY_TEXT = 1 << 2;
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
index ebdc1b6..543aaab 100755
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
@@ -27,7 +27,7 @@
  *
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted (subject to the limitations in the
@@ -145,25 +145,25 @@
             "allow_one_way_accept_video_call";
 
     /* Config to determine if Carrier supports call composer
-     * true - if call composer is support else false
+     * true - if call composer is supported else false
      */
     public static final String KEY_CARRIER_CALL_COMPOSER_SUPPORTED =
             "carrier_call_composer_supported_bool";
 
     /* Config to determine if Carrier supports b2c enriched calling
-     * true - if b2c enriched calling is support else false
+     * true - if b2c enriched calling is supported else false
      */
     public static final String KEY_CARRIER_B2C_ENRICHED_CALLING_SUPPORTED =
             "carrier_b2c_enriched_calling_supported_bool";
 
     /* Config to determine if Carrier supports video CRS
-     * true - if video CRS is support else false
+     * true - if video CRS is supported else false
      */
     public static final String KEY_CARRIER_VIDEO_CRS_SUPPORTED =
             "carrier_video_crs_supported_bool";
 
     /* Config to determine if Carrier supports video CRBT
-     * true - if video CRBT is support else false
+     * true - if video CRBT is supported else false
      */
     public static final String KEY_CARRIER_VIDEO_CRBT_SUPPORTED =
             "config_enable_video_crbt";
@@ -199,8 +199,14 @@
         "is_private_network";
 
     /* Config to determine if Carrier supports ims data channel
-     * true - if data channel is support else false
+     * true - if data channel is supported else false
      */
      public static final String KEY_CARRIER_DATA_CHANNEL_SUPPORTED =
          "carrier_data_channel_supported_bool";
+
+    /* Config to determine if Carrier supports video online service
+     * true - if video online service is supported else false
+     */
+    public static final String KEY_CARRIER_VIDEO_ONLINE_SERVICE_SUPPORTED =
+        "carrier_video_online_service_supported_bool";
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
index c63c29d..dee1a72 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
@@ -24,6 +24,10 @@
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 package org.codeaurora.ims;
 
@@ -36,6 +40,7 @@
 import org.codeaurora.ims.internal.IImsMultiIdentityInterface;
 import org.codeaurora.ims.internal.IImsScreenShareController;
 import org.codeaurora.ims.QtiCallConstants;
+import org.codeaurora.ims.VosActionInfo;
 /**
  * Base implementation for IQtiImsExt.
  */
@@ -196,6 +201,18 @@
         public boolean isDataChannelEnabled(int phoneId) {
             return onIsDataChannelEnabled(phoneId);
         }
+
+        @Override
+        public void sendVosSupportStatus(int phoneId, boolean isVosSupported,
+                IQtiImsExtListener listener) {
+            onSendVosSupportStatus(phoneId, isVosSupported, listener);
+        }
+
+        @Override
+        public void sendVosActionInfo(int phoneId, VosActionInfo vosActionInfo,
+                IQtiImsExtListener listener) {
+            onSendVosActionInfo(phoneId, vosActionInfo, listener);
+        }
     };
 
     private QtiImsExtBinder mQtiImsExtBinder;
@@ -319,4 +336,14 @@
         // no-op
         return false;
     }
+
+    protected void onSendVosSupportStatus(int phoneId, boolean isVosSupported,
+            IQtiImsExtListener listener) {
+        // no-op
+    }
+
+    protected void onSendVosActionInfo(int phoneId, VosActionInfo vosActionInfo,
+            IQtiImsExtListener listener) {
+        // no-op
+    }
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java
index 0dac915..e0507fa 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java
@@ -24,6 +24,10 @@
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 
 package org.codeaurora.ims;
@@ -110,5 +114,13 @@
     @Override
     public void notifyDataChannelCapability(int phoneId, boolean dcCapability) {
     }
+
+    @Override
+    public void handleSendVosSupportStatusResponse(int phoneId, int result) {
+    }
+
+    @Override
+    public void handleSendVosActionInfoResponse(int phoneId, int result) {
+    }
 }
 
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
index 42eae0d..8e70265 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
@@ -24,6 +24,10 @@
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 package org.codeaurora.ims;
 
@@ -451,4 +455,24 @@
             throw new QtiImsException("Remote ImsService isDataChannelEnabled: " + e);
         }
     }
+
+    public void sendVosSupportStatus(int phoneId, boolean isVosSupported,
+            IQtiImsExtListener listener) throws QtiImsException {
+        validateInvariants(phoneId);
+        try {
+            mQtiImsExt.sendVosSupportStatus(phoneId, isVosSupported, listener);
+        } catch (RemoteException e) {
+            throw new QtiImsException("Remote ImsService sendVosSupportStatus: " + e);
+        }
+    }
+
+    public void sendVosActionInfo(int phoneId, VosActionInfo vosActionInfo,
+            IQtiImsExtListener listener) throws QtiImsException {
+        validateInvariants(phoneId);
+        try {
+            mQtiImsExt.sendVosActionInfo(phoneId, vosActionInfo, listener);
+        } catch (RemoteException e) {
+            throw new QtiImsException("Remote ImsService sendVosActionInfo: " + e);
+        }
+    }
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.aidl
new file mode 100644
index 0000000..27fac40
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable VosActionInfo;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.java b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.java
new file mode 100644
index 0000000..18e3648
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.codeaurora.ims.VosMoveInfo;
+import org.codeaurora.ims.VosTouchInfo;
+
+/**
+ * Parcelable object to handle VosActionInfo info
+ * @hide
+ */
+
+public class VosActionInfo implements Parcelable {
+    public static final VosMoveInfo INVALID_MOVEINFO = null;
+    public static final VosTouchInfo INVALID_TOUCHINFO = null;
+
+    private VosMoveInfo mVosMoveInfo;
+    private VosTouchInfo mVosTouchInfo;
+
+    public VosActionInfo(VosMoveInfo vosMoveInfo, VosTouchInfo vosTouchInfo) {
+        mVosMoveInfo = vosMoveInfo;
+        mVosTouchInfo = vosTouchInfo;
+    }
+
+    public VosActionInfo(VosTouchInfo vosTouchInfo) {
+        this(INVALID_MOVEINFO, vosTouchInfo);
+    }
+
+    public VosActionInfo(VosMoveInfo vosMoveInfo) {
+        this(vosMoveInfo, INVALID_TOUCHINFO);
+    }
+
+    public VosActionInfo(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public VosMoveInfo getVosMoveInfo() {
+        return mVosMoveInfo;
+    }
+
+    public VosTouchInfo getVosTouchInfo() {
+        return mVosTouchInfo;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeParcelable(mVosMoveInfo, flag);
+        dest.writeParcelable(mVosTouchInfo, flag);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mVosMoveInfo = in.readParcelable(VosMoveInfo.class.getClassLoader());
+        mVosTouchInfo = in.readParcelable(VosTouchInfo.class.getClassLoader());
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<VosActionInfo> CREATOR =
+            new Creator<VosActionInfo>() {
+        @Override
+        public VosActionInfo createFromParcel(Parcel in) {
+            return new VosActionInfo(in);
+        }
+
+        @Override
+        public VosActionInfo[] newArray(int size) {
+            return new VosActionInfo[size];
+        }
+    };
+
+    public String toString() {
+        return ("{VosActionInfo: " + "vosMoveInfo = " +
+                mVosMoveInfo + " , vosTouchInfo = " + mVosTouchInfo + "}");
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.aidl
new file mode 100644
index 0000000..db84d92
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable VosMoveInfo;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.java b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.java
new file mode 100644
index 0000000..ae4316a
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.codeaurora.ims.Coordinate2D;
+
+/**
+ * Parcelable object to handle VosMoveInfo info
+ * @hide
+ */
+
+public class VosMoveInfo implements Parcelable {
+
+    private Coordinate2D mStart;
+    private Coordinate2D mEnd;
+
+    public VosMoveInfo(Coordinate2D start, Coordinate2D end) {
+        mStart = start;
+        mEnd = end;
+    }
+
+    public VosMoveInfo(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public Coordinate2D getStart() {
+        return mStart;
+    }
+
+    public Coordinate2D getEnd() {
+        return mEnd;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeParcelable(mStart, flag);
+        dest.writeParcelable(mEnd, flag);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mStart = in.readParcelable(Coordinate2D.class.getClassLoader());
+        mEnd = in.readParcelable(Coordinate2D.class.getClassLoader());
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<VosMoveInfo> CREATOR =
+            new Creator<VosMoveInfo>() {
+        @Override
+        public VosMoveInfo createFromParcel(Parcel in) {
+            return new VosMoveInfo(in);
+        }
+
+        @Override
+        public VosMoveInfo[] newArray(int size) {
+            return new VosMoveInfo[size];
+        }
+    };
+
+    public String toString() {
+        return ("{VosMoveInfo: " + "start = " + mStart + " , end = " + mEnd + "}");
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.aidl
new file mode 100644
index 0000000..1807cab
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable VosTouchInfo;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.java b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.java
new file mode 100644
index 0000000..46e518c
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.nd
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.codeaurora.ims.Coordinate2D;
+
+/**
+ * Parcelable object to handle VosTouchInfo info
+ * @hide
+ */
+
+public class VosTouchInfo implements Parcelable {
+
+    private Coordinate2D mTouch;
+    // Milliseconds
+    private int mTouchDuration;
+
+    public VosTouchInfo(Coordinate2D touch, int touchDuration) {
+        mTouch = touch;
+        mTouchDuration = touchDuration;
+    }
+
+    public VosTouchInfo(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public Coordinate2D getTouch() {
+        return mTouch;
+    }
+
+    public int getTouchDuration() {
+        return mTouchDuration;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeParcelable(mTouch, flag);
+        dest.writeInt(mTouchDuration);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mTouch = in.readParcelable(Coordinate2D.class.getClassLoader());
+        mTouchDuration = in.readInt();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<VosTouchInfo> CREATOR =
+            new Creator<VosTouchInfo>() {
+        @Override
+        public VosTouchInfo createFromParcel(Parcel in) {
+            return new VosTouchInfo(in);
+        }
+
+        @Override
+        public VosTouchInfo[] newArray(int size) {
+            return new VosTouchInfo[size];
+        }
+    };
+
+    public String toString() {
+        return ("{VosTouchInfo: " + "touch = " +
+                mTouch + " , touchDuration = " + mTouchDuration + "}");
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl
index 8e960a2..12caa31 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl
@@ -24,6 +24,10 @@
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 
 package org.codeaurora.ims.internal;
@@ -33,6 +37,7 @@
 import org.codeaurora.ims.internal.IQtiImsExtListener;
 import org.codeaurora.ims.internal.IImsMultiIdentityInterface;
 import org.codeaurora.ims.internal.IImsScreenShareController;
+import org.codeaurora.ims.VosActionInfo;
 
 /**
  * Interface through which APP and vendor communicates.
@@ -362,4 +367,28 @@
      *@throws RemoteException if calling the IMS service results in an error.
      */
     boolean isDataChannelEnabled(int phoneId);
+
+    /**
+     * sendVosSupportStatus
+     * Send video online service status supported
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param isVosSupported sends whether device supports video online service to lower layer
+     * @param listener an IQtiImsExtListener instance to indicate the response
+     * @return void
+     */
+    oneway void sendVosSupportStatus(int phoneId, boolean isVosSupported,
+        IQtiImsExtListener listener);
+
+    /**
+     * sendVosActionInfo
+     * Send user's action info like touch or move
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param vosActionInfo sends user's touch or move info to lower layer
+     * @param listener an IQtiImsExtListener instance to indicate the response
+     * @return void
+     */
+    oneway void sendVosActionInfo(int phoneId, in VosActionInfo vosActionInfo,
+        IQtiImsExtListener listener);
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl
index 3d3c73c..55f7359 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl
@@ -24,6 +24,10 @@
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 
 package org.codeaurora.ims.internal;
@@ -205,4 +209,24 @@
      * @return void.
      */
    void notifyDataChannelCapability(int phoneId, boolean dcCapability);
+
+    /**
+     * Notifies client the result of send vos support status
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param <result> is one of the values QTI_IMS_REQUEST_*, as defined in
+     *        <code>org.codeaurora.ims.utils.QtiImsExtUtils.</code>
+     * @return void.
+     */
+    void handleSendVosSupportStatusResponse(int phoneId, int result);
+
+    /**
+     * Notifies client the result of send vos action info
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param <result> is one of the values QTI_IMS_REQUEST_*, as defined in
+     *        <code>org.codeaurora.ims.utils.QtiImsExtUtils.</code>
+     * @return void.
+     */
+    void handleSendVosActionInfoResponse(int phoneId, int result);
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java b/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java
index eff1fad..cf5d2a5 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java
@@ -28,7 +28,7 @@
  *
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted (subject to the limitations in the
@@ -854,4 +854,10 @@
                 QtiCallConstants.DATA_CHANNEL + phoneId,
                 QtiCallConstants.DATA_CHANNEL_DISABLED);
     }
+
+    // Returns true if Carrier supports video online service
+    public static boolean isVosSupported(int phoneId, Context context) {
+        return isCarrierConfigEnabled(phoneId, context,
+                QtiCarrierConfigs.KEY_CARRIER_VIDEO_ONLINE_SERVICE_SUPPORTED);
+    }
 }