Merge changes from topic "isap_hidl2aidl"

* changes:
  [ISap hidl2aidl] VTS Tests
  [ISap hidl2aidl] Compat Support
  Radio: hidl2aidl for ISap interface
This commit is contained in:
Pomai Ahlo
2022-12-16 01:21:44 +00:00
committed by Android (Google) Code Review
33 changed files with 1618 additions and 0 deletions

View File

@@ -512,6 +512,16 @@
<instance>slot3</instance>
</interface>
</hal>
<hal format="aidl" optional="true">
<name>android.hardware.radio.sap</name>
<version>1</version>
<interface>
<name>ISap</name>
<instance>slot1</instance>
<instance>slot2</instance>
<instance>slot3</instance>
</interface>
</hal>
<hal format="aidl" optional="true">
<name>android.hardware.radio.voice</name>
<version>2</version>

View File

@@ -152,6 +152,23 @@ 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: {
sdk_version: "module_current",
},
},
}
aidl_interface {
name: "android.hardware.radio.sim",
vendor_available: true,

View File

@@ -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 <name>-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);
}

View File

@@ -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 <name>-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);
}

View File

@@ -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 <name>-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,
}

View File

@@ -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 <name>-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,
}

View File

@@ -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 <name>-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,
}

View File

@@ -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 <name>-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,
}

View File

@@ -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 <name>-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,
}

View File

@@ -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 <name>-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,
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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,
}

View File

@@ -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,
}

View File

@@ -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,
}

View File

@@ -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,
}

View File

@@ -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,
}

View File

@@ -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,
}

View File

@@ -41,6 +41,7 @@ cc_library {
"android.hardware.radio.messaging-V2-ndk",
"android.hardware.radio.modem-V2-ndk",
"android.hardware.radio.network-V2-ndk",
"android.hardware.radio.sap-V1-ndk",
"android.hardware.radio.sim-V2-ndk",
"android.hardware.radio.voice-V2-ndk",
"android.hardware.radio@1.0",
@@ -86,6 +87,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",

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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 <aidl/android/hardware/radio/sap/BnSap.h>
#include <android/hardware/radio/1.0/ISap.h>
#include <android/hardware/radio/1.0/ISapCallback.h>
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<radio::V1_0::ISap> mHal;
const sp<SapCallback> mSapCallback;
::ndk::ScopedAStatus apduReq(int32_t serial,
aidl::android::hardware::radio::sap::SapApduType type,
const std::vector<uint8_t>& 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<V1_0::ISap> hidlHal);
};
} // namespace android::hardware::radio::compat

View File

@@ -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 <aidl/android/hardware/radio/sap/ISapCallback.h>
#include <android/hardware/radio/1.0/ISapCallback.h>
namespace android::hardware::radio::compat {
class SapCallback : public V1_0::ISapCallback {
GuaranteedCallback<aidl::android::hardware::radio::sap::ISapCallback,
aidl::android::hardware::radio::sap::ISapCallbackDefault>
mCallback;
Return<void> apduResponse(int32_t serial, V1_0::SapResultCode resultCode,
const ::android::hardware::hidl_vec<uint8_t>& apduRsp) override;
Return<void> connectResponse(int32_t serial, V1_0::SapConnectRsp sapConnectRsp,
int32_t maxMsgSize) override;
Return<void> disconnectIndication(int32_t serial,
V1_0::SapDisconnectType disconnectType) override;
Return<void> disconnectResponse(int32_t serial) override;
Return<void> errorResponse(int32_t serial) override;
Return<void> powerResponse(int32_t serial, V1_0::SapResultCode resultCode) override;
Return<void> resetSimResponse(int32_t serial, V1_0::SapResultCode resultCode) override;
Return<void> statusIndication(int32_t serial, V1_0::SapStatus status) override;
Return<void> transferAtrResponse(int32_t serial, V1_0::SapResultCode resultCode,
const ::android::hardware::hidl_vec<uint8_t>& atr) override;
Return<void> transferCardReaderStatusResponse(int32_t serial, V1_0::SapResultCode resultCode,
int32_t cardReaderStatus) override;
Return<void> transferProtocolResponse(int32_t serial, V1_0::SapResultCode resultCode) override;
public:
void setResponseFunction(
const std::shared_ptr<aidl::android::hardware::radio::sap::ISapCallback>& callback);
std::shared_ptr<aidl::android::hardware::radio::sap::ISapCallback> respond();
};
} // namespace android::hardware::radio::compat

View File

@@ -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 <libradiocompat/Sap.h>
#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<V1_0::ISap> hidlHal) : mHal(hidlHal), mSapCallback(sp<SapCallback>::make()) {}
ScopedAStatus Sap::apduReq(int32_t serial, aidl::SapApduType type,
const std::vector<uint8_t>& 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

View File

@@ -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 <libradiocompat/SapCallback.h>
#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<aidl::ISapCallback>& callback) {
mCallback = callback;
}
std::shared_ptr<aidl::ISapCallback> SapCallback::respond() {
return mCallback.get();
}
Return<void> SapCallback::apduResponse(int32_t serial, V1_0::SapResultCode resultCode,
const hidl_vec<uint8_t>& apduRsp) {
LOG_CALL << serial;
respond()->apduResponse(serial, toAidl(resultCode), apduRsp);
return {};
}
Return<void> SapCallback::connectResponse(int32_t serial, V1_0::SapConnectRsp sapConnectRsp,
int32_t maxMsgSize) {
LOG_CALL << serial;
respond()->connectResponse(serial, toAidl(sapConnectRsp), maxMsgSize);
return {};
}
Return<void> SapCallback::disconnectIndication(int32_t serial,
V1_0::SapDisconnectType disconnectType) {
LOG_CALL << serial;
respond()->disconnectIndication(serial, toAidl(disconnectType));
return {};
}
Return<void> SapCallback::disconnectResponse(int32_t serial) {
LOG_CALL << serial;
respond()->disconnectResponse(serial);
return {};
}
Return<void> SapCallback::errorResponse(int32_t serial) {
LOG_CALL << serial;
respond()->errorResponse(serial);
return {};
}
Return<void> SapCallback::powerResponse(int32_t serial, V1_0::SapResultCode resultCode) {
LOG_CALL << serial;
respond()->powerResponse(serial, toAidl(resultCode));
return {};
}
Return<void> SapCallback::resetSimResponse(int32_t serial, V1_0::SapResultCode resultCode) {
LOG_CALL << serial;
respond()->resetSimResponse(serial, toAidl(resultCode));
return {};
}
Return<void> SapCallback::statusIndication(int32_t serial, V1_0::SapStatus status) {
LOG_CALL << serial;
respond()->statusIndication(serial, toAidl(status));
return {};
}
Return<void> SapCallback::transferAtrResponse(int32_t serial, V1_0::SapResultCode resultCode,
const hidl_vec<uint8_t>& atr) {
LOG_CALL << serial;
respond()->transferAtrResponse(serial, toAidl(resultCode), atr);
return {};
}
Return<void> SapCallback::transferCardReaderStatusResponse(int32_t serial,
V1_0::SapResultCode resultCode,
int32_t cardReaderStatus) {
LOG_CALL << serial;
respond()->transferCardReaderStatusResponse(serial, toAidl(resultCode), cardReaderStatus);
return {};
}
Return<void> SapCallback::transferProtocolResponse(int32_t serial, V1_0::SapResultCode resultCode) {
LOG_CALL << serial;
respond()->transferProtocolResponse(serial, toAidl(resultCode));
return {};
}
} // namespace android::hardware::radio::compat

View File

@@ -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

View File

@@ -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 <aidl/android/hardware/radio/sap/ISap.h>
#include <android/hardware/radio/1.0/types.h>
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

View File

@@ -44,6 +44,7 @@ cc_binary {
"android.hardware.radio.messaging-V2-ndk",
"android.hardware.radio.modem-V2-ndk",
"android.hardware.radio.network-V2-ndk",
"android.hardware.radio.sap-V1-ndk",
"android.hardware.radio.sim-V2-ndk",
"android.hardware.radio.voice-V2-ndk",
"android.hardware.radio@1.0",

View File

@@ -53,6 +53,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",
@@ -73,6 +75,7 @@ cc_test {
"android.hardware.radio.messaging-V2-ndk",
"android.hardware.radio.modem-V2-ndk",
"android.hardware.radio.network-V2-ndk",
"android.hardware.radio.sap-V1-ndk",
"android.hardware.radio.sim-V2-ndk",
"android.hardware.radio.voice-V2-ndk",
],

View File

@@ -22,6 +22,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"
@@ -55,6 +56,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)),

View File

@@ -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 <android-base/logging.h>
SapCallback::SapCallback(SapTest& parent) : parent_sap(parent) {}
::ndk::ScopedAStatus SapCallback::apduResponse(int32_t serialNumber, SapResultCode resultCode,
const std::vector<uint8_t>& /*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<uint8_t>& /*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();
}

View File

@@ -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 <android-base/logging.h>
#include <android/binder_manager.h>
#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<SapCallback>(*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<SapResultCode> 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<std::mutex> lock(mtx);
count++;
if (serial == receivedSerial) {
cv.notify_one();
}
}
std::cv_status SapTest::wait() {
std::unique_lock<std::mutex> 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<uint8_t> 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";
}

View File

@@ -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 <aidl/Gtest.h>
#include <aidl/android/hardware/radio/sap/BnSapCallback.h>
#include <aidl/android/hardware/radio/sap/ISap.h>
#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<uint8_t>& 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<uint8_t>& 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<std::string> {
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<SapResultCode> 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<ISap> sap;
/* Sap Callback object */
std::shared_ptr<SapCallback> sapCb;
/* Serial for sap request */
int32_t serial;
};