diff options
author | Robert Greenwalt <rgreenwalt@google.com> | 2021-03-24 20:33:50 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-03-24 20:33:50 +0000 |
commit | 3e9cb7bc7b7c353951090909ba9f518987668d72 (patch) | |
tree | f814a88cc21db478881229b80ad05835508daf14 /radio/1.6 | |
parent | b1fe78fb63b41b6e97c5c4bb2ec9954c08827b46 (diff) | |
parent | 48966f0583e327e28066c17bfa3b342f417abd7c (diff) | |
download | platform_hardware_interfaces-3e9cb7bc7b7c353951090909ba9f518987668d72.tar.gz platform_hardware_interfaces-3e9cb7bc7b7c353951090909ba9f518987668d72.tar.bz2 platform_hardware_interfaces-3e9cb7bc7b7c353951090909ba9f518987668d72.zip |
Merge "Optimize SIM phonebook feature with new batch APIs"
Diffstat (limited to 'radio/1.6')
-rw-r--r-- | radio/1.6/IRadio.hal | 39 | ||||
-rw-r--r-- | radio/1.6/IRadioIndication.hal | 26 | ||||
-rw-r--r-- | radio/1.6/IRadioResponse.hal | 54 | ||||
-rw-r--r-- | radio/1.6/types.hal | 103 | ||||
-rw-r--r-- | radio/1.6/vts/functional/radio_hidl_hal_api.cpp | 138 | ||||
-rw-r--r-- | radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h | 24 | ||||
-rw-r--r-- | radio/1.6/vts/functional/radio_indication.cpp | 13 | ||||
-rw-r--r-- | radio/1.6/vts/functional/radio_response.cpp | 25 |
8 files changed, 421 insertions, 1 deletions
diff --git a/radio/1.6/IRadio.hal b/radio/1.6/IRadio.hal index d20133235e..a4e8811993 100644 --- a/radio/1.6/IRadio.hal +++ b/radio/1.6/IRadio.hal @@ -544,4 +544,43 @@ interface IRadio extends @1.5::IRadio { * as the input param. */ oneway setCarrierInfoForImsiEncryption_1_6(int32_t serial, @1.6::ImsiEncryptionInfo imsiEncryptionInfo); + + /** + * Get the local and global phonebook records from the SIM card. + * This should be called again after a simPhonebookChanged notification is received. + * + * The phonebook records are received via IRadioIndication.simPhonebookRecordsReceived() + * + * @param serial Serial number of request. + * + * Response callback is IRadioResponse.getSimPhonebookRecordsResponse() + */ + oneway getSimPhonebookRecords(int32_t serial); + + /** + * Get the phone book capacity + * + * @param serial Serial number of request. + * + * Response function is defined from IRadioResponse.getSimPhonebookCapacityResponse() + */ + oneway getSimPhonebookCapacity(int32_t serial); + + /** + * Insert, delete or update a phonebook record on the SIM card. + * If the index of recordInfo is 0, the phonebook record will be added to global or + * local phonebook, and global phonebook has higher priority than local phonebook. + * + * If the fields in the recordInfo are all empty except for the index, the phonebook + * record specified by the index will be deleted. + * + * The indication simPhonebookChanged will be called after every successful call of + * updateSimPhonebookRecords. + * + * @param serial Serial number of request. + * @param recordInfo Details of the record to insert, delete or update. + * + * Response callback is IRadioResponse.updateSimPhonebookRecordsResponse() + */ + oneway updateSimPhonebookRecords(int32_t serial, PhonebookRecordInfo recordInfo); }; diff --git a/radio/1.6/IRadioIndication.hal b/radio/1.6/IRadioIndication.hal index a53d7c1212..9788345f3f 100644 --- a/radio/1.6/IRadioIndication.hal +++ b/radio/1.6/IRadioIndication.hal @@ -23,7 +23,9 @@ import @1.6::LinkCapacityEstimate; import @1.6::NetworkScanResult; import @1.6::SignalStrength; import @1.6::SetupDataCallResult; +import @1.6::PbReceivedStatus; import @1.6::PhysicalChannelConfig; +import @1.6::PhonebookRecordInfo; /** * Interface declaring unsolicited radio indications. @@ -72,7 +74,6 @@ interface IRadioIndication extends @1.5::IRadioIndication { */ oneway currentLinkCapacityEstimate_1_6(RadioIndicationType type, LinkCapacityEstimate lce); - /** * Indicates current signal strength of the radio. * @@ -113,4 +114,27 @@ interface IRadioIndication extends @1.5::IRadioIndication { */ oneway currentPhysicalChannelConfigs_1_6(RadioIndicationType type, vec<PhysicalChannelConfig> configs); + + /** + * Indicates whether SIM phonebook is changed. + * + * This indication is sent whenever the SIM phonebook is changed, including SIM is + * inserted or removed and updated by IRadio.updateSimPhonebookRecords. + * + * @param type Type of radio indication + */ + oneway simPhonebookChanged(RadioIndicationType type); + + /** + * Indicates the content of all the used records in the SIM phonebook. + * + * This indication is associated with the API getSimPhonebookRecords and + * might be received more than once that is replying on the record count. + * + * @param type Type of radio indication + * @param status Status of PbReceivedStatus + * @param records Vector of PhonebookRecordInfo + */ + oneway simPhonebookRecordsReceived(RadioIndicationType type, + PbReceivedStatus status, vec<PhonebookRecordInfo> records); }; diff --git a/radio/1.6/IRadioResponse.hal b/radio/1.6/IRadioResponse.hal index 883711c9f1..f2c06b7af1 100644 --- a/radio/1.6/IRadioResponse.hal +++ b/radio/1.6/IRadioResponse.hal @@ -27,6 +27,7 @@ import @1.6::RadioResponseInfo; import @1.6::SetupDataCallResult; import @1.6::SignalStrength; import @1.6::SlicingConfig; +import @1.6::PhonebookCapacity; /** * Interface declaring response functions to solicited radio requests. @@ -436,4 +437,57 @@ interface IRadioResponse extends @1.5::IRadioResponse { */ oneway getSlicingConfigResponse(RadioResponseInfo info, SlicingConfig slicingConfig); + + /** + * @param info Response info struct containing response type, serial no. and error + * Valid errors returned: + * RadioError:NONE + * RadioError:RADIO_NOT_AVAILABLE + * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:INVALID_ARGUMENTS + * RadioError:INVALID_SIM_STATE + * RadioError:MODEM_ERR + * RadioError:INTERNAL_ERR + * REQUEST_NOT_SUPPORTED may only be returned on devices that don't support this API, + * indicated by the HAL capability CAPABILITY_SIM_PHONEBOOK_IN_MODEM. + */ + oneway getSimPhonebookRecordsResponse(RadioResponseInfo info); + + /** + * @param info Response info struct containing response type, serial no. and error + * @param capacity Response capacity enum indicating response processing status + * + * Valid errors returned: + * RadioError:NONE + * RadioError:RADIO_NOT_AVAILABLE + * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:INVALID_ARGUMENTS + * RadioError:INVALID_SIM_STATE + * RadioError:MODEM_ERR + * RadioError:INTERNAL_ERR + * REQUEST_NOT_SUPPORTED may only be returned on devices that don't support this API, + * indicated by the HAL capability CAPABILITY_SIM_PHONEBOOK_IN_MODEM. + */ + oneway getSimPhonebookCapacityResponse(RadioResponseInfo info, PhonebookCapacity capacity); + + /** + * @param info Response info struct containing response type, serial no. and error + * @param updatedRecordIndex The index of the updated or inserted record in the phonebook and + * the minimum value is 1 + * + * Valid errors returned: + * RadioError:NONE + * RadioError:RADIO_NOT_AVAILABLE + * RadioError:REQUEST_NOT_SUPPORTED + * RadioError:INVALID_ARGUMENTS + * RadioError:INVALID_SIM_STATE + * RadioError:MODEM_ERR + * RadioError:INTERNAL_ERR + * RadioError:SIM_ERR + * RadioError:NO_SUCH_ENTRY + * RadioError:NO_RESOURCES + * REQUEST_NOT_SUPPORTED may only be returned on devices that don't support this API, + * indicated by the HAL capability CAPABILITY_SIM_PHONEBOOK_IN_MODEM. + */ + oneway updateSimPhonebookRecordsResponse(RadioResponseInfo info, int32_t updatedRecordIndex); }; diff --git a/radio/1.6/types.hal b/radio/1.6/types.hal index c7564ce4af..82c9daadb9 100644 --- a/radio/1.6/types.hal +++ b/radio/1.6/types.hal @@ -1104,3 +1104,106 @@ struct ImsiEncryptionInfo { @1.1::ImsiEncryptionInfo base; PublicKeyType keyType; // Public key type }; + +/** + * Phonebook-record-information specified by EF_ADN(Abbreviated dialing numbers) + * record of SIM as per 3GPP spec 31.102 v15 Section-4.4.2.3. + */ +struct PhonebookRecordInfo { + /** Record index. 0 is used to insert a record */ + uint32_t recordId; + + /** Alpha identifier, empty string if no value */ + string name; + + /** Dialling number, empty string if no value */ + string number; + + /** Email addresses */ + vec<string> emails; + + /** Additional numbers */ + vec<string> additionalNumbers; +}; + +struct PhonebookCapacity { + /** + * Maximum number of ADN records possible in the SIM phonebook + * Needs to be non-negative + */ + int32_t maxAdnRecords; + + /** + * Used ADN records in the SIM phonebook + * Needs to be non-negative + */ + int32_t usedAdnRecords; + + /** + * Maximum email records possible in the SIM phonebook + * Needs to be non-negative + */ + int32_t maxEmailRecords; + + /** + * Used email records in the SIM phonebook + * Needs to be non-negative + */ + int32_t usedEmailRecords; + + /** + * Maximum additional number records possible in the SIM phonebook + * Needs to be non-negative + */ + int32_t maxAdditionalNumberRecords; + + /** + * Used additional number records in the SIM phonebook + * Needs to be non-negative + */ + int32_t usedAdditionalNumberRecords; + + /** + * Maximum name length possible in the SIM phonebook + * Needs to be non-negative + */ + int32_t maxNameLen; + + /** + * Maximum number length possible in the SIM phonebook + * Needs to be non-negative + */ + int32_t maxNumberLen; + + /** + * Maximum email length possible in the SIM phonebook + * Needs to be non-negative + */ + int32_t maxEmailLen; + + /** + * Maximum additional number length possible in the SIM phonebook + * Needs to be non-negative + */ + int32_t maxAdditionalNumberLen; +}; + +/** + * Enum representing the status of the received PB indication, + * PB_RECEIVED_OK indicates this retrieval is fine + * PB_RECEIVED_ERROR indicates one error happens, in general, the process + * can't be restored soon. + * PB_RECEIVED_ABORT indicates the process is interrupted, in this case, + * modem might need resources and interrupt the current process, or it is + * timed out to receive all indications, and client can retry soon. + * PB_RECEIVED_FINAL indicates the whole process is finished with a full + * chunk of phonebook data, means this is a last indication with the left + * data. + */ +enum PbReceivedStatus : int32_t { + PB_RECEIVED_OK = 1, + PB_RECEIVED_ERROR = 2, + PB_RECEIVED_ABORT = 3, + PB_RECEIVED_FINAL = 4, +}; + diff --git a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp index 7fde18ea46..4ebb0608e2 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp +++ b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp @@ -737,3 +737,141 @@ TEST_P(RadioHidlTest_v1_6, setCarrierInfoForImsiEncryption_1_6) { ::android::hardware::radio::V1_6::RadioError::REQUEST_NOT_SUPPORTED})); } } + +/* + * Test IRadio.getSimPhonebookRecords() for the response returned. + */ +TEST_F(RadioHidlTest_v1_6, getSimPhonebookRecords) { + serial = GetRandomSerialNumber(); + radio_v1_6->getSimPhonebookRecords(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + if (cardStatus.base.base.base.cardState == CardState::ABSENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::INVALID_SIM_STATE, + ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::MODEM_ERR, + ::android::hardware::radio::V1_6::RadioError::INVALID_ARGUMENTS, + ::android::hardware::radio::V1_6::RadioError::REQUEST_NOT_SUPPORTED}, + CHECK_GENERAL_ERROR)); + } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::NONE, + ::android::hardware::radio::V1_6::RadioError::REQUEST_NOT_SUPPORTED}, + CHECK_GENERAL_ERROR)); + } +} + +/* + * Test IRadio.getSimPhonebookCapacity for the response returned. + */ +TEST_P(RadioHidlTest_v1_6, getSimPhonebookCapacity) { + serial = GetRandomSerialNumber(); + radio_v1_6->getSimPhonebookCapacity(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + if (cardStatus.base.base.base.cardState == CardState::ABSENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::INVALID_SIM_STATE, + ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::MODEM_ERR, + ::android::hardware::radio::V1_6::RadioError::INVALID_ARGUMENTS, + ::android::hardware::radio::V1_6::RadioError::REQUEST_NOT_SUPPORTED}, + CHECK_GENERAL_ERROR)); + } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::NONE, + ::android::hardware::radio::V1_6::RadioError::REQUEST_NOT_SUPPORTED}, + CHECK_GENERAL_ERROR)); + + ::android::hardware::radio::V1_6::PhonebookCapacity pbCapacity = + radioRsp_v1_6->capacity; + if(pbCapacity.maxAdnRecords > 0) { + EXPECT_TRUE(pbCapacity.maxNameLen > 0 && pbCapacity.maxNumberLen > 0); + EXPECT_TRUE(pbCapacity.usedAdnRecords <= pbCapacity.maxAdnRecords); + } + + if(pbCapacity.maxEmailRecords > 0) { + EXPECT_TRUE(pbCapacity.maxEmailLen > 0); + EXPECT_TRUE(pbCapacity.usedEmailRecords <= pbCapacity.maxEmailRecords); + } + + if(pbCapacity.maxAdditionalNumberRecords > 0) { + EXPECT_TRUE(pbCapacity.maxAdditionalNumberLen > 0); + EXPECT_TRUE(pbCapacity.usedAdditionalNumberRecords <= pbCapacity.maxAdditionalNumberRecords); + } + } +} + +/* + * Test IRadio.updateSimPhonebookRecords() for the response returned. + */ +TEST_F(RadioHidlTest_v1_6, updateSimPhonebookRecords) { + serial = GetRandomSerialNumber(); + radio_v1_6->getSimPhonebookCapacity(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + if (cardStatus.base.base.base.cardState == CardState::ABSENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::INVALID_SIM_STATE, + ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::MODEM_ERR, + ::android::hardware::radio::V1_6::RadioError::INVALID_ARGUMENTS, + ::android::hardware::radio::V1_6::RadioError::REQUEST_NOT_SUPPORTED}, + CHECK_GENERAL_ERROR)); + } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) { + ASSERT_TRUE(CheckAnyOfErrors( + radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::NONE, + ::android::hardware::radio::V1_6::RadioError::REQUEST_NOT_SUPPORTED}, + CHECK_GENERAL_ERROR)); + ::android::hardware::radio::V1_6::PhonebookCapacity pbCapacity = + radioRsp_v1_6->capacity; + + serial = GetRandomSerialNumber(); + radio_v1_6->getSimPhonebookRecords(serial); + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); + + if(pbCapacity.maxAdnRecords > 0 + && pbCapacity.usedAdnRecords < pbCapacity.maxAdnRecords) { + // Add a phonebook record + PhonebookRecordInfo recordInfo; + recordInfo.recordId = 0; + recordInfo.name = "ABC"; + recordInfo.number = "1234567890"; + serial = GetRandomSerialNumber(); + radio_v1_6->updateSimPhonebookRecords(serial, recordInfo); + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); + int index = radioRsp_v1_6->updatedRecordIndex; + EXPECT_TRUE(index > 0); + + // Deleted a phonebook record + recordInfo.recordId = index; + recordInfo.name = ""; + recordInfo.number = ""; + serial = GetRandomSerialNumber(); + radio_v1_6->updateSimPhonebookRecords(serial, recordInfo); + + EXPECT_EQ(std::cv_status::no_timeout, wait()); + EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); + EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); + EXPECT_EQ(::android::hardware::radio::V1_6::RadioError::NONE, radioRsp_v1_6->rspInfo.error); + } + } +} diff --git a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h index 23378b53d0..4fc17e54d0 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h +++ b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h @@ -103,6 +103,11 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon ::android::hardware::hidl_vec<::android::hardware::radio::V1_5::BarringInfo> barringInfos; RadioResponse_v1_6(RadioResponseWaiter& parent_v1_6); + + // Phone Book + ::android::hardware::radio::V1_6::PhonebookCapacity capacity; + int32_t updatedRecordIndex; + virtual ~RadioResponse_v1_6() = default; Return<void> getIccCardStatusResponse( @@ -829,6 +834,17 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon Return<void> getSlicingConfigResponse( const ::android::hardware::radio::V1_6::RadioResponseInfo& info, const ::android::hardware::radio::V1_6::SlicingConfig& slicingConfig); + + Return<void> getSimPhonebookRecordsResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info); + + Return<void> getSimPhonebookCapacityResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info, + const ::android::hardware::radio::V1_6::PhonebookCapacity& capacity); + + Return<void> updateSimPhonebookRecordsResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info, + int32_t updatedRecordIndex); }; /* Callback class for radio indication */ @@ -1073,6 +1089,14 @@ class RadioIndication_v1_6 : public ::android::hardware::radio::V1_6::IRadioIndi const ::android::hardware::radio::V1_5::CellIdentity& /*cellIdentity*/, const ::android::hardware::hidl_vec<::android::hardware::radio::V1_5::BarringInfo>& /*barringInfos*/); + + Return<void> simPhonebookChanged(RadioIndicationType type); + + Return<void> simPhonebookRecordsReceived( + RadioIndicationType type, + ::android::hardware::radio::V1_6::PbReceivedStatus status, + const ::android::hardware::hidl_vec<::android::hardware::radio::V1_6::PhonebookRecordInfo>& + records); }; // The main test class for Radio HIDL. diff --git a/radio/1.6/vts/functional/radio_indication.cpp b/radio/1.6/vts/functional/radio_indication.cpp index e7a96807a9..8292131740 100644 --- a/radio/1.6/vts/functional/radio_indication.cpp +++ b/radio/1.6/vts/functional/radio_indication.cpp @@ -412,3 +412,16 @@ Return<void> RadioIndication_v1_6::cellInfoList_1_6( ::android::hardware::radio::V1_6::CellInfo>& /*records*/) { return Void(); } + +Return<void> RadioIndication_v1_6::simPhonebookChanged( + RadioIndicationType /*type*/) { + return Void(); +} + +Return<void> RadioIndication_v1_6::simPhonebookRecordsReceived( + RadioIndicationType /*type*/, + ::android::hardware::radio::V1_6::PbReceivedStatus /*status*/, + const ::android::hardware::hidl_vec< + ::android::hardware::radio::V1_6::PhonebookRecordInfo>& /*records*/) { + return Void(); +} diff --git a/radio/1.6/vts/functional/radio_response.cpp b/radio/1.6/vts/functional/radio_response.cpp index 09cfbf18a2..50df34acc9 100644 --- a/radio/1.6/vts/functional/radio_response.cpp +++ b/radio/1.6/vts/functional/radio_response.cpp @@ -1234,3 +1234,28 @@ Return<void> RadioResponse_v1_6::getSlicingConfigResponse( parent_v1_6.notify(info.serial); return Void(); } + +Return<void> RadioResponse_v1_6::getSimPhonebookRecordsResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info) { + rspInfo = info; + parent_v1_6.notify(info.serial); + return Void(); +} + +Return<void> RadioResponse_v1_6::getSimPhonebookCapacityResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info, + const ::android::hardware::radio::V1_6::PhonebookCapacity& capacity) { + rspInfo = info; + this->capacity = capacity; + parent_v1_6.notify(info.serial); + return Void(); +} + +Return<void> RadioResponse_v1_6::updateSimPhonebookRecordsResponse( + const ::android::hardware::radio::V1_6::RadioResponseInfo& info, + int32_t updatedRecordIndex) { + rspInfo = info; + this->updatedRecordIndex = updatedRecordIndex; + parent_v1_6.notify(info.serial); + return Void(); +} |