diff options
author | Mengjun Leng <quic_mengju@quicinc.com> | 2021-03-16 10:09:20 +0800 |
---|---|---|
committer | Sukanya Rajkhowa <sukanyar@quicinc.com> | 2021-03-23 10:33:58 -0700 |
commit | 48966f0583e327e28066c17bfa3b342f417abd7c (patch) | |
tree | 8c7e4c43253b9ba74abc517b57f8a45efc4b2739 | |
parent | 442a08d3ee2b0a38fca873da22d4e317ea5b7e45 (diff) |
Optimize SIM phonebook feature with new batch APIs
1. Declare new request and response for loading and updating SIM
contacts.
2. Add data dispatch function for new reponse and request APIs.
Bug: 23044962
Change-Id: I43d196c84558d7951d85bc938672091edeb378ec
-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 d0c2984d13..f029d0e5e2 100644 --- a/radio/1.6/vts/functional/radio_response.cpp +++ b/radio/1.6/vts/functional/radio_response.cpp @@ -1232,3 +1232,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(); +} |