diff --git a/compatibility_matrices/compatibility_matrix.current.xml b/compatibility_matrices/compatibility_matrix.current.xml index 568d94c1ba..71afee3ac1 100644 --- a/compatibility_matrices/compatibility_matrix.current.xml +++ b/compatibility_matrices/compatibility_matrix.current.xml @@ -589,6 +589,16 @@ slot3 + + android.hardware.radio.sap + 1 + + ISap + slot1 + slot2 + slot3 + + android.hardware.radio.voice 1 diff --git a/radio/aidl/Android.bp b/radio/aidl/Android.bp index 80ad14af36..08bcc289e0 100644 --- a/radio/aidl/Android.bp +++ b/radio/aidl/Android.bp @@ -152,6 +152,28 @@ aidl_interface { } +aidl_interface { + name: "android.hardware.radio.sap", + vendor_available: true, + host_supported: true, + srcs: ["android/hardware/radio/sap/*.aidl"], + stability: "vintf", + backend: { + cpp: { + enabled: true, + }, + java: { + apex_available: [ + "//apex_available:platform", + "com.android.btservices", + ], + sdk_version: "module_current", + min_sdk_version: "Tiramisu", + }, + }, + +} + aidl_interface { name: "android.hardware.radio.sim", vendor_available: true, diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/ISap.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/ISap.aidl new file mode 100644 index 0000000000..37391e9804 --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/ISap.aidl @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@VintfStability +interface ISap { + oneway void apduReq(in int serial, in android.hardware.radio.sap.SapApduType type, in byte[] command); + oneway void connectReq(in int serial, in int maxMsgSizeBytes); + oneway void disconnectReq(in int serial); + oneway void powerReq(in int serial, in boolean powerOn); + oneway void resetSimReq(in int serial); + oneway void setCallback(in android.hardware.radio.sap.ISapCallback sapCallback); + oneway void setTransferProtocolReq(in int serial, in android.hardware.radio.sap.SapTransferProtocol transferProtocol); + oneway void transferAtrReq(in int serial); + oneway void transferCardReaderStatusReq(in int serial); +} diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/ISapCallback.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/ISapCallback.aidl new file mode 100644 index 0000000000..d507709a6d --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/ISapCallback.aidl @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@VintfStability +interface ISapCallback { + oneway void apduResponse(in int serial, in android.hardware.radio.sap.SapResultCode resultCode, in byte[] apduRsp); + oneway void connectResponse(in int serial, in android.hardware.radio.sap.SapConnectRsp sapConnectRsp, in int maxMsgSizeBytes); + oneway void disconnectIndication(in int serial, in android.hardware.radio.sap.SapDisconnectType disconnectType); + oneway void disconnectResponse(in int serial); + oneway void errorResponse(in int serial); + oneway void powerResponse(in int serial, in android.hardware.radio.sap.SapResultCode resultCode); + oneway void resetSimResponse(in int serial, in android.hardware.radio.sap.SapResultCode resultCode); + oneway void statusIndication(in int serial, in android.hardware.radio.sap.SapStatus status); + oneway void transferAtrResponse(in int serial, in android.hardware.radio.sap.SapResultCode resultCode, in byte[] atr); + oneway void transferCardReaderStatusResponse(in int serial, in android.hardware.radio.sap.SapResultCode resultCode, in int cardReaderStatus); + oneway void transferProtocolResponse(in int serial, in android.hardware.radio.sap.SapResultCode resultCode); +} diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapApduType.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapApduType.aidl new file mode 100644 index 0000000000..e0e2a03956 --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapApduType.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@Backing(type="int") @VintfStability +enum SapApduType { + APDU = 0, + APDU7816 = 1, +} diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapConnectRsp.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapConnectRsp.aidl new file mode 100644 index 0000000000..aceac3789c --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapConnectRsp.aidl @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@Backing(type="int") @VintfStability +enum SapConnectRsp { + SUCCESS = 0, + CONNECT_FAILURE = 1, + MSG_SIZE_TOO_LARGE = 2, + MSG_SIZE_TOO_SMALL = 3, + CONNECT_OK_CALL_ONGOING = 4, +} diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapDisconnectType.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapDisconnectType.aidl new file mode 100644 index 0000000000..0447f9b083 --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapDisconnectType.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@Backing(type="int") @VintfStability +enum SapDisconnectType { + GRACEFUL = 0, + IMMEDIATE = 1, +} diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapResultCode.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapResultCode.aidl new file mode 100644 index 0000000000..1db226b43c --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapResultCode.aidl @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@Backing(type="int") @VintfStability +enum SapResultCode { + SUCCESS = 0, + GENERIC_FAILURE = 1, + CARD_NOT_ACCESSSIBLE = 2, + CARD_ALREADY_POWERED_OFF = 3, + CARD_REMOVED = 4, + CARD_ALREADY_POWERED_ON = 5, + DATA_NOT_AVAILABLE = 6, + NOT_SUPPORTED = 7, +} diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapStatus.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapStatus.aidl new file mode 100644 index 0000000000..32f71c218a --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapStatus.aidl @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@Backing(type="int") @VintfStability +enum SapStatus { + UNKNOWN_ERROR = 0, + CARD_RESET = 1, + CARD_NOT_ACCESSIBLE = 2, + CARD_REMOVED = 3, + CARD_INSERTED = 4, + RECOVERED = 5, +} diff --git a/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapTransferProtocol.aidl b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapTransferProtocol.aidl new file mode 100644 index 0000000000..e3ffdb0702 --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.sap/current/android/hardware/radio/sap/SapTransferProtocol.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.sap; +@Backing(type="int") @VintfStability +enum SapTransferProtocol { + T0 = 0, + T1 = 1, +} diff --git a/radio/aidl/android/hardware/radio/sap/ISap.aidl b/radio/aidl/android/hardware/radio/sap/ISap.aidl new file mode 100644 index 0000000000..552e602b75 --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/ISap.aidl @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +import android.hardware.radio.sap.ISapCallback; +import android.hardware.radio.sap.SapApduType; +import android.hardware.radio.sap.SapTransferProtocol; + +@VintfStability +oneway interface ISap { + /** + * TRANSFER_APDU_REQ from SAP 1.1 spec 5.1.6 + * + * @param serial Id to match req-resp. Resp must include same serial. + * @param type APDU command type + * @param command CommandAPDU/CommandAPDU7816 parameter depending on type + */ + void apduReq(in int serial, in SapApduType type, in byte[] command); + + /** + * CONNECT_REQ from SAP 1.1 spec 5.1.1 + * + * @param serial Id to match req-resp. Resp must include same serial. + * @param maxMsgSizeBytes MaxMsgSize to be used for SIM Access Profile connection + */ + void connectReq(in int serial, in int maxMsgSizeBytes); + + /** + * DISCONNECT_REQ from SAP 1.1 spec 5.1.3 + * + * @param serial Id to match req-resp. Resp must include same serial. + */ + void disconnectReq(in int serial); + + /** + * POWER_SIM_OFF_REQ and POWER_SIM_ON_REQ from SAP 1.1 spec 5.1.10 + 5.1.12 + * + * @param serial Id to match req-resp. Resp must include same serial. + * @param powerOn true for on, false for off + */ + void powerReq(in int serial, in boolean powerOn); + + /** + * RESET_SIM_REQ from SAP 1.1 spec 5.1.14 + * + * @param serial Id to match req-resp. Resp must include same serial. + */ + void resetSimReq(in int serial); + + /** + * Set callback that has response and unsolicited indication functions + * + * @param sapCallback Object containing response and unosolicited indication callbacks + */ + void setCallback(in ISapCallback sapCallback); + + /** + * SET_TRANSPORT_PROTOCOL_REQ from SAP 1.1 spec 5.1.20 + * + * @param serial Id to match req-resp. Resp must include same serial. + * @param transferProtocol Transport Protocol + */ + void setTransferProtocolReq(in int serial, in SapTransferProtocol transferProtocol); + + /** + * TRANSFER_ATR_REQ from SAP 1.1 spec 5.1.8 + * + * @param serial Id to match req-resp. Resp must include same serial. + */ + void transferAtrReq(in int serial); + + /** + * TRANSFER_CARD_READER_STATUS_REQ from SAP 1.1 spec 5.1.17 + * + * @param serial Id to match req-resp. Resp must include same serial. + */ + void transferCardReaderStatusReq(in int serial); +} diff --git a/radio/aidl/android/hardware/radio/sap/ISapCallback.aidl b/radio/aidl/android/hardware/radio/sap/ISapCallback.aidl new file mode 100644 index 0000000000..34111eb7ff --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/ISapCallback.aidl @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +import android.hardware.radio.sap.SapConnectRsp; +import android.hardware.radio.sap.SapDisconnectType; +import android.hardware.radio.sap.SapResultCode; +import android.hardware.radio.sap.SapStatus; + +@VintfStability +oneway interface ISapCallback { + /** + * TRANSFER_APDU_RESP from SAP 1.1 spec 5.1.7 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param resultCode ResultCode to indicate if command was processed correctly + * Possible values: + * SapResultCode:SUCCESS, + * SapResultCode:GENERIC_FAILURE, + * SapResultCode:CARD_NOT_ACCESSSIBLE, + * SapResultCode:CARD_ALREADY_POWERED_OFF, + * SapResultCode:CARD_REMOVED + * @param apduRsp APDU Response. Valid only if command was processed correctly and no error + * occurred. + */ + void apduResponse(in int serial, in SapResultCode resultCode, in byte[] apduRsp); + + /** + * CONNECT_RESP from SAP 1.1 spec 5.1.2 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param sapConnectRsp Connection Status + * @param maxMsgSizeBytes MaxMsgSize supported by server if request cannot be fulfilled. + * Valid only if connectResponse is SapConnectResponse:MSG_SIZE_TOO_LARGE. + */ + void connectResponse(in int serial, in SapConnectRsp sapConnectRsp, in int maxMsgSizeBytes); + + /** + * DISCONNECT_IND from SAP 1.1 spec 5.1.5 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param disconnectType Disconnect Type to indicate if shutdown is graceful or immediate + */ + void disconnectIndication(in int serial, in SapDisconnectType disconnectType); + + /** + * DISCONNECT_RESP from SAP 1.1 spec 5.1.4 + * + * @param serial Id to match req-resp. Value must match the one in req. + */ + void disconnectResponse(in int serial); + + /** + * ERROR_RESP from SAP 1.1 spec 5.1.19 + * + * @param serial Id to match req-resp. Value must match the one in req. + */ + void errorResponse(in int serial); + + /** + * POWER_SIM_OFF_RESP and POWER_SIM_ON_RESP from SAP 1.1 spec 5.1.11 + 5.1.13 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param resultCode ResultCode to indicate if command was processed correctly + * Possible values: + * SapResultCode:SUCCESS, + * SapResultCode:GENERIC_FAILURE, + * SapResultCode:CARD_NOT_ACCESSSIBLE, (possible only for power on req) + * SapResultCode:CARD_ALREADY_POWERED_OFF, (possible only for power off req) + * SapResultCode:CARD_REMOVED, + * SapResultCode:CARD_ALREADY_POWERED_ON (possible only for power on req) + */ + void powerResponse(in int serial, in SapResultCode resultCode); + + /** + * RESET_SIM_RESP from SAP 1.1 spec 5.1.15 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param resultCode ResultCode to indicate if command was processed correctly + * Possible values: + * SapResultCode:SUCCESS, + * SapResultCode:GENERIC_FAILURE, + * SapResultCode:CARD_NOT_ACCESSSIBLE, + * SapResultCode:CARD_ALREADY_POWERED_OFF, + * SapResultCode:CARD_REMOVED + */ + void resetSimResponse(in int serial, in SapResultCode resultCode); + + /** + * STATUS_IND from SAP 1.1 spec 5.1.16 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param status Parameter to indicate reason for the status change. + */ + void statusIndication(in int serial, in SapStatus status); + + /** + * TRANSFER_ATR_RESP from SAP 1.1 spec 5.1.9 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param resultCode ResultCode to indicate if command was processed correctly + * Possible values: + * SapResultCode:SUCCESS, + * SapResultCode:GENERIC_FAILURE, + * SapResultCode:CARD_ALREADY_POWERED_OFF, + * SapResultCode:CARD_REMOVED, + * SapResultCode:DATA_NOT_AVAILABLE + * @param atr Answer to Reset from the subscription module. Included only if no error occurred, + * otherwise empty. + */ + void transferAtrResponse(in int serial, in SapResultCode resultCode, in byte[] atr); + + /** + * TRANSFER_CARD_READER_STATUS_REQ from SAP 1.1 spec 5.1.18 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param resultCode ResultCode to indicate if command was processed correctly + * Possible values: + * SapResultCode:SUCCESS, + * SapResultCode:GENERIC_FAILURE + * SapResultCode:DATA_NOT_AVAILABLE + * @param cardReaderStatus Card Reader Status coded as described in 3GPP TS 11.14 Section 12.33 + * and TS 31.111 Section 8.33 + */ + void transferCardReaderStatusResponse( + in int serial, in SapResultCode resultCode, in int cardReaderStatus); + + /** + * SET_TRANSPORT_PROTOCOL_RESP from SAP 1.1 spec 5.1.21 + * + * @param serial Id to match req-resp. Value must match the one in req. + * @param resultCode ResultCode to indicate if command was processed correctly + * Possible values: + * SapResultCode:SUCCESS + * SapResultCode:NOT_SUPPORTED + */ + void transferProtocolResponse(in int serial, in SapResultCode resultCode); +} diff --git a/radio/aidl/android/hardware/radio/sap/SapApduType.aidl b/radio/aidl/android/hardware/radio/sap/SapApduType.aidl new file mode 100644 index 0000000000..ab8ffb9f72 --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/SapApduType.aidl @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +@VintfStability +@Backing(type="int") +enum SapApduType { + APDU, + APDU7816, +} diff --git a/radio/aidl/android/hardware/radio/sap/SapConnectRsp.aidl b/radio/aidl/android/hardware/radio/sap/SapConnectRsp.aidl new file mode 100644 index 0000000000..0e1d528c1c --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/SapConnectRsp.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +@VintfStability +@Backing(type="int") +enum SapConnectRsp { + SUCCESS, + CONNECT_FAILURE, + MSG_SIZE_TOO_LARGE, + MSG_SIZE_TOO_SMALL, + CONNECT_OK_CALL_ONGOING, +} diff --git a/radio/aidl/android/hardware/radio/sap/SapDisconnectType.aidl b/radio/aidl/android/hardware/radio/sap/SapDisconnectType.aidl new file mode 100644 index 0000000000..16d7cc6d83 --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/SapDisconnectType.aidl @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +@VintfStability +@Backing(type="int") +enum SapDisconnectType { + GRACEFUL, + IMMEDIATE, +} diff --git a/radio/aidl/android/hardware/radio/sap/SapResultCode.aidl b/radio/aidl/android/hardware/radio/sap/SapResultCode.aidl new file mode 100644 index 0000000000..4728ebe69a --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/SapResultCode.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +@VintfStability +@Backing(type="int") +enum SapResultCode { + SUCCESS, + GENERIC_FAILURE, + CARD_NOT_ACCESSSIBLE, + CARD_ALREADY_POWERED_OFF, + CARD_REMOVED, + CARD_ALREADY_POWERED_ON, + DATA_NOT_AVAILABLE, + NOT_SUPPORTED, +} diff --git a/radio/aidl/android/hardware/radio/sap/SapStatus.aidl b/radio/aidl/android/hardware/radio/sap/SapStatus.aidl new file mode 100644 index 0000000000..309352de68 --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/SapStatus.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +@VintfStability +@Backing(type="int") +enum SapStatus { + UNKNOWN_ERROR, + CARD_RESET, + CARD_NOT_ACCESSIBLE, + CARD_REMOVED, + CARD_INSERTED, + RECOVERED, +} diff --git a/radio/aidl/android/hardware/radio/sap/SapTransferProtocol.aidl b/radio/aidl/android/hardware/radio/sap/SapTransferProtocol.aidl new file mode 100644 index 0000000000..823c5f2830 --- /dev/null +++ b/radio/aidl/android/hardware/radio/sap/SapTransferProtocol.aidl @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.sap; + +@VintfStability +@Backing(type="int") +enum SapTransferProtocol { + T0, + T1, +} diff --git a/radio/aidl/compat/libradiocompat/Android.bp b/radio/aidl/compat/libradiocompat/Android.bp index 487d91b6b9..aa20fc3fd5 100644 --- a/radio/aidl/compat/libradiocompat/Android.bp +++ b/radio/aidl/compat/libradiocompat/Android.bp @@ -40,6 +40,7 @@ cc_library { "android.hardware.radio.messaging-V1-ndk", "android.hardware.radio.modem-V1-ndk", "android.hardware.radio.network-V1-ndk", + "android.hardware.radio.sap-V1-ndk", "android.hardware.radio.sim-V1-ndk", "android.hardware.radio.voice-V1-ndk", "android.hardware.radio@1.0", @@ -82,6 +83,9 @@ cc_library { "network/RadioResponse-network.cpp", "network/structs.cpp", "network/utils.cpp", + "sap/Sap.cpp", + "sap/SapCallback.cpp", + "sap/structs.cpp", "sim/RadioIndication-sim.cpp", "sim/RadioResponse-sim.cpp", "sim/RadioSim.cpp", diff --git a/radio/aidl/compat/libradiocompat/commonStructs.cpp b/radio/aidl/compat/libradiocompat/commonStructs.cpp index 6e4c873d65..d65ed1a1e4 100644 --- a/radio/aidl/compat/libradiocompat/commonStructs.cpp +++ b/radio/aidl/compat/libradiocompat/commonStructs.cpp @@ -48,6 +48,10 @@ int32_t toAidl(uint32_t v) { return v; } +uint8_t toHidl(int8_t v) { + return v; +} + aidl::RadioIndicationType toAidl(V1_0::RadioIndicationType type) { return aidl::RadioIndicationType(type); } diff --git a/radio/aidl/compat/libradiocompat/commonStructs.h b/radio/aidl/compat/libradiocompat/commonStructs.h index a4a4869e61..f43a599193 100644 --- a/radio/aidl/compat/libradiocompat/commonStructs.h +++ b/radio/aidl/compat/libradiocompat/commonStructs.h @@ -28,6 +28,7 @@ hidl_string toHidl(const std::string& str); uint8_t toAidl(int8_t v); int8_t toAidl(uint8_t v); int32_t toAidl(uint32_t v); +uint8_t toHidl(int8_t v); aidl::android::hardware::radio::RadioIndicationType toAidl(V1_0::RadioIndicationType type); aidl::android::hardware::radio::RadioResponseType toAidl(V1_0::RadioResponseType type); diff --git a/radio/aidl/compat/libradiocompat/include/libradiocompat/Sap.h b/radio/aidl/compat/libradiocompat/include/libradiocompat/Sap.h new file mode 100644 index 0000000000..a293d11d22 --- /dev/null +++ b/radio/aidl/compat/libradiocompat/include/libradiocompat/Sap.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include "RadioCompatBase.h" +#include "SapCallback.h" + +#include +#include +#include + +namespace android::hardware::radio::compat { + +/** + * HAL translator from HIDL ISap to AIDL ISap + * + * This class wraps existing HIDL implementation (either a binder stub or real + * class implementing the HAL) and implements AIDL HAL. It's up to the caller to + * fetch source implementation and publish resulting HAL instance. + */ +class Sap : public aidl::android::hardware::radio::sap::BnSap { + const sp mHal; + + const sp mSapCallback; + + ::ndk::ScopedAStatus apduReq(int32_t serial, + aidl::android::hardware::radio::sap::SapApduType type, + const std::vector& command) override; + ::ndk::ScopedAStatus connectReq(int32_t serial, int32_t maxMsgSize) override; + ::ndk::ScopedAStatus disconnectReq(int32_t serial) override; + ::ndk::ScopedAStatus powerReq(int32_t serial, bool state) override; + ::ndk::ScopedAStatus resetSimReq(int32_t serial) override; + ::ndk::ScopedAStatus setCallback( + const std::shared_ptr<::aidl::android::hardware::radio::sap::ISapCallback>& sapCallback) + override; + ::ndk::ScopedAStatus setTransferProtocolReq( + int32_t serial, + aidl::android::hardware::radio::sap::SapTransferProtocol transferProtocol) override; + ::ndk::ScopedAStatus transferAtrReq(int32_t serial) override; + ::ndk::ScopedAStatus transferCardReaderStatusReq(int32_t serial) override; + + public: + /** + * Constructs AIDL ISap instance wrapping existing HIDL ISap instance. + * + * \param hidlHal existing HIDL ISap HAL instance + */ + Sap(sp hidlHal); +}; + +} // namespace android::hardware::radio::compat diff --git a/radio/aidl/compat/libradiocompat/include/libradiocompat/SapCallback.h b/radio/aidl/compat/libradiocompat/include/libradiocompat/SapCallback.h new file mode 100644 index 0000000000..7e72106416 --- /dev/null +++ b/radio/aidl/compat/libradiocompat/include/libradiocompat/SapCallback.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include "GuaranteedCallback.h" + +#include +#include + +namespace android::hardware::radio::compat { + +class SapCallback : public V1_0::ISapCallback { + GuaranteedCallback + mCallback; + + Return apduResponse(int32_t serial, V1_0::SapResultCode resultCode, + const ::android::hardware::hidl_vec& apduRsp) override; + Return connectResponse(int32_t serial, V1_0::SapConnectRsp sapConnectRsp, + int32_t maxMsgSize) override; + Return disconnectIndication(int32_t serial, + V1_0::SapDisconnectType disconnectType) override; + Return disconnectResponse(int32_t serial) override; + Return errorResponse(int32_t serial) override; + Return powerResponse(int32_t serial, V1_0::SapResultCode resultCode) override; + Return resetSimResponse(int32_t serial, V1_0::SapResultCode resultCode) override; + Return statusIndication(int32_t serial, V1_0::SapStatus status) override; + Return transferAtrResponse(int32_t serial, V1_0::SapResultCode resultCode, + const ::android::hardware::hidl_vec& atr) override; + Return transferCardReaderStatusResponse(int32_t serial, V1_0::SapResultCode resultCode, + int32_t cardReaderStatus) override; + Return transferProtocolResponse(int32_t serial, V1_0::SapResultCode resultCode) override; + + public: + void setResponseFunction( + const std::shared_ptr& callback); + + std::shared_ptr respond(); +}; + +} // namespace android::hardware::radio::compat diff --git a/radio/aidl/compat/libradiocompat/sap/Sap.cpp b/radio/aidl/compat/libradiocompat/sap/Sap.cpp new file mode 100644 index 0000000000..1a77169ab1 --- /dev/null +++ b/radio/aidl/compat/libradiocompat/sap/Sap.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "commonStructs.h" +#include "debug.h" +#include "structs.h" + +#include "collections.h" + +#define RADIO_MODULE "Sap" + +namespace android::hardware::radio::compat { + +using ::ndk::ScopedAStatus; +namespace aidl = ::aidl::android::hardware::radio::sap; +constexpr auto ok = &ScopedAStatus::ok; + +Sap::Sap(sp hidlHal) : mHal(hidlHal), mSapCallback(sp::make()) {} + +ScopedAStatus Sap::apduReq(int32_t serial, aidl::SapApduType type, + const std::vector& command) { + LOG_CALL << serial; + mHal->apduReq(serial, toHidl(type), toHidl(command)); + return ok(); +} + +ScopedAStatus Sap::connectReq(int32_t serial, int32_t maxMsgSize) { + LOG_CALL << serial; + mHal->connectReq(serial, maxMsgSize); + return ok(); +} + +ScopedAStatus Sap::disconnectReq(int32_t serial) { + LOG_CALL << serial; + mHal->disconnectReq(serial); + return ok(); +} + +ScopedAStatus Sap::powerReq(int32_t serial, bool state) { + LOG_CALL << serial; + mHal->powerReq(serial, state); + return ok(); +} + +ScopedAStatus Sap::resetSimReq(int32_t serial) { + LOG_CALL << serial; + mHal->resetSimReq(serial); + return ok(); +} + +ScopedAStatus Sap::setCallback( + const std::shared_ptr<::aidl::android::hardware::radio::sap::ISapCallback>& sapCallback) { + LOG_CALL << sapCallback; + + CHECK(sapCallback); + + mSapCallback->setResponseFunction(sapCallback); + mHal->setCallback(mSapCallback).assertOk(); + return ok(); +} +ScopedAStatus Sap::setTransferProtocolReq(int32_t serial, + aidl::SapTransferProtocol transferProtocol) { + LOG_CALL << serial; + mHal->setTransferProtocolReq(serial, toHidl(transferProtocol)); + return ok(); +} + +ScopedAStatus Sap::transferAtrReq(int32_t serial) { + LOG_CALL << serial; + mHal->transferAtrReq(serial); + return ok(); +} +ScopedAStatus Sap::transferCardReaderStatusReq(int32_t serial) { + LOG_CALL << serial; + mHal->transferCardReaderStatusReq(serial); + return ok(); +} + +} // namespace android::hardware::radio::compat diff --git a/radio/aidl/compat/libradiocompat/sap/SapCallback.cpp b/radio/aidl/compat/libradiocompat/sap/SapCallback.cpp new file mode 100644 index 0000000000..a40dff8d78 --- /dev/null +++ b/radio/aidl/compat/libradiocompat/sap/SapCallback.cpp @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "commonStructs.h" +#include "debug.h" +#include "structs.h" + +#include "collections.h" + +#define RADIO_MODULE "SapCallback" + +namespace android::hardware::radio::compat { + +namespace aidl = ::aidl::android::hardware::radio::sap; + +void SapCallback::setResponseFunction(const std::shared_ptr& callback) { + mCallback = callback; +} + +std::shared_ptr SapCallback::respond() { + return mCallback.get(); +} + +Return SapCallback::apduResponse(int32_t serial, V1_0::SapResultCode resultCode, + const hidl_vec& apduRsp) { + LOG_CALL << serial; + respond()->apduResponse(serial, toAidl(resultCode), apduRsp); + return {}; +} + +Return SapCallback::connectResponse(int32_t serial, V1_0::SapConnectRsp sapConnectRsp, + int32_t maxMsgSize) { + LOG_CALL << serial; + respond()->connectResponse(serial, toAidl(sapConnectRsp), maxMsgSize); + return {}; +} + +Return SapCallback::disconnectIndication(int32_t serial, + V1_0::SapDisconnectType disconnectType) { + LOG_CALL << serial; + respond()->disconnectIndication(serial, toAidl(disconnectType)); + return {}; +} + +Return SapCallback::disconnectResponse(int32_t serial) { + LOG_CALL << serial; + respond()->disconnectResponse(serial); + return {}; +} + +Return SapCallback::errorResponse(int32_t serial) { + LOG_CALL << serial; + respond()->errorResponse(serial); + return {}; +} + +Return SapCallback::powerResponse(int32_t serial, V1_0::SapResultCode resultCode) { + LOG_CALL << serial; + respond()->powerResponse(serial, toAidl(resultCode)); + return {}; +} + +Return SapCallback::resetSimResponse(int32_t serial, V1_0::SapResultCode resultCode) { + LOG_CALL << serial; + respond()->resetSimResponse(serial, toAidl(resultCode)); + return {}; +} + +Return SapCallback::statusIndication(int32_t serial, V1_0::SapStatus status) { + LOG_CALL << serial; + respond()->statusIndication(serial, toAidl(status)); + return {}; +} + +Return SapCallback::transferAtrResponse(int32_t serial, V1_0::SapResultCode resultCode, + const hidl_vec& atr) { + LOG_CALL << serial; + respond()->transferAtrResponse(serial, toAidl(resultCode), atr); + return {}; +} + +Return SapCallback::transferCardReaderStatusResponse(int32_t serial, + V1_0::SapResultCode resultCode, + int32_t cardReaderStatus) { + LOG_CALL << serial; + respond()->transferCardReaderStatusResponse(serial, toAidl(resultCode), cardReaderStatus); + return {}; +} + +Return SapCallback::transferProtocolResponse(int32_t serial, V1_0::SapResultCode resultCode) { + LOG_CALL << serial; + respond()->transferProtocolResponse(serial, toAidl(resultCode)); + return {}; +} + +} // namespace android::hardware::radio::compat diff --git a/radio/aidl/compat/libradiocompat/sap/structs.cpp b/radio/aidl/compat/libradiocompat/sap/structs.cpp new file mode 100644 index 0000000000..522056b0ca --- /dev/null +++ b/radio/aidl/compat/libradiocompat/sap/structs.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "structs.h" + +namespace android::hardware::radio::compat { + +namespace aidl = ::aidl::android::hardware::radio::sap; + +V1_0::SapApduType toHidl(const aidl::SapApduType sapApduType) { + return V1_0::SapApduType(sapApduType); +} + +V1_0::SapTransferProtocol toHidl(const aidl::SapTransferProtocol sapTransferProtocol) { + return V1_0::SapTransferProtocol(sapTransferProtocol); +} + +aidl::SapResultCode toAidl(const V1_0::SapResultCode sapResultCode) { + return aidl::SapResultCode(sapResultCode); +} + +aidl::SapConnectRsp toAidl(const V1_0::SapConnectRsp sapConnectRsp) { + return aidl::SapConnectRsp(sapConnectRsp); +} + +aidl::SapDisconnectType toAidl(const V1_0::SapDisconnectType sapDisconnectType) { + return aidl::SapDisconnectType(sapDisconnectType); +} + +aidl::SapStatus toAidl(const V1_0::SapStatus sapStatus) { + return aidl::SapStatus(sapStatus); +} + +} // namespace android::hardware::radio::compat diff --git a/radio/aidl/compat/libradiocompat/sap/structs.h b/radio/aidl/compat/libradiocompat/sap/structs.h new file mode 100644 index 0000000000..d88120de70 --- /dev/null +++ b/radio/aidl/compat/libradiocompat/sap/structs.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, eithe r express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include + +namespace android::hardware::radio::compat { + +V1_0::SapApduType toHidl(aidl::android::hardware::radio::sap::SapApduType sapAdpuType); +V1_0::SapTransferProtocol toHidl( + aidl::android::hardware::radio::sap::SapTransferProtocol sapTransferProtocol); + +aidl::android::hardware::radio::sap::SapResultCode toAidl(V1_0::SapResultCode sapResultCode); +aidl::android::hardware::radio::sap::SapConnectRsp toAidl(V1_0::SapConnectRsp sapConnectRsp); +aidl::android::hardware::radio::sap::SapDisconnectType toAidl( + V1_0::SapDisconnectType sapDisconnectType); +aidl::android::hardware::radio::sap::SapStatus toAidl(V1_0::SapStatus sapStatus); + +} // namespace android::hardware::radio::compat diff --git a/radio/aidl/compat/service/Android.bp b/radio/aidl/compat/service/Android.bp index 52eb71ff14..933e3e18d2 100644 --- a/radio/aidl/compat/service/Android.bp +++ b/radio/aidl/compat/service/Android.bp @@ -43,6 +43,7 @@ cc_binary { "android.hardware.radio.messaging-V1-ndk", "android.hardware.radio.modem-V1-ndk", "android.hardware.radio.network-V1-ndk", + "android.hardware.radio.sap-V1-ndk", "android.hardware.radio.sim-V1-ndk", "android.hardware.radio.voice-V1-ndk", "android.hardware.radio@1.0", diff --git a/radio/aidl/vts/Android.bp b/radio/aidl/vts/Android.bp index 021ee89f6d..97964b4fd7 100644 --- a/radio/aidl/vts/Android.bp +++ b/radio/aidl/vts/Android.bp @@ -50,6 +50,8 @@ cc_test { "radio_network_indication.cpp", "radio_network_response.cpp", "radio_network_test.cpp", + "radio_sap_callback.cpp", + "radio_sap_test.cpp", "radio_sim_indication.cpp", "radio_sim_response.cpp", "radio_sim_test.cpp", @@ -69,6 +71,7 @@ cc_test { "android.hardware.radio.messaging-V1-ndk", "android.hardware.radio.modem-V1-ndk", "android.hardware.radio.network-V1-ndk", + "android.hardware.radio.sap-V1-ndk", "android.hardware.radio.sim-V1-ndk", "android.hardware.radio.voice-V1-ndk", ], diff --git a/radio/aidl/vts/VtsHalRadioTargetTest.cpp b/radio/aidl/vts/VtsHalRadioTargetTest.cpp index 1ebc6afa8a..03d3c5a33c 100644 --- a/radio/aidl/vts/VtsHalRadioTargetTest.cpp +++ b/radio/aidl/vts/VtsHalRadioTargetTest.cpp @@ -21,6 +21,7 @@ #include "radio_messaging_utils.h" #include "radio_modem_utils.h" #include "radio_network_utils.h" +#include "radio_sap_utils.h" #include "radio_sim_utils.h" #include "radio_voice_utils.h" @@ -54,6 +55,11 @@ INSTANTIATE_TEST_SUITE_P( testing::ValuesIn(android::getAidlHalInstanceNames(IRadioNetwork::descriptor)), android::PrintInstanceNameToString); +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(RadioSapTest); +INSTANTIATE_TEST_SUITE_P(PerInstance, SapTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ISap::descriptor)), + android::PrintInstanceNameToString); + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(RadioSimTest); INSTANTIATE_TEST_SUITE_P(PerInstance, RadioSimTest, testing::ValuesIn(android::getAidlHalInstanceNames(IRadioSim::descriptor)), diff --git a/radio/aidl/vts/radio_sap_callback.cpp b/radio/aidl/vts/radio_sap_callback.cpp new file mode 100644 index 0000000000..3b21ede831 --- /dev/null +++ b/radio/aidl/vts/radio_sap_callback.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "radio_sap_utils.h" + +#include + +SapCallback::SapCallback(SapTest& parent) : parent_sap(parent) {} + +::ndk::ScopedAStatus SapCallback::apduResponse(int32_t serialNumber, SapResultCode resultCode, + const std::vector& /*apduRsp*/) { + sapResponseSerial = serialNumber; + sapResultCode = resultCode; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} +::ndk::ScopedAStatus SapCallback::connectResponse(int32_t serialNumber, + SapConnectRsp /*sapConnectRsp*/, + int32_t /*maxMsgSize*/) { + sapResponseSerial = serialNumber; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::disconnectIndication(int32_t /*serialNumber*/, + SapDisconnectType /*sapDisconnectType*/) { + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::disconnectResponse(int32_t serialNumber) { + sapResponseSerial = serialNumber; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::errorResponse(int32_t /*serialNumber*/) { + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::powerResponse(int32_t serialNumber, SapResultCode resultCode) { + sapResponseSerial = serialNumber; + sapResultCode = resultCode; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::resetSimResponse(int32_t serialNumber, SapResultCode resultCode) { + sapResponseSerial = serialNumber; + sapResultCode = resultCode; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::statusIndication(int32_t /*serialNumber*/, + SapStatus /*sapStatus*/) { + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::transferAtrResponse(int32_t serialNumber, + SapResultCode resultCode, + const std::vector& /*atr*/) { + sapResponseSerial = serialNumber; + sapResultCode = resultCode; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::transferCardReaderStatusResponse(int32_t serialNumber, + SapResultCode resultCode, + int32_t /*cardReaderStatus*/) { + sapResponseSerial = serialNumber; + sapResultCode = resultCode; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus SapCallback::transferProtocolResponse(int32_t serialNumber, + SapResultCode resultCode) { + sapResponseSerial = serialNumber; + sapResultCode = resultCode; + parent_sap.notify(serialNumber); + return ndk::ScopedAStatus::ok(); +} diff --git a/radio/aidl/vts/radio_sap_test.cpp b/radio/aidl/vts/radio_sap_test.cpp new file mode 100644 index 0000000000..c94379c934 --- /dev/null +++ b/radio/aidl/vts/radio_sap_test.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include + +#include "radio_sap_utils.h" + +#define ASSERT_OK(ret) ASSERT_TRUE((ret).isOk()) +#define TIMEOUT_PERIOD 40 + +void SapTest::SetUp() { + std::string serviceName = GetParam(); + if (!isServiceValidForDeviceConfiguration(serviceName)) { + LOG(DEBUG) << "Skipped the test due to device configuration."; + GTEST_SKIP(); + } + sap = ISap::fromBinder(ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); + ASSERT_NE(sap.get(), nullptr); + + sapCb = ndk::SharedRefBase::make(*this); + ASSERT_NE(sapCb.get(), nullptr); + + count = 0; + + ndk::ScopedAStatus res = sap->setCallback(sapCb); + ASSERT_OK(res) << res; +} + +void SapTest::TearDown() {} + +::testing::AssertionResult SapTest::CheckAnyOfErrors(SapResultCode err, + std::vector errors) { + for (size_t i = 0; i < errors.size(); i++) { + if (err == errors[i]) { + return testing::AssertionSuccess(); + } + } + return testing::AssertionFailure() << "SapError:" + toString(err) + " is returned"; +} + +void SapTest::notify(int receivedSerial) { + std::unique_lock lock(mtx); + count++; + if (serial == receivedSerial) { + cv.notify_one(); + } +} + +std::cv_status SapTest::wait() { + std::unique_lock lock(mtx); + + std::cv_status status = std::cv_status::no_timeout; + auto now = std::chrono::system_clock::now(); + while (count == 0) { + status = cv.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD)); + if (status == std::cv_status::timeout) { + return status; + } + } + count--; + return status; +} + +/* + * Test ISap.connectReq() for the response returned. + */ +TEST_P(SapTest, connectReq) { + LOG(DEBUG) << "connectReq"; + serial = GetRandomSerialNumber(); + int32_t maxMsgSize = 100; + + ndk::ScopedAStatus res = sap->connectReq(serial, maxMsgSize); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + + // Modem side need time for connect to finish. Adding a waiting time to prevent + // disconnect being requested right after connect request. + sleep(1); +} + +/* + * Test ISap.disconnectReq() for the response returned + */ +TEST_P(SapTest, disconnectReq) { + LOG(DEBUG) << "disconnectReq"; + serial = GetRandomSerialNumber(); + + ndk::ScopedAStatus res = sap->disconnectReq(serial); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + LOG(DEBUG) << "disconnectReq finished"; +} + +/* + * Test ISap.apduReq() for the response returned. + */ +TEST_P(SapTest, apduReq) { + LOG(DEBUG) << "apduReq"; + serial = GetRandomSerialNumber(); + SapApduType sapApduType = SapApduType::APDU; + std::vector command = {}; + + ndk::ScopedAStatus res = sap->apduReq(serial, sapApduType, command); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + + ASSERT_TRUE(CheckAnyOfErrors( + sapCb->sapResultCode, + {SapResultCode::GENERIC_FAILURE, SapResultCode::CARD_ALREADY_POWERED_OFF, + SapResultCode::CARD_NOT_ACCESSSIBLE, SapResultCode::CARD_REMOVED, + SapResultCode::SUCCESS})); + LOG(DEBUG) << "apduReq finished"; +} + +/* + * Test ISap.transferAtrReq() for the response returned. + */ +TEST_P(SapTest, transferAtrReq) { + LOG(DEBUG) << "transferAtrReq"; + serial = GetRandomSerialNumber(); + + ndk::ScopedAStatus res = sap->transferAtrReq(serial); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + + ASSERT_TRUE(CheckAnyOfErrors(sapCb->sapResultCode, + {SapResultCode::GENERIC_FAILURE, SapResultCode::DATA_NOT_AVAILABLE, + SapResultCode::CARD_ALREADY_POWERED_OFF, + SapResultCode::CARD_REMOVED, SapResultCode::SUCCESS})); + LOG(DEBUG) << "transferAtrReq finished"; +} + +/* + * Test ISap.powerReq() for the response returned. + */ +TEST_P(SapTest, powerReq) { + LOG(DEBUG) << "powerReq"; + serial = GetRandomSerialNumber(); + bool state = true; + + ndk::ScopedAStatus res = sap->powerReq(serial, state); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + + ASSERT_TRUE( + CheckAnyOfErrors(sapCb->sapResultCode, + {SapResultCode::GENERIC_FAILURE, SapResultCode::CARD_NOT_ACCESSSIBLE, + SapResultCode::CARD_ALREADY_POWERED_OFF, SapResultCode::CARD_REMOVED, + SapResultCode::CARD_ALREADY_POWERED_ON, SapResultCode::SUCCESS})); + LOG(DEBUG) << "powerReq finished"; +} + +/* + * Test ISap.resetSimReq() for the response returned. + */ +TEST_P(SapTest, resetSimReq) { + LOG(DEBUG) << "resetSimReq"; + serial = GetRandomSerialNumber(); + + ndk::ScopedAStatus res = sap->resetSimReq(serial); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + + ASSERT_TRUE( + CheckAnyOfErrors(sapCb->sapResultCode, + {SapResultCode::GENERIC_FAILURE, SapResultCode::CARD_NOT_ACCESSSIBLE, + SapResultCode::CARD_ALREADY_POWERED_OFF, SapResultCode::CARD_REMOVED, + SapResultCode::SUCCESS})); + LOG(DEBUG) << "resetSimReq finished"; +} + +/* + * Test ISap.transferCardReaderStatusReq() for the response returned. + */ +TEST_P(SapTest, transferCardReaderStatusReq) { + LOG(DEBUG) << "transferCardReaderStatusReq"; + serial = GetRandomSerialNumber(); + + ndk::ScopedAStatus res = sap->transferCardReaderStatusReq(serial); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + + ASSERT_TRUE(CheckAnyOfErrors(sapCb->sapResultCode, + {SapResultCode::GENERIC_FAILURE, SapResultCode::DATA_NOT_AVAILABLE, + SapResultCode::SUCCESS})); + LOG(DEBUG) << "transferCardReaderStatusReq finished"; +} + +/* + * Test ISap.setTransferProtocolReq() for the response returned. + */ +TEST_P(SapTest, setTransferProtocolReq) { + LOG(DEBUG) << "setTransferProtocolReq"; + serial = GetRandomSerialNumber(); + SapTransferProtocol sapTransferProtocol = SapTransferProtocol::T0; + + ndk::ScopedAStatus res = sap->setTransferProtocolReq(serial, sapTransferProtocol); + ASSERT_OK(res) << res; + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(sapCb->sapResponseSerial, serial); + + ASSERT_TRUE(CheckAnyOfErrors(sapCb->sapResultCode, + {SapResultCode::NOT_SUPPORTED, SapResultCode::SUCCESS})); + LOG(DEBUG) << "setTransferProtocolReq finished"; +} diff --git a/radio/aidl/vts/radio_sap_utils.h b/radio/aidl/vts/radio_sap_utils.h new file mode 100644 index 0000000000..bf17006d66 --- /dev/null +++ b/radio/aidl/vts/radio_sap_utils.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include +#include + +#include "radio_aidl_hal_utils.h" + +using namespace aidl::android::hardware::radio::sap; + +class SapTest; + +/* Callback class for radio sap response */ +class SapCallback : public BnSapCallback { + protected: + SapTest& parent_sap; + + public: + SapCallback(SapTest& parent_config); + virtual ~SapCallback() = default; + + int32_t sapResponseSerial; + SapResultCode sapResultCode; + + virtual ::ndk::ScopedAStatus apduResponse(int32_t serial, SapResultCode resultCode, + const std::vector& adpuRsp) override; + + virtual ::ndk::ScopedAStatus connectResponse(int32_t serial, SapConnectRsp sapConnectRsp, + int32_t maxMsgSize) override; + + virtual ::ndk::ScopedAStatus disconnectIndication(int32_t serial, + SapDisconnectType sapDisconnectType) override; + + virtual ::ndk::ScopedAStatus disconnectResponse(int32_t serial) override; + + virtual ::ndk::ScopedAStatus errorResponse(int32_t serial) override; + + virtual ::ndk::ScopedAStatus powerResponse(int32_t serial, SapResultCode resultCode) override; + + virtual ::ndk::ScopedAStatus resetSimResponse(int32_t serial, + SapResultCode resultCode) override; + + virtual ::ndk::ScopedAStatus statusIndication(int32_t serial, SapStatus sapStatus) override; + + virtual ::ndk::ScopedAStatus transferAtrResponse(int32_t serial, SapResultCode resultCode, + const std::vector& atr) override; + + virtual ::ndk::ScopedAStatus transferCardReaderStatusResponse( + int32_t serial, SapResultCode resultCode, int32_t cardReaderStatus) override; + + virtual ::ndk::ScopedAStatus transferProtocolResponse(int32_t serial, + SapResultCode resultCode) override; +}; + +// The main test class for AIDL SAP. +class SapTest : public ::testing::TestWithParam { + private: + std::mutex mtx; + std::condition_variable cv; + int count; + + public: + virtual void SetUp() override; + + virtual void TearDown() override; + + ::testing::AssertionResult CheckAnyOfErrors(SapResultCode err, + std::vector errors); + + /* Used as a mechanism to inform the test about data/event callback */ + void notify(int receivedSerial); + + /* Test code calls this function to wait for response */ + std::cv_status wait(); + + /* Sap service */ + std::shared_ptr sap; + + /* Sap Callback object */ + std::shared_ptr sapCb; + + /* Serial for sap request */ + int32_t serial; +};