| /* |
| * Copyright (C) 2021 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 com.android.internal.telephony; |
| |
| import static android.telephony.TelephonyManager.CAPABILITY_NR_DUAL_CONNECTIVITY_CONFIGURATION_AVAILABLE; |
| import static android.telephony.TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED; |
| import static android.telephony.TelephonyManager.CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE; |
| import static android.telephony.TelephonyManager.CAPABILITY_SIM_PHONEBOOK_IN_MODEM; |
| import static android.telephony.TelephonyManager.CAPABILITY_SLICING_CONFIG_SUPPORTED; |
| import static android.telephony.TelephonyManager.CAPABILITY_THERMAL_MITIGATION_DATA_THROTTLING; |
| import static android.telephony.TelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK; |
| |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ALLOCATE_PDU_SESSION_ID; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ALLOW_DATA; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ANSWER; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_BASEBAND_VERSION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CANCEL_HANDOVER; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CANCEL_USSD; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_BROADCAST_ACTIVATION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_BURST_DTMF; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_FLASH; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SUBSCRIPTION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_BARRING_PASSWORD; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_SIM_PIN; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_SIM_PIN2; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CONFERENCE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DATA_CALL_LIST; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DATA_REGISTRATION_STATE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DELETE_SMS_ON_SIM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEVICE_IDENTITY; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DIAL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF_START; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF_STOP; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EMERGENCY_DIAL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_MODEM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_UICC_APPLICATIONS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_VONR; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PIN; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PIN2; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PUK; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PUK2; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EXPLICIT_CALL_TRANSFER; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ACTIVITY_INFO; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ALLOWED_CARRIERS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_BARRING_INFO; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CELL_INFO_LIST; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CLIR; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CURRENT_CALLS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_DC_RT_INFO; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_HARDWARE_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMEI; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMEISV; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMSI; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_MODEM_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_MUTE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_NEIGHBORING_CELL_IDS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_PHONE_CAPABILITY; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_RADIO_CAPABILITY; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SLICING_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SLOT_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SMSC_ADDRESS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_USAGE_SETTING; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_BROADCAST_ACTIVATION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_GET_BROADCAST_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_SET_BROADCAST_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_REGISTRATION_STATE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_SEND_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ISIM_AUTHENTICATION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IS_VONR_ENABLED; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_LAST_CALL_FAIL_CAUSE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_READ_ITEM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_RESET_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_WRITE_CDMA_PRL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_WRITE_ITEM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OEM_HOOK_RAW; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OEM_HOOK_STRINGS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OPERATOR; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_PULL_LCEDATA; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_AVAILABLE_NETWORKS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CALL_FORWARD_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CALL_WAITING; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CLIP; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_FACILITY_LOCK; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_TTY_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RADIO_POWER; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RELEASE_PDU_SESSION_ID; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_REPORT_SMS_MEMORY_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RESET_RADIO; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SCREEN_STATE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_DEVICE_STATE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS_EXPECT_MORE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_USSD; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEPARATE_CONNECTION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_ALLOWED_CARRIERS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_BAND_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CALL_FORWARD; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CALL_WAITING; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CLIR; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DATA_PROFILE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DATA_THROTTLING; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DC_RT_INFO_RATE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_FACILITY_LOCK; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_INITIAL_ATTACH_APN; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LOCATION_UPDATES; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_MUTE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_PREFERRED_DATA_MODEM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_RADIO_CAPABILITY; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SIM_CARD_POWER; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SMSC_ADDRESS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_TTY_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UICC_SUBSCRIPTION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_USAGE_SETTING; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SHUTDOWN; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIGNAL_STRENGTH; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_AUTHENTICATION; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_CLOSE_CHANNEL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_IO; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_OPEN_CHANNEL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SMS_ACKNOWLEDGE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_HANDOVER; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_KEEPALIVE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_LCE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_NETWORK_SCAN; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_GET_PROFILE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SET_PROFILE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_KEEPALIVE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_LCE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_NETWORK_SCAN; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_UDUB; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORD; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_VOICE_RADIO_TECH; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_VOICE_REGISTRATION_STATE; |
| import static com.android.internal.telephony.RILConstants.RIL_REQUEST_WRITE_SMS_TO_SIM; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_BARRING_INFO_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CALL_RING; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_CALL_WAITING; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_INFO_REC; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_OTA_PROVISION_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_PRL_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CELL_INFO_LIST; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_DATA_CALL_LIST_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_DC_RT_INFO_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_EMERGENCY_NUMBER_LIST; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_HARDWARE_CONFIG_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ICC_SLOT_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_KEEPALIVE_STATUS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_LCEDATA_RECV; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_MODEM_RESTART; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_NETWORK_SCAN_RESULT; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_NITZ_TIME_RECEIVED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_OEM_HOOK_RAW; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_SS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_USSD; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_USSD_REQUEST; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PCO_DATA; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RADIO_CAPABILITY; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_REGISTRATION_FAILED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESEND_INCALL_MUTE; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_CDMA_NEW_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESTRICTED_STATE_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RIL_CONNECTED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RINGBACK_TONE; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIGNAL_STRENGTH; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIM_REFRESH; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIM_SMS_STORAGE_FULL; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SRVCC_STATE_NOTIFY; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_CALL_SETUP; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_CC_ALPHA_NOTIFY; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_EVENT_NOTIFY; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_PROACTIVE_COMMAND; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_SESSION_END; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SUPP_SVC_NOTIFICATION; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UNTHROTTLE_APN; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_VOICE_RADIO_TECH_CHANGED; |
| |
| import android.annotation.Nullable; |
| import android.net.InetAddresses; |
| import android.net.LinkAddress; |
| import android.net.LinkProperties; |
| import android.os.SystemClock; |
| import android.service.carrier.CarrierIdentifier; |
| import android.telephony.AccessNetworkConstants; |
| import android.telephony.Annotation; |
| import android.telephony.BarringInfo; |
| import android.telephony.CarrierRestrictionRules; |
| import android.telephony.CellConfigLte; |
| import android.telephony.CellIdentity; |
| import android.telephony.CellIdentityCdma; |
| import android.telephony.CellIdentityGsm; |
| import android.telephony.CellIdentityLte; |
| import android.telephony.CellIdentityNr; |
| import android.telephony.CellIdentityTdscdma; |
| import android.telephony.CellIdentityWcdma; |
| import android.telephony.CellInfo; |
| import android.telephony.CellInfoCdma; |
| import android.telephony.CellInfoGsm; |
| import android.telephony.CellInfoLte; |
| import android.telephony.CellInfoNr; |
| import android.telephony.CellInfoTdscdma; |
| import android.telephony.CellInfoWcdma; |
| import android.telephony.CellSignalStrength; |
| import android.telephony.CellSignalStrengthCdma; |
| import android.telephony.CellSignalStrengthGsm; |
| import android.telephony.CellSignalStrengthLte; |
| import android.telephony.CellSignalStrengthNr; |
| import android.telephony.CellSignalStrengthTdscdma; |
| import android.telephony.CellSignalStrengthWcdma; |
| import android.telephony.ClosedSubscriberGroupInfo; |
| import android.telephony.LinkCapacityEstimate; |
| import android.telephony.ModemInfo; |
| import android.telephony.PhoneCapability; |
| import android.telephony.PhoneNumberUtils; |
| import android.telephony.PhysicalChannelConfig; |
| import android.telephony.RadioAccessSpecifier; |
| import android.telephony.ServiceState; |
| import android.telephony.SignalStrength; |
| import android.telephony.SignalThresholdInfo; |
| import android.telephony.SmsManager; |
| import android.telephony.TelephonyManager; |
| import android.telephony.UiccSlotMapping; |
| import android.telephony.data.ApnSetting; |
| import android.telephony.data.DataCallResponse; |
| import android.telephony.data.DataProfile; |
| import android.telephony.data.EpsQos; |
| import android.telephony.data.NetworkSliceInfo; |
| import android.telephony.data.NetworkSlicingConfig; |
| import android.telephony.data.NrQos; |
| import android.telephony.data.Qos; |
| import android.telephony.data.QosBearerFilter; |
| import android.telephony.data.QosBearerSession; |
| import android.telephony.data.RouteSelectionDescriptor; |
| import android.telephony.data.TrafficDescriptor; |
| import android.telephony.data.UrspRule; |
| import android.text.TextUtils; |
| import android.util.ArraySet; |
| import android.util.SparseArray; |
| |
| import com.android.internal.annotations.VisibleForTesting; |
| import com.android.internal.telephony.cat.ComprehensionTlv; |
| import com.android.internal.telephony.cat.ComprehensionTlvTag; |
| import com.android.internal.telephony.cdma.SmsMessage; |
| import com.android.internal.telephony.cdma.sms.CdmaSmsAddress; |
| import com.android.internal.telephony.cdma.sms.CdmaSmsSubaddress; |
| import com.android.internal.telephony.cdma.sms.SmsEnvelope; |
| import com.android.internal.telephony.data.KeepaliveStatus; |
| import com.android.internal.telephony.data.KeepaliveStatus.KeepaliveStatusCode; |
| import com.android.internal.telephony.uicc.AdnCapacity; |
| import com.android.internal.telephony.uicc.IccCardApplicationStatus; |
| import com.android.internal.telephony.uicc.IccCardStatus; |
| import com.android.internal.telephony.uicc.IccSimPortInfo; |
| import com.android.internal.telephony.uicc.IccSlotPortMapping; |
| import com.android.internal.telephony.uicc.IccSlotStatus; |
| import com.android.internal.telephony.uicc.IccUtils; |
| import com.android.internal.telephony.uicc.SimPhonebookRecord; |
| import com.android.telephony.Rlog; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.DataInputStream; |
| import java.io.IOException; |
| import java.lang.reflect.Array; |
| import java.lang.reflect.Field; |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| import java.lang.reflect.Modifier; |
| import java.net.Inet4Address; |
| import java.net.InetAddress; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Objects; |
| import java.util.Set; |
| import java.util.stream.Collectors; |
| |
| /** |
| * Utils class for HAL <-> RIL conversions |
| */ |
| public class RILUtils { |
| private static final String TAG = "RILUtils"; |
| |
| // The number of required config values for broadcast SMS stored in RIL_CdmaBroadcastServiceInfo |
| public static final int CDMA_BSI_NO_OF_INTS_STRUCT = 3; |
| // The number of service categories for broadcast SMS |
| public static final int CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES = 31; |
| |
| // Radio power failure UUIDs |
| public static final String RADIO_POWER_FAILURE_BUGREPORT_UUID = |
| "316f3801-fa21-4954-a42f-0041eada3b31"; |
| public static final String RADIO_POWER_FAILURE_RF_HARDWARE_ISSUE_UUID = |
| "316f3801-fa21-4954-a42f-0041eada3b32"; |
| public static final String RADIO_POWER_FAILURE_NO_RF_CALIBRATION_UUID = |
| "316f3801-fa21-4954-a42f-0041eada3b33"; |
| |
| private static final Set<Class> WRAPPER_CLASSES = new HashSet(Arrays.asList( |
| Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, |
| Float.class, Double.class)); |
| |
| /** |
| * Convert to PersoSubstate defined in radio/1.5/types.hal |
| * @param persoType PersoSubState type |
| * @return The converted PersoSubstate |
| */ |
| public static int convertToHalPersoType( |
| IccCardApplicationStatus.PersoSubState persoType) { |
| switch (persoType) { |
| case PERSOSUBSTATE_IN_PROGRESS: |
| return android.hardware.radio.V1_5.PersoSubstate.IN_PROGRESS; |
| case PERSOSUBSTATE_READY: |
| return android.hardware.radio.V1_5.PersoSubstate.READY; |
| case PERSOSUBSTATE_SIM_NETWORK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK; |
| case PERSOSUBSTATE_SIM_NETWORK_SUBSET: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_SUBSET; |
| case PERSOSUBSTATE_SIM_CORPORATE: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_CORPORATE; |
| case PERSOSUBSTATE_SIM_SERVICE_PROVIDER: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SERVICE_PROVIDER; |
| case PERSOSUBSTATE_SIM_SIM: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SIM; |
| case PERSOSUBSTATE_SIM_NETWORK_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_PUK; |
| case PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_SUBSET_PUK; |
| case PERSOSUBSTATE_SIM_CORPORATE_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_CORPORATE_PUK; |
| case PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SERVICE_PROVIDER_PUK; |
| case PERSOSUBSTATE_SIM_SIM_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SIM_PUK; |
| case PERSOSUBSTATE_RUIM_NETWORK1: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK1; |
| case PERSOSUBSTATE_RUIM_NETWORK2: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK2; |
| case PERSOSUBSTATE_RUIM_HRPD: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_HRPD; |
| case PERSOSUBSTATE_RUIM_CORPORATE: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_CORPORATE; |
| case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_SERVICE_PROVIDER; |
| case PERSOSUBSTATE_RUIM_RUIM: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_RUIM; |
| case PERSOSUBSTATE_RUIM_NETWORK1_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK1_PUK; |
| case PERSOSUBSTATE_RUIM_NETWORK2_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK2_PUK; |
| case PERSOSUBSTATE_RUIM_HRPD_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_HRPD_PUK; |
| case PERSOSUBSTATE_RUIM_CORPORATE_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_CORPORATE_PUK; |
| case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_SERVICE_PROVIDER_PUK; |
| case PERSOSUBSTATE_RUIM_RUIM_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.RUIM_RUIM_PUK; |
| case PERSOSUBSTATE_SIM_SPN: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SPN; |
| case PERSOSUBSTATE_SIM_SPN_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SPN_PUK; |
| case PERSOSUBSTATE_SIM_SP_EHPLMN: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SP_EHPLMN; |
| case PERSOSUBSTATE_SIM_SP_EHPLMN_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_SP_EHPLMN_PUK; |
| case PERSOSUBSTATE_SIM_ICCID: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_ICCID; |
| case PERSOSUBSTATE_SIM_ICCID_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_ICCID_PUK; |
| case PERSOSUBSTATE_SIM_IMPI: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_IMPI; |
| case PERSOSUBSTATE_SIM_IMPI_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_IMPI_PUK; |
| case PERSOSUBSTATE_SIM_NS_SP: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_NS_SP; |
| case PERSOSUBSTATE_SIM_NS_SP_PUK: |
| return android.hardware.radio.V1_5.PersoSubstate.SIM_NS_SP_PUK; |
| default: |
| return android.hardware.radio.V1_5.PersoSubstate.UNKNOWN; |
| } |
| } |
| |
| /** |
| * Convert to PersoSubstate.aidl |
| * @param persoType PersoSubState type |
| * @return The converted PersoSubstate |
| */ |
| public static int convertToHalPersoTypeAidl( |
| IccCardApplicationStatus.PersoSubState persoType) { |
| switch (persoType) { |
| case PERSOSUBSTATE_IN_PROGRESS: |
| return android.hardware.radio.sim.PersoSubstate.IN_PROGRESS; |
| case PERSOSUBSTATE_READY: |
| return android.hardware.radio.sim.PersoSubstate.READY; |
| case PERSOSUBSTATE_SIM_NETWORK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK; |
| case PERSOSUBSTATE_SIM_NETWORK_SUBSET: |
| return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK_SUBSET; |
| case PERSOSUBSTATE_SIM_CORPORATE: |
| return android.hardware.radio.sim.PersoSubstate.SIM_CORPORATE; |
| case PERSOSUBSTATE_SIM_SERVICE_PROVIDER: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SERVICE_PROVIDER; |
| case PERSOSUBSTATE_SIM_SIM: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SIM; |
| case PERSOSUBSTATE_SIM_NETWORK_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK_PUK; |
| case PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK_SUBSET_PUK; |
| case PERSOSUBSTATE_SIM_CORPORATE_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_CORPORATE_PUK; |
| case PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SERVICE_PROVIDER_PUK; |
| case PERSOSUBSTATE_SIM_SIM_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SIM_PUK; |
| case PERSOSUBSTATE_RUIM_NETWORK1: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK1; |
| case PERSOSUBSTATE_RUIM_NETWORK2: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK2; |
| case PERSOSUBSTATE_RUIM_HRPD: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_HRPD; |
| case PERSOSUBSTATE_RUIM_CORPORATE: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_CORPORATE; |
| case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_SERVICE_PROVIDER; |
| case PERSOSUBSTATE_RUIM_RUIM: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_RUIM; |
| case PERSOSUBSTATE_RUIM_NETWORK1_PUK: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK1_PUK; |
| case PERSOSUBSTATE_RUIM_NETWORK2_PUK: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK2_PUK; |
| case PERSOSUBSTATE_RUIM_HRPD_PUK: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_HRPD_PUK; |
| case PERSOSUBSTATE_RUIM_CORPORATE_PUK: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_CORPORATE_PUK; |
| case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_SERVICE_PROVIDER_PUK; |
| case PERSOSUBSTATE_RUIM_RUIM_PUK: |
| return android.hardware.radio.sim.PersoSubstate.RUIM_RUIM_PUK; |
| case PERSOSUBSTATE_SIM_SPN: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SPN; |
| case PERSOSUBSTATE_SIM_SPN_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SPN_PUK; |
| case PERSOSUBSTATE_SIM_SP_EHPLMN: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SP_EHPLMN; |
| case PERSOSUBSTATE_SIM_SP_EHPLMN_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_SP_EHPLMN_PUK; |
| case PERSOSUBSTATE_SIM_ICCID: |
| return android.hardware.radio.sim.PersoSubstate.SIM_ICCID; |
| case PERSOSUBSTATE_SIM_ICCID_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_ICCID_PUK; |
| case PERSOSUBSTATE_SIM_IMPI: |
| return android.hardware.radio.sim.PersoSubstate.SIM_IMPI; |
| case PERSOSUBSTATE_SIM_IMPI_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_IMPI_PUK; |
| case PERSOSUBSTATE_SIM_NS_SP: |
| return android.hardware.radio.sim.PersoSubstate.SIM_NS_SP; |
| case PERSOSUBSTATE_SIM_NS_SP_PUK: |
| return android.hardware.radio.sim.PersoSubstate.SIM_NS_SP_PUK; |
| default: |
| return android.hardware.radio.sim.PersoSubstate.UNKNOWN; |
| } |
| } |
| |
| /** |
| * Convert to GsmSmsMessage defined in radio/1.0/types.hal |
| * @param smscPdu SMSC address |
| * @param pdu SMS in PDU format |
| * @return A converted GsmSmsMessage |
| */ |
| public static android.hardware.radio.V1_0.GsmSmsMessage convertToHalGsmSmsMessage( |
| String smscPdu, String pdu) { |
| android.hardware.radio.V1_0.GsmSmsMessage msg = |
| new android.hardware.radio.V1_0.GsmSmsMessage(); |
| msg.smscPdu = smscPdu == null ? "" : smscPdu; |
| msg.pdu = pdu == null ? "" : pdu; |
| return msg; |
| } |
| |
| /** |
| * Convert to GsmSmsMessage.aidl |
| * @param smscPdu SMSC address |
| * @param pdu SMS in PDU format |
| * @return A converted GsmSmsMessage |
| */ |
| public static android.hardware.radio.messaging.GsmSmsMessage convertToHalGsmSmsMessageAidl( |
| String smscPdu, String pdu) { |
| android.hardware.radio.messaging.GsmSmsMessage msg = |
| new android.hardware.radio.messaging.GsmSmsMessage(); |
| msg.smscPdu = convertNullToEmptyString(smscPdu); |
| msg.pdu = convertNullToEmptyString(pdu); |
| return msg; |
| } |
| |
| /** |
| * Convert to CdmaSmsMessage defined in radio/1.0/types.hal |
| * @param pdu SMS in PDU format |
| * @return A converted CdmaSmsMessage |
| */ |
| public static android.hardware.radio.V1_0.CdmaSmsMessage convertToHalCdmaSmsMessage( |
| byte[] pdu) { |
| android.hardware.radio.V1_0.CdmaSmsMessage msg = |
| new android.hardware.radio.V1_0.CdmaSmsMessage(); |
| int addrNbrOfDigits; |
| int subaddrNbrOfDigits; |
| int bearerDataLength; |
| ByteArrayInputStream bais = new ByteArrayInputStream(pdu); |
| DataInputStream dis = new DataInputStream(bais); |
| |
| try { |
| msg.teleserviceId = dis.readInt(); // teleServiceId |
| msg.isServicePresent = (byte) dis.readInt() == 1; // servicePresent |
| msg.serviceCategory = dis.readInt(); // serviceCategory |
| msg.address.digitMode = dis.read(); // address digit mode |
| msg.address.numberMode = dis.read(); // address number mode |
| msg.address.numberType = dis.read(); // address number type |
| msg.address.numberPlan = dis.read(); // address number plan |
| addrNbrOfDigits = (byte) dis.read(); |
| for (int i = 0; i < addrNbrOfDigits; i++) { |
| msg.address.digits.add(dis.readByte()); // address_orig_bytes[i] |
| } |
| msg.subAddress.subaddressType = dis.read(); //subaddressType |
| msg.subAddress.odd = (byte) dis.read() == 1; //subaddr odd |
| subaddrNbrOfDigits = (byte) dis.read(); |
| for (int i = 0; i < subaddrNbrOfDigits; i++) { |
| msg.subAddress.digits.add(dis.readByte()); //subaddr_orig_bytes[i] |
| } |
| |
| bearerDataLength = dis.read(); |
| for (int i = 0; i < bearerDataLength; i++) { |
| msg.bearerData.add(dis.readByte()); //bearerData[i] |
| } |
| } catch (IOException ex) { |
| } |
| return msg; |
| } |
| |
| /** |
| * Convert to CdmaSmsMessage.aidl |
| * @param pdu SMS in PDU format |
| * @return The converted CdmaSmsMessage |
| */ |
| public static android.hardware.radio.messaging.CdmaSmsMessage convertToHalCdmaSmsMessageAidl( |
| byte[] pdu) { |
| android.hardware.radio.messaging.CdmaSmsMessage msg = |
| new android.hardware.radio.messaging.CdmaSmsMessage(); |
| int addrNbrOfDigits; |
| int subaddrNbrOfDigits; |
| int bearerDataLength; |
| ByteArrayInputStream bais = new ByteArrayInputStream(pdu); |
| DataInputStream dis = new DataInputStream(bais); |
| |
| try { |
| msg.teleserviceId = dis.readInt(); // teleServiceId |
| msg.isServicePresent = (byte) dis.readInt() == 1; // servicePresent |
| msg.serviceCategory = dis.readInt(); // serviceCategory |
| msg.address.digitMode = dis.read(); // address digit mode |
| msg.address.isNumberModeDataNetwork = |
| dis.read() == CdmaSmsAddress.NUMBER_MODE_DATA_NETWORK; // address number mode |
| msg.address.numberType = dis.read(); // address number type |
| msg.address.numberPlan = dis.read(); // address number plan |
| addrNbrOfDigits = (byte) dis.read(); |
| byte[] digits = new byte[addrNbrOfDigits]; |
| for (int i = 0; i < addrNbrOfDigits; i++) { |
| digits[i] = dis.readByte(); // address_orig_bytes[i] |
| } |
| msg.address.digits = digits; |
| msg.subAddress.subaddressType = dis.read(); //subaddressType |
| msg.subAddress.odd = (byte) dis.read() == 1; //subaddr odd |
| subaddrNbrOfDigits = (byte) dis.read(); |
| digits = new byte[subaddrNbrOfDigits]; |
| for (int i = 0; i < subaddrNbrOfDigits; i++) { |
| digits[i] = dis.readByte(); //subaddr_orig_bytes[i] |
| } |
| msg.subAddress.digits = digits; |
| |
| bearerDataLength = dis.read(); |
| byte[] bearerData = new byte[bearerDataLength]; |
| for (int i = 0; i < bearerDataLength; i++) { |
| bearerData[i] = dis.readByte(); //bearerData[i] |
| } |
| msg.bearerData = bearerData; |
| } catch (IOException ex) { |
| } |
| return msg; |
| } |
| |
| /** |
| * Convert CdmaSmsMessage defined in radio/1.0/types.hal to SmsMessage |
| * Note only primitive fields are set |
| * @param cdmaSmsMessage CdmaSmsMessage defined in radio/1.0/types.hal |
| * @return A converted SmsMessage |
| */ |
| public static SmsMessage convertHalCdmaSmsMessage( |
| android.hardware.radio.V1_0.CdmaSmsMessage cdmaSmsMessage) { |
| // Note: Parcel.readByte actually reads one Int and masks to byte |
| SmsEnvelope env = new SmsEnvelope(); |
| CdmaSmsAddress addr = new CdmaSmsAddress(); |
| CdmaSmsSubaddress subaddr = new CdmaSmsSubaddress(); |
| byte[] data; |
| byte count; |
| int countInt; |
| int addressDigitMode; |
| |
| //currently not supported by the modem-lib: env.mMessageType |
| env.teleService = cdmaSmsMessage.teleserviceId; |
| |
| if (cdmaSmsMessage.isServicePresent) { |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_BROADCAST; |
| } else { |
| if (SmsEnvelope.TELESERVICE_NOT_SET == env.teleService) { |
| // assume type ACK |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_ACKNOWLEDGE; |
| } else { |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT; |
| } |
| } |
| env.serviceCategory = cdmaSmsMessage.serviceCategory; |
| |
| // address |
| addressDigitMode = cdmaSmsMessage.address.digitMode; |
| addr.digitMode = (byte) (0xFF & addressDigitMode); |
| addr.numberMode = (byte) (0xFF & cdmaSmsMessage.address.numberMode); |
| addr.ton = cdmaSmsMessage.address.numberType; |
| addr.numberPlan = (byte) (0xFF & cdmaSmsMessage.address.numberPlan); |
| count = (byte) cdmaSmsMessage.address.digits.size(); |
| addr.numberOfDigits = count; |
| data = new byte[count]; |
| for (int index = 0; index < count; index++) { |
| data[index] = cdmaSmsMessage.address.digits.get(index); |
| |
| // convert the value if it is 4-bit DTMF to 8 bit |
| if (addressDigitMode == CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF) { |
| data[index] = SmsMessage.convertDtmfToAscii(data[index]); |
| } |
| } |
| |
| addr.origBytes = data; |
| |
| subaddr.type = cdmaSmsMessage.subAddress.subaddressType; |
| subaddr.odd = (byte) (cdmaSmsMessage.subAddress.odd ? 1 : 0); |
| count = (byte) cdmaSmsMessage.subAddress.digits.size(); |
| |
| if (count < 0) { |
| count = 0; |
| } |
| |
| // p_cur->sSubAddress.digits[digitCount] : |
| |
| data = new byte[count]; |
| |
| for (int index = 0; index < count; ++index) { |
| data[index] = cdmaSmsMessage.subAddress.digits.get(index); |
| } |
| |
| subaddr.origBytes = data; |
| |
| /* currently not supported by the modem-lib: |
| env.bearerReply |
| env.replySeqNo |
| env.errorClass |
| env.causeCode |
| */ |
| |
| // bearer data |
| countInt = cdmaSmsMessage.bearerData.size(); |
| if (countInt < 0) { |
| countInt = 0; |
| } |
| |
| data = new byte[countInt]; |
| for (int index = 0; index < countInt; index++) { |
| data[index] = cdmaSmsMessage.bearerData.get(index); |
| } |
| // BD gets further decoded when accessed in SMSDispatcher |
| env.bearerData = data; |
| |
| // link the filled objects to the SMS |
| env.origAddress = addr; |
| env.origSubaddress = subaddr; |
| |
| SmsMessage msg = new SmsMessage(addr, env); |
| |
| return msg; |
| } |
| |
| /** |
| * Convert CdmaSmsMessage defined in CdmaSmsMessage.aidl to SmsMessage |
| * Note only primitive fields are set |
| * @param msg CdmaSmsMessage defined in CdmaSmsMessage.aidl |
| * @return A converted SmsMessage |
| */ |
| public static SmsMessage convertHalCdmaSmsMessage( |
| android.hardware.radio.messaging.CdmaSmsMessage msg) { |
| // Note: Parcel.readByte actually reads one Int and masks to byte |
| SmsEnvelope env = new SmsEnvelope(); |
| CdmaSmsAddress addr = new CdmaSmsAddress(); |
| CdmaSmsSubaddress subaddr = new CdmaSmsSubaddress(); |
| |
| // address |
| int addressDigitMode = msg.address.digitMode; |
| addr.digitMode = (byte) (0xFF & addressDigitMode); |
| addr.numberMode = (byte) (0xFF & (msg.address.isNumberModeDataNetwork ? 1 : 0)); |
| addr.ton = msg.address.numberType; |
| addr.numberPlan = (byte) (0xFF & msg.address.numberPlan); |
| addr.numberOfDigits = msg.address.digits.length; |
| byte[] data = new byte[msg.address.digits.length]; |
| for (int index = 0; index < data.length; index++) { |
| data[index] = msg.address.digits[index]; |
| // convert the value if it is 4-bit DTMF to 8 bit |
| if (addressDigitMode == CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF) { |
| data[index] = SmsMessage.convertDtmfToAscii(data[index]); |
| } |
| } |
| addr.origBytes = data; |
| |
| // subaddress |
| subaddr.type = msg.subAddress.subaddressType; |
| subaddr.odd = (byte) (msg.subAddress.odd ? 1 : 0); |
| subaddr.origBytes = msg.subAddress.digits; |
| |
| // envelope |
| // currently not supported by the modem-lib: env.bearerReply, env.replySeqNo, |
| // env.errorClass, env.causeCode, env.mMessageType |
| env.teleService = msg.teleserviceId; |
| if (msg.isServicePresent) { |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_BROADCAST; |
| } else { |
| if (SmsEnvelope.TELESERVICE_NOT_SET == env.teleService) { |
| // assume type ACK |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_ACKNOWLEDGE; |
| } else { |
| env.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT; |
| } |
| } |
| env.serviceCategory = msg.serviceCategory; |
| |
| // bearer data is further decoded when accessed in SmsDispatcher |
| env.bearerData = msg.bearerData; |
| |
| // link the filled objects to the SMS |
| env.origAddress = addr; |
| env.origSubaddress = subaddr; |
| |
| return new SmsMessage(addr, env); |
| } |
| |
| /** |
| * Convert to DataProfileInfo defined in radio/1.0/types.hal |
| * @param dp Data profile |
| * @return The converted DataProfileInfo |
| */ |
| public static android.hardware.radio.V1_0.DataProfileInfo convertToHalDataProfile10( |
| DataProfile dp) { |
| android.hardware.radio.V1_0.DataProfileInfo dpi = |
| new android.hardware.radio.V1_0.DataProfileInfo(); |
| |
| dpi.profileId = dp.getProfileId(); |
| dpi.apn = dp.getApn(); |
| dpi.protocol = ApnSetting.getProtocolStringFromInt(dp.getProtocolType()); |
| dpi.roamingProtocol = ApnSetting.getProtocolStringFromInt(dp.getRoamingProtocolType()); |
| dpi.authType = dp.getAuthType(); |
| dpi.user = TextUtils.emptyIfNull(dp.getUserName()); |
| dpi.password = TextUtils.emptyIfNull(dp.getPassword()); |
| dpi.type = dp.getType(); |
| dpi.maxConnsTime = dp.getMaxConnectionsTime(); |
| dpi.maxConns = dp.getMaxConnections(); |
| dpi.waitTime = dp.getWaitTime(); |
| dpi.enabled = dp.isEnabled(); |
| dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); |
| // Shift by 1 bit due to the discrepancy between |
| // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of |
| // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. |
| dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( |
| dp.getBearerBitmask()) << 1; |
| dpi.mtu = dp.getMtuV4(); |
| dpi.mvnoType = android.hardware.radio.V1_0.MvnoType.NONE; |
| dpi.mvnoMatchData = ""; |
| |
| return dpi; |
| } |
| |
| /** |
| * Convert to DataProfileInfo defined in radio/1.4/types.hal |
| * @param dp Data profile |
| * @return The converted DataProfileInfo |
| */ |
| public static android.hardware.radio.V1_4.DataProfileInfo convertToHalDataProfile14( |
| DataProfile dp) { |
| android.hardware.radio.V1_4.DataProfileInfo dpi = |
| new android.hardware.radio.V1_4.DataProfileInfo(); |
| |
| dpi.apn = dp.getApn(); |
| dpi.protocol = dp.getProtocolType(); |
| dpi.roamingProtocol = dp.getRoamingProtocolType(); |
| dpi.authType = dp.getAuthType(); |
| dpi.user = TextUtils.emptyIfNull(dp.getUserName()); |
| dpi.password = TextUtils.emptyIfNull(dp.getPassword()); |
| dpi.type = dp.getType(); |
| dpi.maxConnsTime = dp.getMaxConnectionsTime(); |
| dpi.maxConns = dp.getMaxConnections(); |
| dpi.waitTime = dp.getWaitTime(); |
| dpi.enabled = dp.isEnabled(); |
| dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); |
| // Shift by 1 bit due to the discrepancy between |
| // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of |
| // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. |
| dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( |
| dp.getBearerBitmask()) << 1; |
| dpi.mtu = dp.getMtuV4(); |
| dpi.persistent = dp.isPersistent(); |
| dpi.preferred = dp.isPreferred(); |
| |
| // profile id is only meaningful when it's persistent on the modem. |
| dpi.profileId = (dpi.persistent) ? dp.getProfileId() |
| : android.hardware.radio.V1_0.DataProfileId.INVALID; |
| |
| return dpi; |
| } |
| |
| /** |
| * Convert to DataProfileInfo defined in radio/1.5/types.hal |
| * @param dp Data profile |
| * @return The converted DataProfileInfo |
| */ |
| public static android.hardware.radio.V1_5.DataProfileInfo convertToHalDataProfile15( |
| DataProfile dp) { |
| android.hardware.radio.V1_5.DataProfileInfo dpi = |
| new android.hardware.radio.V1_5.DataProfileInfo(); |
| |
| dpi.apn = dp.getApn(); |
| dpi.protocol = dp.getProtocolType(); |
| dpi.roamingProtocol = dp.getRoamingProtocolType(); |
| dpi.authType = dp.getAuthType(); |
| dpi.user = TextUtils.emptyIfNull(dp.getUserName()); |
| dpi.password = TextUtils.emptyIfNull(dp.getPassword()); |
| dpi.type = dp.getType(); |
| dpi.maxConnsTime = dp.getMaxConnectionsTime(); |
| dpi.maxConns = dp.getMaxConnections(); |
| dpi.waitTime = dp.getWaitTime(); |
| dpi.enabled = dp.isEnabled(); |
| dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); |
| // Shift by 1 bit due to the discrepancy between |
| // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of |
| // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. |
| dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( |
| dp.getBearerBitmask()) << 1; |
| dpi.mtuV4 = dp.getMtuV4(); |
| dpi.mtuV6 = dp.getMtuV6(); |
| dpi.persistent = dp.isPersistent(); |
| dpi.preferred = dp.isPreferred(); |
| |
| // profile id is only meaningful when it's persistent on the modem. |
| dpi.profileId = (dpi.persistent) ? dp.getProfileId() |
| : android.hardware.radio.V1_0.DataProfileId.INVALID; |
| |
| return dpi; |
| } |
| |
| /** |
| * Convert to DataProfileInfo.aidl |
| * @param dp Data profile |
| * @return The converted DataProfileInfo |
| */ |
| public static android.hardware.radio.data.DataProfileInfo convertToHalDataProfile( |
| DataProfile dp) { |
| android.hardware.radio.data.DataProfileInfo dpi = |
| new android.hardware.radio.data.DataProfileInfo(); |
| |
| dpi.apn = dp.getApn(); |
| dpi.protocol = dp.getProtocolType(); |
| dpi.roamingProtocol = dp.getRoamingProtocolType(); |
| dpi.authType = dp.getAuthType(); |
| dpi.user = convertNullToEmptyString(dp.getUserName()); |
| dpi.password = convertNullToEmptyString(dp.getPassword()); |
| dpi.type = dp.getType(); |
| dpi.maxConnsTime = dp.getMaxConnectionsTime(); |
| dpi.maxConns = dp.getMaxConnections(); |
| dpi.waitTime = dp.getWaitTime(); |
| dpi.enabled = dp.isEnabled(); |
| dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); |
| // Shift by 1 bit due to the discrepancy between RadioAccessFamily.aidl and the bitmask |
| // version of ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. |
| dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( |
| dp.getBearerBitmask()) << 1; |
| dpi.mtuV4 = dp.getMtuV4(); |
| dpi.mtuV6 = dp.getMtuV6(); |
| dpi.persistent = dp.isPersistent(); |
| dpi.preferred = dp.isPreferred(); |
| dpi.alwaysOn = dp.getApnSetting().isAlwaysOn(); |
| dpi.trafficDescriptor = convertToHalTrafficDescriptorAidl(dp.getTrafficDescriptor()); |
| |
| // profile id is only meaningful when it's persistent on the modem. |
| dpi.profileId = (dpi.persistent) ? dp.getProfileId() |
| : android.hardware.radio.data.DataProfileInfo.ID_INVALID; |
| |
| return dpi; |
| } |
| |
| /** |
| * Convert from DataProfileInfo.aidl to DataProfile |
| * @param dpi DataProfileInfo |
| * @return The converted DataProfile |
| */ |
| public static DataProfile convertToDataProfile( |
| android.hardware.radio.data.DataProfileInfo dpi) { |
| ApnSetting apnSetting = new ApnSetting.Builder() |
| .setEntryName(dpi.apn) |
| .setApnName(dpi.apn) |
| .setApnTypeBitmask(dpi.supportedApnTypesBitmap) |
| .setAuthType(dpi.authType) |
| .setMaxConnsTime(dpi.maxConnsTime) |
| .setMaxConns(dpi.maxConns) |
| .setWaitTime(dpi.waitTime) |
| .setCarrierEnabled(dpi.enabled) |
| .setModemCognitive(dpi.persistent) |
| .setMtuV4(dpi.mtuV4) |
| .setMtuV6(dpi.mtuV6) |
| .setNetworkTypeBitmask(ServiceState.convertBearerBitmaskToNetworkTypeBitmask( |
| dpi.bearerBitmap) >> 1) |
| .setProfileId(dpi.profileId) |
| .setPassword(dpi.password) |
| .setProtocol(dpi.protocol) |
| .setRoamingProtocol(dpi.roamingProtocol) |
| .setUser(dpi.user) |
| .setAlwaysOn(dpi.alwaysOn) |
| .build(); |
| |
| TrafficDescriptor td; |
| try { |
| td = convertHalTrafficDescriptor(dpi.trafficDescriptor); |
| } catch (IllegalArgumentException e) { |
| loge("convertToDataProfile: Failed to convert traffic descriptor. e=" + e); |
| td = null; |
| } |
| |
| return new DataProfile.Builder() |
| .setType(dpi.type) |
| .setPreferred(dpi.preferred) |
| .setTrafficDescriptor(td) |
| .setApnSetting(apnSetting) |
| .build(); |
| } |
| |
| /** |
| * Convert to OptionalSliceInfo defined in radio/1.6/types.hal |
| * @param sliceInfo Slice info |
| * @return The converted OptionalSliceInfo |
| */ |
| public static android.hardware.radio.V1_6.OptionalSliceInfo convertToHalSliceInfo( |
| @Nullable NetworkSliceInfo sliceInfo) { |
| android.hardware.radio.V1_6.OptionalSliceInfo optionalSliceInfo = |
| new android.hardware.radio.V1_6.OptionalSliceInfo(); |
| if (sliceInfo == null) { |
| return optionalSliceInfo; |
| } |
| |
| android.hardware.radio.V1_6.SliceInfo si = new android.hardware.radio.V1_6.SliceInfo(); |
| si.sst = (byte) sliceInfo.getSliceServiceType(); |
| si.mappedHplmnSst = (byte) sliceInfo.getMappedHplmnSliceServiceType(); |
| si.sliceDifferentiator = sliceInfo.getSliceDifferentiator(); |
| si.mappedHplmnSD = sliceInfo.getMappedHplmnSliceDifferentiator(); |
| optionalSliceInfo.value(si); |
| return optionalSliceInfo; |
| } |
| |
| /** |
| * Convert to SliceInfo.aidl |
| * @param sliceInfo Slice info |
| * @return The converted SliceInfo |
| */ |
| public static android.hardware.radio.data.SliceInfo convertToHalSliceInfoAidl( |
| @Nullable NetworkSliceInfo sliceInfo) { |
| if (sliceInfo == null) { |
| return null; |
| } |
| |
| android.hardware.radio.data.SliceInfo si = new android.hardware.radio.data.SliceInfo(); |
| si.sliceServiceType = (byte) sliceInfo.getSliceServiceType(); |
| si.mappedHplmnSst = (byte) sliceInfo.getMappedHplmnSliceServiceType(); |
| si.sliceDifferentiator = sliceInfo.getSliceDifferentiator(); |
| si.mappedHplmnSd = sliceInfo.getMappedHplmnSliceDifferentiator(); |
| return si; |
| } |
| |
| /** |
| * Convert to OptionalTrafficDescriptor defined in radio/1.6/types.hal |
| * @param trafficDescriptor Traffic descriptor |
| * @return The converted OptionalTrafficDescriptor |
| */ |
| public static android.hardware.radio.V1_6.OptionalTrafficDescriptor |
| convertToHalTrafficDescriptor(@Nullable TrafficDescriptor trafficDescriptor) { |
| android.hardware.radio.V1_6.OptionalTrafficDescriptor optionalTrafficDescriptor = |
| new android.hardware.radio.V1_6.OptionalTrafficDescriptor(); |
| if (trafficDescriptor == null) { |
| return optionalTrafficDescriptor; |
| } |
| |
| android.hardware.radio.V1_6.TrafficDescriptor td = |
| new android.hardware.radio.V1_6.TrafficDescriptor(); |
| |
| android.hardware.radio.V1_6.OptionalDnn optionalDnn = |
| new android.hardware.radio.V1_6.OptionalDnn(); |
| if (trafficDescriptor.getDataNetworkName() != null) { |
| optionalDnn.value(trafficDescriptor.getDataNetworkName()); |
| } |
| td.dnn = optionalDnn; |
| |
| android.hardware.radio.V1_6.OptionalOsAppId optionalOsAppId = |
| new android.hardware.radio.V1_6.OptionalOsAppId(); |
| if (trafficDescriptor.getOsAppId() != null) { |
| android.hardware.radio.V1_6.OsAppId osAppId = new android.hardware.radio.V1_6.OsAppId(); |
| osAppId.osAppId = primitiveArrayToArrayList(trafficDescriptor.getOsAppId()); |
| optionalOsAppId.value(osAppId); |
| } |
| td.osAppId = optionalOsAppId; |
| |
| optionalTrafficDescriptor.value(td); |
| return optionalTrafficDescriptor; |
| } |
| |
| /** |
| * Convert to TrafficDescriptor.aidl |
| * @param trafficDescriptor Traffic descriptor |
| * @return The converted TrafficDescriptor |
| */ |
| public static android.hardware.radio.data.TrafficDescriptor |
| convertToHalTrafficDescriptorAidl(@Nullable TrafficDescriptor trafficDescriptor) { |
| if (trafficDescriptor == null) { |
| return new android.hardware.radio.data.TrafficDescriptor(); |
| } |
| |
| android.hardware.radio.data.TrafficDescriptor td = |
| new android.hardware.radio.data.TrafficDescriptor(); |
| td.dnn = trafficDescriptor.getDataNetworkName(); |
| if (trafficDescriptor.getOsAppId() == null) { |
| td.osAppId = null; |
| } else { |
| android.hardware.radio.data.OsAppId osAppId = new android.hardware.radio.data.OsAppId(); |
| osAppId.osAppId = trafficDescriptor.getOsAppId(); |
| td.osAppId = osAppId; |
| } |
| return td; |
| } |
| |
| /** |
| * Convert to ResetNvType defined in radio/1.0/types.hal |
| * @param resetType NV reset type |
| * @return The converted reset type in integer or -1 if param is invalid |
| */ |
| public static int convertToHalResetNvType(int resetType) { |
| /** |
| * resetType values |
| * 1 - reload all NV items |
| * 2 - erase NV reset (SCRTN) |
| * 3 - factory reset (RTN) |
| */ |
| switch (resetType) { |
| case 1: return android.hardware.radio.V1_0.ResetNvType.RELOAD; |
| case 2: return android.hardware.radio.V1_0.ResetNvType.ERASE; |
| case 3: return android.hardware.radio.V1_0.ResetNvType.FACTORY_RESET; |
| } |
| return -1; |
| } |
| |
| /** |
| * Convert to ResetNvType.aidl |
| * @param resetType NV reset type |
| * @return The converted reset type in integer or -1 if param is invalid |
| */ |
| public static int convertToHalResetNvTypeAidl(int resetType) { |
| /** |
| * resetType values |
| * 1 - reload all NV items |
| * 2 - erase NV reset (SCRTN) |
| * 3 - factory reset (RTN) |
| */ |
| switch (resetType) { |
| case 1: return android.hardware.radio.modem.ResetNvType.RELOAD; |
| case 2: return android.hardware.radio.modem.ResetNvType.ERASE; |
| case 3: return android.hardware.radio.modem.ResetNvType.FACTORY_RESET; |
| } |
| return -1; |
| } |
| |
| /** |
| * Convert to a list of LinkAddress defined in radio/1.5/types.hal |
| * @param linkProperties Link properties |
| * @return The converted list of LinkAddresses |
| */ |
| public static ArrayList<android.hardware.radio.V1_5.LinkAddress> convertToHalLinkProperties15( |
| LinkProperties linkProperties) { |
| ArrayList<android.hardware.radio.V1_5.LinkAddress> addresses15 = new ArrayList<>(); |
| if (linkProperties != null) { |
| for (android.net.LinkAddress la : linkProperties.getAllLinkAddresses()) { |
| android.hardware.radio.V1_5.LinkAddress linkAddress = |
| new android.hardware.radio.V1_5.LinkAddress(); |
| linkAddress.address = la.getAddress().getHostAddress(); |
| linkAddress.properties = la.getFlags(); |
| linkAddress.deprecationTime = la.getDeprecationTime(); |
| linkAddress.expirationTime = la.getExpirationTime(); |
| addresses15.add(linkAddress); |
| } |
| } |
| return addresses15; |
| } |
| |
| /** |
| * Convert to a list of LinkAddress.aidl |
| * @param linkProperties Link properties |
| * @return The converted list of LinkAddresses |
| */ |
| public static android.hardware.radio.data.LinkAddress[] convertToHalLinkProperties( |
| LinkProperties linkProperties) { |
| if (linkProperties == null) { |
| return new android.hardware.radio.data.LinkAddress[0]; |
| } |
| android.hardware.radio.data.LinkAddress[] addresses = |
| new android.hardware.radio.data.LinkAddress[ |
| linkProperties.getAllLinkAddresses().size()]; |
| for (int i = 0; i < linkProperties.getAllLinkAddresses().size(); i++) { |
| LinkAddress la = linkProperties.getAllLinkAddresses().get(i); |
| android.hardware.radio.data.LinkAddress linkAddress = |
| new android.hardware.radio.data.LinkAddress(); |
| linkAddress.address = la.getAddress().getHostAddress(); |
| linkAddress.addressProperties = la.getFlags(); |
| linkAddress.deprecationTime = la.getDeprecationTime(); |
| linkAddress.expirationTime = la.getExpirationTime(); |
| addresses[i] = linkAddress; |
| } |
| return addresses; |
| } |
| |
| /** |
| * Convert RadioAccessSpecifier defined in radio/1.5/types.hal to RadioAccessSpecifier |
| * @param specifier RadioAccessSpecifier defined in radio/1.5/types.hal |
| * @return The converted RadioAccessSpecifier |
| */ |
| public static RadioAccessSpecifier convertHalRadioAccessSpecifier( |
| android.hardware.radio.V1_5.RadioAccessSpecifier specifier) { |
| if (specifier == null) return null; |
| ArrayList<Integer> halBands = new ArrayList<>(); |
| switch (specifier.bands.getDiscriminator()) { |
| case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator |
| .geranBands: |
| halBands = specifier.bands.geranBands(); |
| break; |
| case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator |
| .utranBands: |
| halBands = specifier.bands.utranBands(); |
| break; |
| case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator |
| .eutranBands: |
| halBands = specifier.bands.eutranBands(); |
| break; |
| case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator |
| .ngranBands: |
| halBands = specifier.bands.ngranBands(); |
| break; |
| } |
| return new RadioAccessSpecifier(convertHalRadioAccessNetworks(specifier.radioAccessNetwork), |
| halBands.stream().mapToInt(Integer::intValue).toArray(), |
| specifier.channels.stream().mapToInt(Integer::intValue).toArray()); |
| } |
| |
| /** |
| * Convert RadioAccessSpecifier defined in RadioAccessSpecifier.aidl to RadioAccessSpecifier |
| * @param specifier RadioAccessSpecifier defined in RadioAccessSpecifier.aidl |
| * @return The converted RadioAccessSpecifier |
| */ |
| public static RadioAccessSpecifier convertHalRadioAccessSpecifier( |
| android.hardware.radio.network.RadioAccessSpecifier specifier) { |
| if (specifier == null) return null; |
| int[] halBands = null; |
| switch (specifier.bands.getTag()) { |
| case android.hardware.radio.network.RadioAccessSpecifierBands.geranBands: |
| halBands = specifier.bands.getGeranBands(); |
| break; |
| case android.hardware.radio.network.RadioAccessSpecifierBands.utranBands: |
| halBands = specifier.bands.getUtranBands(); |
| break; |
| case android.hardware.radio.network.RadioAccessSpecifierBands.eutranBands: |
| halBands = specifier.bands.getEutranBands(); |
| break; |
| case android.hardware.radio.network.RadioAccessSpecifierBands.ngranBands: |
| halBands = specifier.bands.getNgranBands(); |
| break; |
| } |
| return new RadioAccessSpecifier(specifier.accessNetwork, halBands, specifier.channels); |
| } |
| |
| /** |
| * Convert to RadioAccessSpecifier defined in radio/1.1/types.hal |
| * @param ras Radio access specifier |
| * @return The converted RadioAccessSpecifier |
| */ |
| public static android.hardware.radio.V1_1.RadioAccessSpecifier |
| convertToHalRadioAccessSpecifier11(RadioAccessSpecifier ras) { |
| android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat = |
| new android.hardware.radio.V1_1.RadioAccessSpecifier(); |
| rasInHalFormat.radioAccessNetwork = ras.getRadioAccessNetwork(); |
| ArrayList<Integer> bands = new ArrayList<>(); |
| if (ras.getBands() != null) { |
| for (int band : ras.getBands()) { |
| bands.add(band); |
| } |
| } |
| switch (ras.getRadioAccessNetwork()) { |
| case AccessNetworkConstants.AccessNetworkType.GERAN: |
| rasInHalFormat.geranBands = bands; |
| break; |
| case AccessNetworkConstants.AccessNetworkType.UTRAN: |
| rasInHalFormat.utranBands = bands; |
| break; |
| case AccessNetworkConstants.AccessNetworkType.EUTRAN: |
| rasInHalFormat.eutranBands = bands; |
| break; |
| default: |
| return null; |
| } |
| |
| if (ras.getChannels() != null) { |
| for (int channel : ras.getChannels()) { |
| rasInHalFormat.channels.add(channel); |
| } |
| } |
| |
| return rasInHalFormat; |
| } |
| |
| /** |
| * Convert to RadioAccessSpecifier defined in radio/1.5/types.hal |
| * @param ras Radio access specifier |
| * @return The converted RadioAccessSpecifier |
| */ |
| public static android.hardware.radio.V1_5.RadioAccessSpecifier |
| convertToHalRadioAccessSpecifier15(RadioAccessSpecifier ras) { |
| android.hardware.radio.V1_5.RadioAccessSpecifier rasInHalFormat = |
| new android.hardware.radio.V1_5.RadioAccessSpecifier(); |
| android.hardware.radio.V1_5.RadioAccessSpecifier.Bands bandsInHalFormat = |
| new android.hardware.radio.V1_5.RadioAccessSpecifier.Bands(); |
| rasInHalFormat.radioAccessNetwork = convertToHalRadioAccessNetworks( |
| ras.getRadioAccessNetwork()); |
| ArrayList<Integer> bands = new ArrayList<>(); |
| if (ras.getBands() != null) { |
| for (int band : ras.getBands()) { |
| bands.add(band); |
| } |
| } |
| switch (ras.getRadioAccessNetwork()) { |
| case AccessNetworkConstants.AccessNetworkType.GERAN: |
| bandsInHalFormat.geranBands(bands); |
| break; |
| case AccessNetworkConstants.AccessNetworkType.UTRAN: |
| bandsInHalFormat.utranBands(bands); |
| break; |
| case AccessNetworkConstants.AccessNetworkType.EUTRAN: |
| bandsInHalFormat.eutranBands(bands); |
| break; |
| case AccessNetworkConstants.AccessNetworkType.NGRAN: |
| bandsInHalFormat.ngranBands(bands); |
| break; |
| default: |
| return null; |
| } |
| rasInHalFormat.bands = bandsInHalFormat; |
| |
| if (ras.getChannels() != null) { |
| for (int channel : ras.getChannels()) { |
| rasInHalFormat.channels.add(channel); |
| } |
| } |
| |
| return rasInHalFormat; |
| } |
| |
| /** |
| * Convert to RadioAccessSpecifier.aidl |
| * @param ras Radio access specifier |
| * @return The converted RadioAccessSpecifier |
| */ |
| public static android.hardware.radio.network.RadioAccessSpecifier |
| convertToHalRadioAccessSpecifierAidl(RadioAccessSpecifier ras) { |
| android.hardware.radio.network.RadioAccessSpecifier rasInHalFormat = |
| new android.hardware.radio.network.RadioAccessSpecifier(); |
| android.hardware.radio.network.RadioAccessSpecifierBands bandsInHalFormat = |
| new android.hardware.radio.network.RadioAccessSpecifierBands(); |
| rasInHalFormat.accessNetwork = convertToHalAccessNetworkAidl(ras.getRadioAccessNetwork()); |
| int[] bands; |
| if (ras.getBands() != null) { |
| bands = new int[ras.getBands().length]; |
| for (int i = 0; i < ras.getBands().length; i++) { |
| bands[i] = ras.getBands()[i]; |
| } |
| } else { |
| bands = new int[0]; |
| } |
| switch (ras.getRadioAccessNetwork()) { |
| case AccessNetworkConstants.AccessNetworkType.GERAN: |
| bandsInHalFormat.setGeranBands(bands); |
| break; |
| case AccessNetworkConstants.AccessNetworkType.UTRAN: |
| bandsInHalFormat.setUtranBands(bands); |
| break; |
| case AccessNetworkConstants.AccessNetworkType.EUTRAN: |
| bandsInHalFormat.setEutranBands(bands); |
| break; |
| case AccessNetworkConstants.AccessNetworkType.NGRAN: |
| bandsInHalFormat.setNgranBands(bands); |
| break; |
| default: |
| return null; |
| } |
| rasInHalFormat.bands = bandsInHalFormat; |
| |
| int[] channels; |
| if (ras.getChannels() != null) { |
| channels = new int[ras.getChannels().length]; |
| for (int i = 0; i < ras.getChannels().length; i++) { |
| channels[i] = ras.getChannels()[i]; |
| } |
| } else { |
| channels = new int[0]; |
| } |
| rasInHalFormat.channels = channels; |
| |
| return rasInHalFormat; |
| } |
| |
| /** |
| * Convert to censored terminal response |
| * @param terminalResponse Terminal response |
| * @return The converted censored terminal response |
| */ |
| public static String convertToCensoredTerminalResponse(String terminalResponse) { |
| try { |
| byte[] bytes = IccUtils.hexStringToBytes(terminalResponse); |
| if (bytes != null) { |
| List<ComprehensionTlv> ctlvs = ComprehensionTlv.decodeMany(bytes, 0); |
| int from = 0; |
| for (ComprehensionTlv ctlv : ctlvs) { |
| // Find text strings which might be personal information input by user, |
| // then replace it with "********". |
| if (ComprehensionTlvTag.TEXT_STRING.value() == ctlv.getTag()) { |
| byte[] target = Arrays.copyOfRange(ctlv.getRawValue(), from, |
| ctlv.getValueIndex() + ctlv.getLength()); |
| terminalResponse = terminalResponse.toLowerCase().replace( |
| IccUtils.bytesToHexString(target).toLowerCase(), "********"); |
| } |
| // The text string tag and the length field should also be hidden. |
| from = ctlv.getValueIndex() + ctlv.getLength(); |
| } |
| } |
| } catch (Exception e) { |
| terminalResponse = null; |
| } |
| |
| return terminalResponse; |
| } |
| |
| /** |
| * Convert to {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by |
| * {@link android.telephony.Annotation.NetworkType}. |
| * |
| * @param raf {@link android.hardware.radio.V1_0.RadioAccessFamily} |
| * @return {@link TelephonyManager.NetworkTypeBitMask} |
| */ |
| @TelephonyManager.NetworkTypeBitMask |
| public static int convertHalNetworkTypeBitMask(int raf) { |
| int networkTypeRaf = 0; |
| |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GSM) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GPRS) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EDGE) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE; |
| } |
| // convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95A) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95B) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EHRPD) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSUPA) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSDPA) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPA) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPAP) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.UMTS) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE; |
| } |
| if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA; |
| } |
| if ((raf & android.hardware.radio.V1_4.RadioAccessFamily.NR) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_NR; |
| } |
| if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) != 0) { |
| networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN; |
| } |
| return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf; |
| } |
| |
| /** |
| * Convert to RadioAccessFamily defined in radio/1.4/types.hal |
| * @param networkTypeBitmask {@link TelephonyManager.NetworkTypeBitMask}, the bitmask |
| * represented by {@link android.telephony.Annotation.NetworkType} |
| * @return The converted RadioAccessFamily |
| */ |
| public static int convertToHalRadioAccessFamily( |
| @TelephonyManager.NetworkTypeBitMask int networkTypeBitmask) { |
| int raf = 0; |
| |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GSM) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.GSM; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GPRS) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.GPRS; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EDGE) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.EDGE; |
| } |
| // convert CDMA to IS95A, consistent with ServiceState.networkTypeToRilRadioTechnology |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_CDMA) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.IS95A; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.EHRPD; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSUPA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSDPA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPA) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPAP; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_UMTS) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.UMTS; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN) != 0) { |
| raf |= (1 << android.hardware.radio.V1_4.RadioTechnology.IWLAN); |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA) != 0) { |
| raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0) { |
| raf |= android.hardware.radio.V1_4.RadioAccessFamily.NR; |
| } |
| return (raf == 0) ? android.hardware.radio.V1_4.RadioAccessFamily.UNKNOWN : raf; |
| } |
| |
| /** |
| * Convert to RadioAccessFamily.aidl |
| * @param networkTypeBitmask {@link TelephonyManager.NetworkTypeBitMask}, the bitmask |
| * represented by {@link android.telephony.Annotation.NetworkType} |
| * @return The converted RadioAccessFamily |
| */ |
| public static int convertToHalRadioAccessFamilyAidl( |
| @TelephonyManager.NetworkTypeBitMask int networkTypeBitmask) { |
| int raf = 0; |
| |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GSM) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.GSM; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GPRS) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.GPRS; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EDGE) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.EDGE; |
| } |
| // convert CDMA to IS95A, consistent with ServiceState.networkTypeToRilRadioTechnology |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_CDMA) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.IS95A; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.ONE_X_RTT; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.EVDO_0; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.EVDO_A; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.EVDO_B; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.EHRPD; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.HSUPA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.HSDPA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPA) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.HSPA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.HSPAP; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_UMTS) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.UMTS; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.TD_SCDMA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.IWLAN; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.LTE; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.LTE_CA; |
| } |
| if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0) { |
| raf |= android.hardware.radio.RadioAccessFamily.NR; |
| } |
| return (raf == 0) ? android.hardware.radio.RadioAccessFamily.UNKNOWN : raf; |
| } |
| |
| /** |
| * Convert AccessNetworkType to AccessNetwork defined in radio/1.5/types.hal |
| * @param accessNetworkType Access network type |
| * @return The converted AccessNetwork |
| */ |
| public static int convertToHalAccessNetwork(int accessNetworkType) { |
| switch (accessNetworkType) { |
| case AccessNetworkConstants.AccessNetworkType.GERAN: |
| return android.hardware.radio.V1_5.AccessNetwork.GERAN; |
| case AccessNetworkConstants.AccessNetworkType.UTRAN: |
| return android.hardware.radio.V1_5.AccessNetwork.UTRAN; |
| case AccessNetworkConstants.AccessNetworkType.EUTRAN: |
| return android.hardware.radio.V1_5.AccessNetwork.EUTRAN; |
| case AccessNetworkConstants.AccessNetworkType.CDMA2000: |
| return android.hardware.radio.V1_5.AccessNetwork.CDMA2000; |
| case AccessNetworkConstants.AccessNetworkType.IWLAN: |
| return android.hardware.radio.V1_5.AccessNetwork.IWLAN; |
| case AccessNetworkConstants.AccessNetworkType.NGRAN: |
| return android.hardware.radio.V1_5.AccessNetwork.NGRAN; |
| case AccessNetworkConstants.AccessNetworkType.UNKNOWN: |
| default: |
| return android.hardware.radio.V1_5.AccessNetwork.UNKNOWN; |
| } |
| } |
| |
| /** |
| * Convert to AccessNetwork.aidl |
| * @param accessNetworkType Access network type |
| * @return The converted AccessNetwork |
| */ |
| public static int convertToHalAccessNetworkAidl(int accessNetworkType) { |
| switch (accessNetworkType) { |
| case AccessNetworkConstants.AccessNetworkType.GERAN: |
| return android.hardware.radio.AccessNetwork.GERAN; |
| case AccessNetworkConstants.AccessNetworkType.UTRAN: |
| return android.hardware.radio.AccessNetwork.UTRAN; |
| case AccessNetworkConstants.AccessNetworkType.EUTRAN: |
| return android.hardware.radio.AccessNetwork.EUTRAN; |
| case AccessNetworkConstants.AccessNetworkType.CDMA2000: |
| return android.hardware.radio.AccessNetwork.CDMA2000; |
| case AccessNetworkConstants.AccessNetworkType.IWLAN: |
| return android.hardware.radio.AccessNetwork.IWLAN; |
| case AccessNetworkConstants.AccessNetworkType.NGRAN: |
| return android.hardware.radio.AccessNetwork.NGRAN; |
| case AccessNetworkConstants.AccessNetworkType.UNKNOWN: |
| default: |
| return android.hardware.radio.AccessNetwork.UNKNOWN; |
| } |
| } |
| |
| /** |
| * Convert to RadioAccessNetwork defined in radio/1.1/types.hal |
| * @param accessNetworkType Access network type |
| * @return The converted RadioAccessNetwork |
| */ |
| public static int convertToHalRadioAccessNetworks(int accessNetworkType) { |
| switch (accessNetworkType) { |
| case AccessNetworkConstants.AccessNetworkType.GERAN: |
| return android.hardware.radio.V1_1.RadioAccessNetworks.GERAN; |
| case AccessNetworkConstants.AccessNetworkType.UTRAN: |
| return android.hardware.radio.V1_1.RadioAccessNetworks.UTRAN; |
| case AccessNetworkConstants.AccessNetworkType.EUTRAN: |
| return android.hardware.radio.V1_1.RadioAccessNetworks.EUTRAN; |
| case AccessNetworkConstants.AccessNetworkType.NGRAN: |
| return android.hardware.radio.V1_5.RadioAccessNetworks.NGRAN; |
| case AccessNetworkConstants.AccessNetworkType.CDMA2000: |
| return android.hardware.radio.V1_5.RadioAccessNetworks.CDMA2000; |
| case AccessNetworkConstants.AccessNetworkType.UNKNOWN: |
| default: |
| return android.hardware.radio.V1_5.RadioAccessNetworks.UNKNOWN; |
| } |
| } |
| |
| /** |
| * Convert RadioAccessNetworks defined in radio/1.5/types.hal to AccessNetworkType |
| * @param ran RadioAccessNetwork defined in radio/1.5/types.hal |
| * @return The converted AccessNetworkType |
| */ |
| public static int convertHalRadioAccessNetworks(int ran) { |
| switch (ran) { |
| case android.hardware.radio.V1_5.RadioAccessNetworks.GERAN: |
| return AccessNetworkConstants.AccessNetworkType.GERAN; |
| case android.hardware.radio.V1_5.RadioAccessNetworks.UTRAN: |
| return AccessNetworkConstants.AccessNetworkType.UTRAN; |
| case android.hardware.radio.V1_5.RadioAccessNetworks.EUTRAN: |
| return AccessNetworkConstants.AccessNetworkType.EUTRAN; |
| case android.hardware.radio.V1_5.RadioAccessNetworks.NGRAN: |
| return AccessNetworkConstants.AccessNetworkType.NGRAN; |
| case android.hardware.radio.V1_5.RadioAccessNetworks.CDMA2000: |
| return AccessNetworkConstants.AccessNetworkType.CDMA2000; |
| case android.hardware.radio.V1_5.RadioAccessNetworks.UNKNOWN: |
| default: |
| return AccessNetworkConstants.AccessNetworkType.UNKNOWN; |
| } |
| } |
| |
| /** |
| * Convert to SimApdu defined in radio/1.0/types.hal |
| * @param channel channel |
| * @param cla cla |
| * @param instruction instruction |
| * @param p1 p1 |
| * @param p2 p2 |
| * @param p3 p3 |
| * @param data data |
| * @return The converted SimApdu |
| */ |
| public static android.hardware.radio.V1_0.SimApdu convertToHalSimApdu(int channel, int cla, |
| int instruction, int p1, int p2, int p3, String data) { |
| android.hardware.radio.V1_0.SimApdu msg = new android.hardware.radio.V1_0.SimApdu(); |
| msg.sessionId = channel; |
| msg.cla = cla; |
| msg.instruction = instruction; |
| msg.p1 = p1; |
| msg.p2 = p2; |
| msg.p3 = p3; |
| msg.data = convertNullToEmptyString(data); |
| return msg; |
| } |
| |
| /** |
| * Convert to SimApdu.aidl |
| * @param channel channel |
| * @param cla cla |
| * @param instruction instruction |
| * @param p1 p1 |
| * @param p2 p2 |
| * @param p3 p3 |
| * @param data data |
| * @return The converted SimApdu |
| */ |
| public static android.hardware.radio.sim.SimApdu convertToHalSimApduAidl(int channel, int cla, |
| int instruction, int p1, int p2, int p3, String data) { |
| android.hardware.radio.sim.SimApdu msg = new android.hardware.radio.sim.SimApdu(); |
| msg.sessionId = channel; |
| msg.cla = cla; |
| msg.instruction = instruction; |
| msg.p1 = p1; |
| msg.p2 = p2; |
| msg.p3 = p3; |
| msg.data = convertNullToEmptyString(data); |
| return msg; |
| } |
| |
| /** |
| * Convert to SimLockMultiSimPolicy defined in radio/1.4/types.hal |
| * @param policy Multi SIM policy |
| * @return The converted SimLockMultiSimPolicy |
| */ |
| public static int convertToHalSimLockMultiSimPolicy(int policy) { |
| switch (policy) { |
| case CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT: |
| return android.hardware.radio.V1_4.SimLockMultiSimPolicy |
| .ONE_VALID_SIM_MUST_BE_PRESENT; |
| case CarrierRestrictionRules.MULTISIM_POLICY_NONE: |
| // fallthrough |
| default: |
| return android.hardware.radio.V1_4.SimLockMultiSimPolicy.NO_MULTISIM_POLICY; |
| |
| } |
| } |
| |
| /** |
| * Convert to SimLockMultiSimPolicy.aidl |
| * @param policy Multi SIM policy |
| * @return The converted SimLockMultiSimPolicy |
| */ |
| public static int convertToHalSimLockMultiSimPolicyAidl(int policy) { |
| switch (policy) { |
| case CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT: |
| return android.hardware.radio.sim.SimLockMultiSimPolicy |
| .ONE_VALID_SIM_MUST_BE_PRESENT; |
| case CarrierRestrictionRules.MULTISIM_POLICY_NONE: |
| // fallthrough |
| default: |
| return android.hardware.radio.sim.SimLockMultiSimPolicy.NO_MULTISIM_POLICY; |
| |
| } |
| } |
| |
| /** |
| * Convert a list of CarrierIdentifiers into a list of Carriers defined in radio/1.0/types.hal |
| * @param carriers List of CarrierIdentifiers |
| * @return The converted list of Carriers |
| */ |
| public static ArrayList<android.hardware.radio.V1_0.Carrier> convertToHalCarrierRestrictionList( |
| List<CarrierIdentifier> carriers) { |
| ArrayList<android.hardware.radio.V1_0.Carrier> result = new ArrayList<>(); |
| for (CarrierIdentifier ci : carriers) { |
| android.hardware.radio.V1_0.Carrier c = new android.hardware.radio.V1_0.Carrier(); |
| c.mcc = convertNullToEmptyString(ci.getMcc()); |
| c.mnc = convertNullToEmptyString(ci.getMnc()); |
| int matchType = CarrierIdentifier.MatchType.ALL; |
| String matchData = null; |
| if (!TextUtils.isEmpty(ci.getSpn())) { |
| matchType = CarrierIdentifier.MatchType.SPN; |
| matchData = ci.getSpn(); |
| } else if (!TextUtils.isEmpty(ci.getImsi())) { |
| matchType = CarrierIdentifier.MatchType.IMSI_PREFIX; |
| matchData = ci.getImsi(); |
| } else if (!TextUtils.isEmpty(ci.getGid1())) { |
| matchType = CarrierIdentifier.MatchType.GID1; |
| matchData = ci.getGid1(); |
| } else if (!TextUtils.isEmpty(ci.getGid2())) { |
| matchType = CarrierIdentifier.MatchType.GID2; |
| matchData = ci.getGid2(); |
| } |
| c.matchType = matchType; |
| c.matchData = convertNullToEmptyString(matchData); |
| result.add(c); |
| } |
| return result; |
| } |
| |
| /** |
| * Convert a list of CarrierIdentifiers into an array of Carrier.aidl |
| * @param carriers List of CarrierIdentifiers |
| * @return The converted array of Carriers |
| */ |
| public static android.hardware.radio.sim.Carrier[] convertToHalCarrierRestrictionListAidl( |
| List<CarrierIdentifier> carriers) { |
| android.hardware.radio.sim.Carrier[] result = |
| new android.hardware.radio.sim.Carrier[carriers.size()]; |
| for (int i = 0; i < carriers.size(); i++) { |
| CarrierIdentifier ci = carriers.get(i); |
| android.hardware.radio.sim.Carrier carrier = new android.hardware.radio.sim.Carrier(); |
| carrier.mcc = convertNullToEmptyString(ci.getMcc()); |
| carrier.mnc = convertNullToEmptyString(ci.getMnc()); |
| int matchType = CarrierIdentifier.MatchType.ALL; |
| String matchData = null; |
| if (!TextUtils.isEmpty(ci.getSpn())) { |
| matchType = CarrierIdentifier.MatchType.SPN; |
| matchData = ci.getSpn(); |
| } else if (!TextUtils.isEmpty(ci.getImsi())) { |
| matchType = CarrierIdentifier.MatchType.IMSI_PREFIX; |
| matchData = ci.getImsi(); |
| } else if (!TextUtils.isEmpty(ci.getGid1())) { |
| matchType = CarrierIdentifier.MatchType.GID1; |
| matchData = ci.getGid1(); |
| } else if (!TextUtils.isEmpty(ci.getGid2())) { |
| matchType = CarrierIdentifier.MatchType.GID2; |
| matchData = ci.getGid2(); |
| } |
| carrier.matchType = matchType; |
| carrier.matchData = convertNullToEmptyString(matchData); |
| result[i] = carrier; |
| } |
| return result; |
| } |
| |
| /** |
| * Convert to Dial defined in radio/1.0/types.hal |
| * @param address Address |
| * @param clirMode CLIR mode |
| * @param uusInfo UUS info |
| * @return The converted Dial |
| */ |
| public static android.hardware.radio.V1_0.Dial convertToHalDial(String address, int clirMode, |
| UUSInfo uusInfo) { |
| android.hardware.radio.V1_0.Dial dial = new android.hardware.radio.V1_0.Dial(); |
| dial.address = convertNullToEmptyString(address); |
| dial.clir = clirMode; |
| if (uusInfo != null) { |
| android.hardware.radio.V1_0.UusInfo info = new android.hardware.radio.V1_0.UusInfo(); |
| info.uusType = uusInfo.getType(); |
| info.uusDcs = uusInfo.getDcs(); |
| info.uusData = new String(uusInfo.getUserData()); |
| dial.uusInfo.add(info); |
| } |
| return dial; |
| } |
| |
| /** |
| * Convert to Dial.aidl |
| * @param address Address |
| * @param clirMode CLIR mode |
| * @param uusInfo UUS info |
| * @return The converted Dial.aidl |
| */ |
| public static android.hardware.radio.voice.Dial convertToHalDialAidl(String address, |
| int clirMode, UUSInfo uusInfo) { |
| android.hardware.radio.voice.Dial dial = new android.hardware.radio.voice.Dial(); |
| dial.address = convertNullToEmptyString(address); |
| dial.clir = clirMode; |
| if (uusInfo != null) { |
| android.hardware.radio.voice.UusInfo info = new android.hardware.radio.voice.UusInfo(); |
| info.uusType = uusInfo.getType(); |
| info.uusDcs = uusInfo.getDcs(); |
| info.uusData = new String(uusInfo.getUserData()); |
| dial.uusInfo = new android.hardware.radio.voice.UusInfo[] {info}; |
| } else { |
| dial.uusInfo = new android.hardware.radio.voice.UusInfo[0]; |
| } |
| return dial; |
| } |
| |
| /** |
| * Convert to SignalThresholdInfo defined in radio/1.5/types.hal |
| * @param signalThresholdInfo Signal threshold info |
| * @return The converted SignalThresholdInfo |
| */ |
| public static android.hardware.radio.V1_5.SignalThresholdInfo convertToHalSignalThresholdInfo( |
| SignalThresholdInfo signalThresholdInfo) { |
| android.hardware.radio.V1_5.SignalThresholdInfo signalThresholdInfoHal = |
| new android.hardware.radio.V1_5.SignalThresholdInfo(); |
| signalThresholdInfoHal.signalMeasurement = signalThresholdInfo.getSignalMeasurementType(); |
| signalThresholdInfoHal.hysteresisMs = signalThresholdInfo.getHysteresisMs(); |
| signalThresholdInfoHal.hysteresisDb = signalThresholdInfo.getHysteresisDb(); |
| signalThresholdInfoHal.thresholds = primitiveArrayToArrayList( |
| signalThresholdInfo.getThresholds()); |
| signalThresholdInfoHal.isEnabled = signalThresholdInfo.isEnabled(); |
| return signalThresholdInfoHal; |
| } |
| |
| /** |
| * Convert to SignalThresholdInfo.aidl |
| * @param signalThresholdInfo Signal threshold info |
| * @return The converted SignalThresholdInfo |
| */ |
| public static android.hardware.radio.network.SignalThresholdInfo |
| convertToHalSignalThresholdInfoAidl(SignalThresholdInfo signalThresholdInfo) { |
| android.hardware.radio.network.SignalThresholdInfo signalThresholdInfoHal = |
| new android.hardware.radio.network.SignalThresholdInfo(); |
| signalThresholdInfoHal.signalMeasurement = signalThresholdInfo.getSignalMeasurementType(); |
| signalThresholdInfoHal.hysteresisMs = signalThresholdInfo.getHysteresisMs(); |
| signalThresholdInfoHal.hysteresisDb = signalThresholdInfo.getHysteresisDb(); |
| signalThresholdInfoHal.thresholds = signalThresholdInfo.getThresholds(); |
| signalThresholdInfoHal.isEnabled = signalThresholdInfo.isEnabled(); |
| signalThresholdInfoHal.ran = signalThresholdInfo.getRadioAccessNetworkType(); |
| return signalThresholdInfoHal; |
| } |
| |
| /** |
| * Convert to SmsWriteArgsStatus defined in radio/1.0/types.hal |
| * @param status StatusOnIcc |
| * @return The converted SmsWriteArgsStatus defined in radio/1.0/types.hal |
| */ |
| public static int convertToHalSmsWriteArgsStatus(int status) { |
| switch (status & 0x7) { |
| case SmsManager.STATUS_ON_ICC_READ: |
| return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_READ; |
| case SmsManager.STATUS_ON_ICC_UNREAD: |
| return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_UNREAD; |
| case SmsManager.STATUS_ON_ICC_SENT: |
| return android.hardware.radio.V1_0.SmsWriteArgsStatus.STO_SENT; |
| case SmsManager.STATUS_ON_ICC_UNSENT: |
| return android.hardware.radio.V1_0.SmsWriteArgsStatus.STO_UNSENT; |
| default: |
| return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_READ; |
| } |
| } |
| |
| /** |
| * Convert to statuses defined in SmsWriteArgs.aidl |
| * @param status StatusOnIcc |
| * @return The converted statuses defined in SmsWriteArgs.aidl |
| */ |
| public static int convertToHalSmsWriteArgsStatusAidl(int status) { |
| switch (status & 0x7) { |
| case SmsManager.STATUS_ON_ICC_READ: |
| return android.hardware.radio.messaging.SmsWriteArgs.STATUS_REC_READ; |
| case SmsManager.STATUS_ON_ICC_UNREAD: |
| return android.hardware.radio.messaging.SmsWriteArgs.STATUS_REC_UNREAD; |
| case SmsManager.STATUS_ON_ICC_SENT: |
| return android.hardware.radio.messaging.SmsWriteArgs.STATUS_STO_SENT; |
| case SmsManager.STATUS_ON_ICC_UNSENT: |
| return android.hardware.radio.messaging.SmsWriteArgs.STATUS_STO_UNSENT; |
| default: |
| return android.hardware.radio.messaging.SmsWriteArgs.STATUS_REC_READ; |
| } |
| } |
| |
| /** |
| * Convert a list of HardwareConfig defined in radio/1.0/types.hal to a list of HardwareConfig |
| * @param hwListRil List of HardwareConfig defined in radio/1.0/types.hal |
| * @return The converted list of HardwareConfig |
| */ |
| public static ArrayList<HardwareConfig> convertHalHardwareConfigList( |
| ArrayList<android.hardware.radio.V1_0.HardwareConfig> hwListRil) { |
| int num; |
| ArrayList<HardwareConfig> response; |
| HardwareConfig hw; |
| |
| num = hwListRil.size(); |
| response = new ArrayList<>(num); |
| |
| for (android.hardware.radio.V1_0.HardwareConfig hwRil : hwListRil) { |
| int type = hwRil.type; |
| switch(type) { |
| case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: { |
| hw = new HardwareConfig(type); |
| android.hardware.radio.V1_0.HardwareConfigModem hwModem = hwRil.modem.get(0); |
| hw.assignModem(hwRil.uuid, hwRil.state, hwModem.rilModel, hwModem.rat, |
| hwModem.maxVoice, hwModem.maxData, hwModem.maxStandby); |
| break; |
| } |
| case HardwareConfig.DEV_HARDWARE_TYPE_SIM: { |
| hw = new HardwareConfig(type); |
| hw.assignSim(hwRil.uuid, hwRil.state, hwRil.sim.get(0).modemUuid); |
| break; |
| } |
| default: { |
| throw new RuntimeException( |
| "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardware type:" + type); |
| } |
| } |
| response.add(hw); |
| } |
| return response; |
| } |
| |
| /** |
| * Convert a list of HardwareConfig defined in HardwareConfig.aidl to a list of HardwareConfig |
| * @param hwListRil List of HardwareConfig defined in HardwareConfig.aidl |
| * @return The converted list of HardwareConfig |
| */ |
| public static ArrayList<HardwareConfig> convertHalHardwareConfigList( |
| android.hardware.radio.modem.HardwareConfig[] hwListRil) { |
| ArrayList<HardwareConfig> response = new ArrayList<>(hwListRil.length); |
| HardwareConfig hw; |
| |
| for (android.hardware.radio.modem.HardwareConfig hwRil : hwListRil) { |
| int type = hwRil.type; |
| switch (type) { |
| case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: { |
| hw = new HardwareConfig(type); |
| android.hardware.radio.modem.HardwareConfigModem hwModem = hwRil.modem[0]; |
| hw.assignModem(hwRil.uuid, hwRil.state, hwModem.rilModel, hwModem.rat, |
| hwModem.maxVoiceCalls, hwModem.maxDataCalls, hwModem.maxStandby); |
| break; |
| } |
| case HardwareConfig.DEV_HARDWARE_TYPE_SIM: { |
| hw = new HardwareConfig(type); |
| hw.assignSim(hwRil.uuid, hwRil.state, hwRil.sim[0].modemUuid); |
| break; |
| } |
| default: { |
| throw new RuntimeException( |
| "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardware type:" + type); |
| } |
| } |
| response.add(hw); |
| } |
| return response; |
| } |
| |
| /** |
| * Convert RadioCapability defined in radio/1.0/types.hal to RadioCapability |
| * @param rc RadioCapability defined in radio/1.0/types.hal |
| * @param ril RIL |
| * @return The converted RadioCapability |
| */ |
| public static RadioCapability convertHalRadioCapability( |
| android.hardware.radio.V1_0.RadioCapability rc, RIL ril) { |
| int session = rc.session; |
| int phase = rc.phase; |
| int rat = convertHalNetworkTypeBitMask(rc.raf); |
| String logicModemUuid = rc.logicalModemUuid; |
| int status = rc.status; |
| |
| ril.riljLog("convertHalRadioCapability: session=" + session + ", phase=" + phase + ", rat=" |
| + rat + ", logicModemUuid=" + logicModemUuid + ", status=" + status + ", rcRil.raf=" |
| + rc.raf); |
| return new RadioCapability(ril.mPhoneId, session, phase, rat, logicModemUuid, status); |
| } |
| |
| /** |
| * Convert RadioCapability defined in RadioCapability.aidl to RadioCapability |
| * @param rc RadioCapability defined in RadioCapability.aidl |
| * @param ril RIL |
| * @return The converted RadioCapability |
| */ |
| public static RadioCapability convertHalRadioCapability( |
| android.hardware.radio.modem.RadioCapability rc, RIL ril) { |
| int session = rc.session; |
| int phase = rc.phase; |
| int rat = convertHalNetworkTypeBitMask(rc.raf); |
| String logicModemUuid = rc.logicalModemUuid; |
| int status = rc.status; |
| |
| ril.riljLog("convertHalRadioCapability: session=" + session + ", phase=" + phase + ", rat=" |
| + rat + ", logicModemUuid=" + logicModemUuid + ", status=" + status + ", rcRil.raf=" |
| + rc.raf); |
| return new RadioCapability(ril.mPhoneId, session, phase, rat, logicModemUuid, status); |
| } |
| |
| /** |
| * Convert LceDataInfo defined in radio/1.0/types.hal and LinkCapacityEstimate defined in |
| * radio/1.2, 1.6/types.hal to a list of LinkCapacityEstimates |
| * @param lceObj LceDataInfo defined in radio/1.0/types.hal or LinkCapacityEstimate defined in |
| * radio/1.2, 1.6/types.hal |
| * @return The converted list of LinkCapacityEstimates |
| */ |
| public static List<LinkCapacityEstimate> convertHalLceData(Object lceObj) { |
| final List<LinkCapacityEstimate> lceList = new ArrayList<>(); |
| if (lceObj == null) return lceList; |
| if (lceObj instanceof android.hardware.radio.V1_0.LceDataInfo) { |
| android.hardware.radio.V1_0.LceDataInfo lce = |
| (android.hardware.radio.V1_0.LceDataInfo) lceObj; |
| lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED, |
| lce.lastHopCapacityKbps, LinkCapacityEstimate.INVALID)); |
| } else if (lceObj instanceof android.hardware.radio.V1_2.LinkCapacityEstimate) { |
| android.hardware.radio.V1_2.LinkCapacityEstimate lce = |
| (android.hardware.radio.V1_2.LinkCapacityEstimate) lceObj; |
| lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED, |
| lce.downlinkCapacityKbps, lce.uplinkCapacityKbps)); |
| } else if (lceObj instanceof android.hardware.radio.V1_6.LinkCapacityEstimate) { |
| android.hardware.radio.V1_6.LinkCapacityEstimate lce = |
| (android.hardware.radio.V1_6.LinkCapacityEstimate) lceObj; |
| int primaryDownlinkCapacityKbps = lce.downlinkCapacityKbps; |
| int primaryUplinkCapacityKbps = lce.uplinkCapacityKbps; |
| if (primaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID |
| && lce.secondaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID) { |
| primaryDownlinkCapacityKbps = |
| lce.downlinkCapacityKbps - lce.secondaryDownlinkCapacityKbps; |
| } |
| if (primaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID |
| && lce.secondaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID) { |
| primaryUplinkCapacityKbps = |
| lce.uplinkCapacityKbps - lce.secondaryUplinkCapacityKbps; |
| } |
| lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_PRIMARY, |
| primaryDownlinkCapacityKbps, primaryUplinkCapacityKbps)); |
| lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_SECONDARY, |
| lce.secondaryDownlinkCapacityKbps, lce.secondaryUplinkCapacityKbps)); |
| } |
| return lceList; |
| } |
| |
| /** |
| * Convert LceDataInfo defined in LceDataInfo.aidl to a list of LinkCapacityEstimates |
| * @param lce LceDataInfo defined in LceDataInfo.aidl |
| * @return The converted list of LinkCapacityEstimates |
| */ |
| public static List<LinkCapacityEstimate> convertHalLceData( |
| android.hardware.radio.network.LceDataInfo lce) { |
| final List<LinkCapacityEstimate> lceList = new ArrayList<>(); |
| lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED, |
| lce.lastHopCapacityKbps, LinkCapacityEstimate.INVALID)); |
| return lceList; |
| } |
| |
| /** |
| * Convert LinkCapacityEstimate defined in LinkCapacityEstimate.aidl to a list of |
| * LinkCapacityEstimates |
| * @param lce LinkCapacityEstimate defined in LinkCapacityEstimate.aidl |
| * @return The converted list of LinkCapacityEstimates |
| */ |
| public static List<LinkCapacityEstimate> convertHalLceData( |
| android.hardware.radio.network.LinkCapacityEstimate lce) { |
| final List<LinkCapacityEstimate> lceList = new ArrayList<>(); |
| int primaryDownlinkCapacityKbps = lce.downlinkCapacityKbps; |
| int primaryUplinkCapacityKbps = lce.uplinkCapacityKbps; |
| if (primaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID |
| && lce.secondaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID) { |
| primaryDownlinkCapacityKbps = |
| lce.downlinkCapacityKbps - lce.secondaryDownlinkCapacityKbps; |
| } |
| if (primaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID |
| && lce.secondaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID) { |
| primaryUplinkCapacityKbps = |
| lce.uplinkCapacityKbps - lce.secondaryUplinkCapacityKbps; |
| } |
| lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_PRIMARY, |
| primaryDownlinkCapacityKbps, primaryUplinkCapacityKbps)); |
| lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_SECONDARY, |
| lce.secondaryDownlinkCapacityKbps, lce.secondaryUplinkCapacityKbps)); |
| return lceList; |
| } |
| |
| |
| /** |
| * Convert a list of CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal to a list of |
| * CellInfos |
| * @param records List of CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal |
| * @return The converted list of CellInfos |
| */ |
| public static ArrayList<CellInfo> convertHalCellInfoList(ArrayList<Object> records) { |
| ArrayList<CellInfo> response = new ArrayList<>(records.size()); |
| if (records.isEmpty()) return response; |
| final long nanotime = SystemClock.elapsedRealtimeNanos(); |
| for (Object obj : records) { |
| response.add(convertHalCellInfo(obj, nanotime)); |
| } |
| return response; |
| } |
| |
| /** |
| * Convert a list of CellInfo defined in CellInfo.aidl to a list of CellInfos |
| * @param records List of CellInfo defined in CellInfo.aidl |
| * @return The converted list of CellInfos |
| */ |
| public static ArrayList<CellInfo> convertHalCellInfoList( |
| android.hardware.radio.network.CellInfo[] records) { |
| ArrayList<CellInfo> response = new ArrayList<>(records.length); |
| if (records.length == 0) return response; |
| final long nanotime = SystemClock.elapsedRealtimeNanos(); |
| for (android.hardware.radio.network.CellInfo ci : records) { |
| response.add(convertHalCellInfo(ci, nanotime)); |
| } |
| return response; |
| } |
| |
| /** |
| * Convert a CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal to CellInfo |
| * @param cellInfo CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal |
| * @param nanotime time the CellInfo was created |
| * @return The converted CellInfo |
| */ |
| private static CellInfo convertHalCellInfo(Object cellInfo, long nanotime) { |
| if (cellInfo == null) return null; |
| int type; |
| int connectionStatus; |
| boolean registered; |
| CellIdentityGsm gsmCi = null; |
| CellSignalStrengthGsm gsmSs = null; |
| CellIdentityCdma cdmaCi = null; |
| CellSignalStrengthCdma cdmaSs = null; |
| CellIdentityLte lteCi = null; |
| CellSignalStrengthLte lteSs = null; |
| CellConfigLte lteCc = null; |
| CellIdentityWcdma wcdmaCi = null; |
| CellSignalStrengthWcdma wcdmaSs = null; |
| CellIdentityTdscdma tdscdmaCi = null; |
| CellSignalStrengthTdscdma tdscdmaSs = null; |
| CellIdentityNr nrCi = null; |
| CellSignalStrengthNr nrSs = null; |
| if (cellInfo instanceof android.hardware.radio.V1_0.CellInfo) { |
| final android.hardware.radio.V1_0.CellInfo record = |
| (android.hardware.radio.V1_0.CellInfo) cellInfo; |
| connectionStatus = CellInfo.CONNECTION_UNKNOWN; |
| registered = record.registered; |
| switch (record.cellInfoType) { |
| case android.hardware.radio.V1_0.CellInfoType.GSM: |
| type = CellInfo.TYPE_GSM; |
| android.hardware.radio.V1_0.CellInfoGsm gsm = record.gsm.get(0); |
| gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); |
| gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.CDMA: |
| type = CellInfo.TYPE_CDMA; |
| android.hardware.radio.V1_0.CellInfoCdma cdma = record.cdma.get(0); |
| cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); |
| cdmaSs = convertHalCdmaSignalStrength( |
| cdma.signalStrengthCdma, cdma.signalStrengthEvdo); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.LTE: |
| type = CellInfo.TYPE_LTE; |
| android.hardware.radio.V1_0.CellInfoLte lte = record.lte.get(0); |
| lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); |
| lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); |
| lteCc = new CellConfigLte(); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.WCDMA: |
| type = CellInfo.TYPE_WCDMA; |
| android.hardware.radio.V1_0.CellInfoWcdma wcdma = record.wcdma.get(0); |
| wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); |
| wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.TD_SCDMA: |
| type = CellInfo.TYPE_TDSCDMA; |
| android.hardware.radio.V1_0.CellInfoTdscdma tdscdma = record.tdscdma.get(0); |
| tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); |
| tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); |
| break; |
| default: return null; |
| } |
| } else if (cellInfo instanceof android.hardware.radio.V1_2.CellInfo) { |
| final android.hardware.radio.V1_2.CellInfo record = |
| (android.hardware.radio.V1_2.CellInfo) cellInfo; |
| connectionStatus = record.connectionStatus; |
| registered = record.registered; |
| switch(record.cellInfoType) { |
| case android.hardware.radio.V1_0.CellInfoType.GSM: |
| type = CellInfo.TYPE_GSM; |
| android.hardware.radio.V1_2.CellInfoGsm gsm = record.gsm.get(0); |
| gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); |
| gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.CDMA: |
| type = CellInfo.TYPE_CDMA; |
| android.hardware.radio.V1_2.CellInfoCdma cdma = record.cdma.get(0); |
| cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); |
| cdmaSs = convertHalCdmaSignalStrength( |
| cdma.signalStrengthCdma, cdma.signalStrengthEvdo); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.LTE: |
| type = CellInfo.TYPE_LTE; |
| android.hardware.radio.V1_2.CellInfoLte lte = record.lte.get(0); |
| lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); |
| lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); |
| lteCc = new CellConfigLte(); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.WCDMA: |
| type = CellInfo.TYPE_WCDMA; |
| android.hardware.radio.V1_2.CellInfoWcdma wcdma = record.wcdma.get(0); |
| wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); |
| wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); |
| break; |
| case android.hardware.radio.V1_0.CellInfoType.TD_SCDMA: |
| type = CellInfo.TYPE_TDSCDMA; |
| android.hardware.radio.V1_2.CellInfoTdscdma tdscdma = record.tdscdma.get(0); |
| tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); |
| tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); |
| break; |
| default: return null; |
| } |
| } else if (cellInfo instanceof android.hardware.radio.V1_4.CellInfo) { |
| final android.hardware.radio.V1_4.CellInfo record = |
| (android.hardware.radio.V1_4.CellInfo) cellInfo; |
| connectionStatus = record.connectionStatus; |
| registered = record.isRegistered; |
| switch (record.info.getDiscriminator()) { |
| case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.gsm: |
| type = CellInfo.TYPE_GSM; |
| android.hardware.radio.V1_2.CellInfoGsm gsm = record.info.gsm(); |
| gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); |
| gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); |
| break; |
| case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.cdma: |
| type = CellInfo.TYPE_CDMA; |
| android.hardware.radio.V1_2.CellInfoCdma cdma = record.info.cdma(); |
| cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); |
| cdmaSs = convertHalCdmaSignalStrength( |
| cdma.signalStrengthCdma, cdma.signalStrengthEvdo); |
| break; |
| case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.lte: |
| type = CellInfo.TYPE_LTE; |
| android.hardware.radio.V1_4.CellInfoLte lte = record.info.lte(); |
| lteCi = convertHalCellIdentityLte(lte.base.cellIdentityLte); |
| lteSs = convertHalLteSignalStrength(lte.base.signalStrengthLte); |
| lteCc = new CellConfigLte(lte.cellConfig.isEndcAvailable); |
| break; |
| case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.wcdma: |
| type = CellInfo.TYPE_WCDMA; |
| android.hardware.radio.V1_2.CellInfoWcdma wcdma = record.info.wcdma(); |
| wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); |
| wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); |
| break; |
| case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.tdscdma: |
| type = CellInfo.TYPE_TDSCDMA; |
| android.hardware.radio.V1_2.CellInfoTdscdma tdscdma = record.info.tdscdma(); |
| tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); |
| tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); |
| break; |
| case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.nr: |
| type = CellInfo.TYPE_NR; |
| android.hardware.radio.V1_4.CellInfoNr nr = record.info.nr(); |
| nrCi = convertHalCellIdentityNr(nr.cellidentity); |
| nrSs = convertHalNrSignalStrength(nr.signalStrength); |
| break; |
| default: return null; |
| } |
| } else if (cellInfo instanceof android.hardware.radio.V1_5.CellInfo) { |
| final android.hardware.radio.V1_5.CellInfo record = |
| (android.hardware.radio.V1_5.CellInfo) cellInfo; |
| connectionStatus = record.connectionStatus; |
| registered = record.registered; |
| switch (record.ratSpecificInfo.getDiscriminator()) { |
| case android.hardware.radio.V1_5.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.gsm: |
| type = CellInfo.TYPE_GSM; |
| android.hardware.radio.V1_5.CellInfoGsm gsm = record.ratSpecificInfo.gsm(); |
| gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); |
| gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); |
| break; |
| case android.hardware.radio.V1_5.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.cdma: |
| type = CellInfo.TYPE_CDMA; |
| android.hardware.radio.V1_2.CellInfoCdma cdma = record.ratSpecificInfo.cdma(); |
| cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); |
| cdmaSs = convertHalCdmaSignalStrength( |
| cdma.signalStrengthCdma, cdma.signalStrengthEvdo); |
| break; |
| case android.hardware.radio.V1_5.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.lte: |
| type = CellInfo.TYPE_LTE; |
| android.hardware.radio.V1_5.CellInfoLte lte = record.ratSpecificInfo.lte(); |
| lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); |
| lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); |
| lteCc = new CellConfigLte(); |
| break; |
| case android.hardware.radio.V1_5.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.wcdma: |
| type = CellInfo.TYPE_WCDMA; |
| android.hardware.radio.V1_5.CellInfoWcdma wcdma = |
| record.ratSpecificInfo.wcdma(); |
| wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); |
| wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); |
| break; |
| case android.hardware.radio.V1_5.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.tdscdma: |
| type = CellInfo.TYPE_TDSCDMA; |
| android.hardware.radio.V1_5.CellInfoTdscdma tdscdma = |
| record.ratSpecificInfo.tdscdma(); |
| tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); |
| tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); |
| break; |
| case android.hardware.radio.V1_5.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.nr: |
| type = CellInfo.TYPE_NR; |
| android.hardware.radio.V1_5.CellInfoNr nr = record.ratSpecificInfo.nr(); |
| nrCi = convertHalCellIdentityNr(nr.cellIdentityNr); |
| nrSs = convertHalNrSignalStrength(nr.signalStrengthNr); |
| break; |
| default: return null; |
| } |
| } else if (cellInfo instanceof android.hardware.radio.V1_6.CellInfo) { |
| final android.hardware.radio.V1_6.CellInfo record = |
| (android.hardware.radio.V1_6.CellInfo) cellInfo; |
| connectionStatus = record.connectionStatus; |
| registered = record.registered; |
| switch (record.ratSpecificInfo.getDiscriminator()) { |
| case android.hardware.radio.V1_6.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.gsm: |
| type = CellInfo.TYPE_GSM; |
| android.hardware.radio.V1_5.CellInfoGsm gsm = record.ratSpecificInfo.gsm(); |
| gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); |
| gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); |
| break; |
| case android.hardware.radio.V1_6.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.cdma: |
| type = CellInfo.TYPE_CDMA; |
| android.hardware.radio.V1_2.CellInfoCdma cdma = record.ratSpecificInfo.cdma(); |
| cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); |
| cdmaSs = convertHalCdmaSignalStrength( |
| cdma.signalStrengthCdma, cdma.signalStrengthEvdo); |
| break; |
| case android.hardware.radio.V1_6.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.lte: |
| type = CellInfo.TYPE_LTE; |
| android.hardware.radio.V1_6.CellInfoLte lte = record.ratSpecificInfo.lte(); |
| lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); |
| lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); |
| lteCc = new CellConfigLte(); |
| break; |
| case android.hardware.radio.V1_6.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.wcdma: |
| type = CellInfo.TYPE_WCDMA; |
| android.hardware.radio.V1_5.CellInfoWcdma wcdma = |
| record.ratSpecificInfo.wcdma(); |
| wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); |
| wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); |
| break; |
| case android.hardware.radio.V1_6.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.tdscdma: |
| type = CellInfo.TYPE_TDSCDMA; |
| android.hardware.radio.V1_5.CellInfoTdscdma tdscdma = |
| record.ratSpecificInfo.tdscdma(); |
| tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); |
| tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); |
| break; |
| case android.hardware.radio.V1_6.CellInfo |
| .CellInfoRatSpecificInfo.hidl_discriminator.nr: |
| type = CellInfo.TYPE_NR; |
| android.hardware.radio.V1_6.CellInfoNr nr = record.ratSpecificInfo.nr(); |
| nrCi = convertHalCellIdentityNr(nr.cellIdentityNr); |
| nrSs = convertHalNrSignalStrength(nr.signalStrengthNr); |
| break; |
| default: return null; |
| } |
| } else { |
| return null; |
| } |
| |
| switch (type) { |
| case CellInfo.TYPE_GSM: |
| return new CellInfoGsm(connectionStatus, registered, nanotime, gsmCi, gsmSs); |
| case CellInfo.TYPE_CDMA: |
| return new CellInfoCdma(connectionStatus, registered, nanotime, cdmaCi, cdmaSs); |
| case CellInfo.TYPE_LTE: |
| return new CellInfoLte(connectionStatus, registered, nanotime, lteCi, lteSs, lteCc); |
| case CellInfo.TYPE_WCDMA: |
| return new CellInfoWcdma(connectionStatus, registered, nanotime, wcdmaCi, wcdmaSs); |
| case CellInfo.TYPE_TDSCDMA: |
| return new CellInfoTdscdma(connectionStatus, registered, nanotime, tdscdmaCi, |
| tdscdmaSs); |
| case CellInfo.TYPE_NR: |
| return new CellInfoNr(connectionStatus, registered, nanotime, nrCi, nrSs); |
| case CellInfo.TYPE_UNKNOWN: |
| default: |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellInfo defined in CellInfo.aidl to CellInfo |
| * @param cellInfo CellInfo defined in CellInfo.aidl |
| * @param nanotime time the CellInfo was created |
| * @return The converted CellInfo |
| */ |
| private static CellInfo convertHalCellInfo(android.hardware.radio.network.CellInfo cellInfo, |
| long nanotime) { |
| if (cellInfo == null) return null; |
| int connectionStatus = cellInfo.connectionStatus; |
| boolean registered = cellInfo.registered; |
| switch (cellInfo.ratSpecificInfo.getTag()) { |
| case android.hardware.radio.network.CellInfoRatSpecificInfo.gsm: |
| android.hardware.radio.network.CellInfoGsm gsm = cellInfo.ratSpecificInfo.getGsm(); |
| return new CellInfoGsm(connectionStatus, registered, nanotime, |
| convertHalCellIdentityGsm(gsm.cellIdentityGsm), |
| convertHalGsmSignalStrength(gsm.signalStrengthGsm)); |
| case android.hardware.radio.network.CellInfoRatSpecificInfo.cdma: |
| android.hardware.radio.network.CellInfoCdma cdma = |
| cellInfo.ratSpecificInfo.getCdma(); |
| return new CellInfoCdma(connectionStatus, registered, nanotime, |
| convertHalCellIdentityCdma(cdma.cellIdentityCdma), |
| convertHalCdmaSignalStrength(cdma.signalStrengthCdma, |
| cdma.signalStrengthEvdo)); |
| case android.hardware.radio.network.CellInfoRatSpecificInfo.lte: |
| android.hardware.radio.network.CellInfoLte lte = cellInfo.ratSpecificInfo.getLte(); |
| return new CellInfoLte(connectionStatus, registered, nanotime, |
| convertHalCellIdentityLte(lte.cellIdentityLte), |
| convertHalLteSignalStrength(lte.signalStrengthLte), new CellConfigLte()); |
| case android.hardware.radio.network.CellInfoRatSpecificInfo.wcdma: |
| android.hardware.radio.network.CellInfoWcdma wcdma = |
| cellInfo.ratSpecificInfo.getWcdma(); |
| return new CellInfoWcdma(connectionStatus, registered, nanotime, |
| convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma), |
| convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma)); |
| case android.hardware.radio.network.CellInfoRatSpecificInfo.tdscdma: |
| android.hardware.radio.network.CellInfoTdscdma tdscdma = |
| cellInfo.ratSpecificInfo.getTdscdma(); |
| return new CellInfoTdscdma(connectionStatus, registered, nanotime, |
| convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma), |
| convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma)); |
| case android.hardware.radio.network.CellInfoRatSpecificInfo.nr: |
| android.hardware.radio.network.CellInfoNr nr = cellInfo.ratSpecificInfo.getNr(); |
| return new CellInfoNr(connectionStatus, registered, nanotime, |
| convertHalCellIdentityNr(nr.cellIdentityNr), |
| convertHalNrSignalStrength(nr.signalStrengthNr)); |
| default: |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentity defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentity |
| * @param halCi CellIdentity defined in radio/1.0, 1.2, 1.5/types.hal |
| * @return The converted CellIdentity |
| */ |
| public static CellIdentity convertHalCellIdentity(Object halCi) { |
| if (halCi == null) return null; |
| if (halCi instanceof android.hardware.radio.V1_0.CellIdentity) { |
| android.hardware.radio.V1_0.CellIdentity ci = |
| (android.hardware.radio.V1_0.CellIdentity) halCi; |
| switch (ci.cellInfoType) { |
| case CellInfo.TYPE_GSM: |
| if (ci.cellIdentityGsm.size() == 1) { |
| return convertHalCellIdentityGsm(ci.cellIdentityGsm.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_CDMA: |
| if (ci.cellIdentityCdma.size() == 1) { |
| return convertHalCellIdentityCdma(ci.cellIdentityCdma.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_LTE: |
| if (ci.cellIdentityLte.size() == 1) { |
| return convertHalCellIdentityLte(ci.cellIdentityLte.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_WCDMA: |
| if (ci.cellIdentityWcdma.size() == 1) { |
| return convertHalCellIdentityWcdma(ci.cellIdentityWcdma.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_TDSCDMA: |
| if (ci.cellIdentityTdscdma.size() == 1) { |
| return convertHalCellIdentityTdscdma(ci.cellIdentityTdscdma.get(0)); |
| } |
| break; |
| } |
| } else if (halCi instanceof android.hardware.radio.V1_2.CellIdentity) { |
| android.hardware.radio.V1_2.CellIdentity ci = |
| (android.hardware.radio.V1_2.CellIdentity) halCi; |
| switch (ci.cellInfoType) { |
| case CellInfo.TYPE_GSM: |
| if (ci.cellIdentityGsm.size() == 1) { |
| return convertHalCellIdentityGsm(ci.cellIdentityGsm.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_CDMA: |
| if (ci.cellIdentityCdma.size() == 1) { |
| return convertHalCellIdentityCdma(ci.cellIdentityCdma.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_LTE: |
| if (ci.cellIdentityLte.size() == 1) { |
| return convertHalCellIdentityLte(ci.cellIdentityLte.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_WCDMA: |
| if (ci.cellIdentityWcdma.size() == 1) { |
| return convertHalCellIdentityWcdma(ci.cellIdentityWcdma.get(0)); |
| } |
| break; |
| case CellInfo.TYPE_TDSCDMA: |
| if (ci.cellIdentityTdscdma.size() == 1) { |
| return convertHalCellIdentityTdscdma(ci.cellIdentityTdscdma.get(0)); |
| } |
| break; |
| } |
| } else if (halCi instanceof android.hardware.radio.V1_5.CellIdentity) { |
| android.hardware.radio.V1_5.CellIdentity ci = |
| (android.hardware.radio.V1_5.CellIdentity) halCi; |
| switch (ci.getDiscriminator()) { |
| case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.gsm: |
| return convertHalCellIdentityGsm(ci.gsm()); |
| case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.cdma: |
| return convertHalCellIdentityCdma(ci.cdma()); |
| case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.lte: |
| return convertHalCellIdentityLte(ci.lte()); |
| case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.wcdma: |
| return convertHalCellIdentityWcdma(ci.wcdma()); |
| case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.tdscdma: |
| return convertHalCellIdentityTdscdma(ci.tdscdma()); |
| case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.nr: |
| return convertHalCellIdentityNr(ci.nr()); |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Convert a CellIdentity defined in CellIdentity.aidl to CellInfo |
| * @param ci CellIdentity defined in CellIdentity.aidl |
| * @return The converted CellIdentity |
| */ |
| public static CellIdentity convertHalCellIdentity( |
| android.hardware.radio.network.CellIdentity ci) { |
| if (ci == null) return null; |
| switch (ci.getTag()) { |
| case android.hardware.radio.network.CellIdentity.gsm: |
| return convertHalCellIdentityGsm(ci.getGsm()); |
| case android.hardware.radio.network.CellIdentity.cdma: |
| return convertHalCellIdentityCdma(ci.getCdma()); |
| case android.hardware.radio.network.CellIdentity.lte: |
| return convertHalCellIdentityLte(ci.getLte()); |
| case android.hardware.radio.network.CellIdentity.wcdma: |
| return convertHalCellIdentityWcdma(ci.getWcdma()); |
| case android.hardware.radio.network.CellIdentity.tdscdma: |
| return convertHalCellIdentityTdscdma(ci.getTdscdma()); |
| case android.hardware.radio.network.CellIdentity.nr: |
| return convertHalCellIdentityNr(ci.getNr()); |
| default: return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentityGsm defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityGsm |
| * @param gsm CellIdentityGsm defined in radio/1.0, 1.2, 1.5/types.hal |
| * @return The converted CellIdentityGsm |
| */ |
| public static CellIdentityGsm convertHalCellIdentityGsm(Object gsm) { |
| if (gsm == null) return null; |
| if (gsm instanceof android.hardware.radio.V1_0.CellIdentityGsm) { |
| android.hardware.radio.V1_0.CellIdentityGsm ci = |
| (android.hardware.radio.V1_0.CellIdentityGsm) gsm; |
| return new CellIdentityGsm(ci.lac, ci.cid, ci.arfcn, |
| ci.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE : ci.bsic, ci.mcc, ci.mnc, "", "", |
| new ArraySet<>()); |
| } else if (gsm instanceof android.hardware.radio.V1_2.CellIdentityGsm) { |
| android.hardware.radio.V1_2.CellIdentityGsm ci = |
| (android.hardware.radio.V1_2.CellIdentityGsm) gsm; |
| return new CellIdentityGsm(ci.base.lac, ci.base.cid, ci.base.arfcn, |
| ci.base.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE : ci.base.bsic, ci.base.mcc, |
| ci.base.mnc, ci.operatorNames.alphaLong, ci.operatorNames.alphaShort, |
| new ArraySet<>()); |
| } else if (gsm instanceof android.hardware.radio.V1_5.CellIdentityGsm) { |
| android.hardware.radio.V1_5.CellIdentityGsm ci = |
| (android.hardware.radio.V1_5.CellIdentityGsm) gsm; |
| return new CellIdentityGsm(ci.base.base.lac, ci.base.base.cid, ci.base.base.arfcn, |
| ci.base.base.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE |
| : ci.base.base.bsic, ci.base.base.mcc, ci.base.base.mnc, |
| ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, |
| ci.additionalPlmns); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentityGsm defined in CellIdentityGsm.aidl to CellIdentityGsm |
| * @param cid CellIdentityGsm defined in CellIdentityGsm.aidl |
| * @return The converted CellIdentityGsm |
| */ |
| public static CellIdentityGsm convertHalCellIdentityGsm( |
| android.hardware.radio.network.CellIdentityGsm cid) { |
| return new CellIdentityGsm(cid.lac, cid.cid, cid.arfcn, |
| cid.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE : cid.bsic, cid.mcc, cid.mnc, |
| cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, new ArraySet<>()); |
| } |
| |
| /** |
| * Convert a CellIdentityCdma defined in radio/1.0, 1.2/types.hal to CellIdentityCdma |
| * @param cdma CellIdentityCdma defined in radio/1.0, 1.2/types.hal |
| * @return The converted CellIdentityCdma |
| */ |
| public static CellIdentityCdma convertHalCellIdentityCdma(Object cdma) { |
| if (cdma == null) return null; |
| if (cdma instanceof android.hardware.radio.V1_0.CellIdentityCdma) { |
| android.hardware.radio.V1_0.CellIdentityCdma ci = |
| (android.hardware.radio.V1_0.CellIdentityCdma) cdma; |
| return new CellIdentityCdma(ci.networkId, ci.systemId, ci.baseStationId, ci.longitude, |
| ci.latitude, "", ""); |
| } else if (cdma instanceof android.hardware.radio.V1_2.CellIdentityCdma) { |
| android.hardware.radio.V1_2.CellIdentityCdma ci = |
| (android.hardware.radio.V1_2.CellIdentityCdma) cdma; |
| return new CellIdentityCdma(ci.base.networkId, ci.base.systemId, ci.base.baseStationId, |
| ci.base.longitude, ci.base.latitude, ci.operatorNames.alphaLong, |
| ci.operatorNames.alphaShort); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentityCdma defined in CellIdentityCdma.aidl to CellIdentityCdma |
| * @param cid CellIdentityCdma defined in CelIdentityCdma.aidl |
| * @return The converted CellIdentityCdma |
| */ |
| public static CellIdentityCdma convertHalCellIdentityCdma( |
| android.hardware.radio.network.CellIdentityCdma cid) { |
| return new CellIdentityCdma(cid.networkId, cid.systemId, cid.baseStationId, cid.longitude, |
| cid.latitude, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort); |
| } |
| |
| /** |
| * Convert a CellIdentityLte defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityLte |
| * @param lte CellIdentityLte defined in radio/1.0, 1.2, 1.5/types.hal |
| * @return The converted CellIdentityLte |
| */ |
| public static CellIdentityLte convertHalCellIdentityLte(Object lte) { |
| if (lte == null) return null; |
| if (lte instanceof android.hardware.radio.V1_0.CellIdentityLte) { |
| android.hardware.radio.V1_0.CellIdentityLte ci = |
| (android.hardware.radio.V1_0.CellIdentityLte) lte; |
| return new CellIdentityLte(ci.ci, ci.pci, ci.tac, ci.earfcn, new int[] {}, |
| CellInfo.UNAVAILABLE, ci.mcc, ci.mnc, "", "", new ArraySet<>(), null); |
| } else if (lte instanceof android.hardware.radio.V1_2.CellIdentityLte) { |
| android.hardware.radio.V1_2.CellIdentityLte ci = |
| (android.hardware.radio.V1_2.CellIdentityLte) lte; |
| return new CellIdentityLte(ci.base.ci, ci.base.pci, ci.base.tac, ci.base.earfcn, |
| new int[] {}, ci.bandwidth, ci.base.mcc, ci.base.mnc, |
| ci.operatorNames.alphaLong, ci.operatorNames.alphaShort, new ArraySet<>(), |
| null); |
| } else if (lte instanceof android.hardware.radio.V1_5.CellIdentityLte) { |
| android.hardware.radio.V1_5.CellIdentityLte ci = |
| (android.hardware.radio.V1_5.CellIdentityLte) lte; |
| return new CellIdentityLte(ci.base.base.ci, ci.base.base.pci, ci.base.base.tac, |
| ci.base.base.earfcn, ci.bands.stream().mapToInt(Integer::intValue).toArray(), |
| ci.base.bandwidth, ci.base.base.mcc, ci.base.base.mnc, |
| ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, |
| ci.additionalPlmns, convertHalClosedSubscriberGroupInfo(ci.optionalCsgInfo)); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentityLte defined in CellIdentityLte.aidl to CellIdentityLte |
| * @param cid CellIdentityLte defined in CellIdentityLte.aidl |
| * @return The converted CellIdentityLte |
| */ |
| public static CellIdentityLte convertHalCellIdentityLte( |
| android.hardware.radio.network.CellIdentityLte cid) { |
| return new CellIdentityLte(cid.ci, cid.pci, cid.tac, cid.earfcn, cid.bands, cid.bandwidth, |
| cid.mcc, cid.mnc, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, |
| primitiveArrayToArrayList(cid.additionalPlmns), |
| convertHalClosedSubscriberGroupInfo(cid.csgInfo)); |
| } |
| |
| /** |
| * Convert a CellIdentityWcdma defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityWcdma |
| * @param wcdma CellIdentityWcdma defined in radio/1.0, 1.2, 1.5/types.hal |
| * @return The converted CellIdentityWcdma |
| */ |
| public static CellIdentityWcdma convertHalCellIdentityWcdma(Object wcdma) { |
| if (wcdma == null) return null; |
| if (wcdma instanceof android.hardware.radio.V1_0.CellIdentityWcdma) { |
| android.hardware.radio.V1_0.CellIdentityWcdma ci = |
| (android.hardware.radio.V1_0.CellIdentityWcdma) wcdma; |
| return new CellIdentityWcdma(ci.lac, ci.cid, ci.psc, ci.uarfcn, ci.mcc, ci.mnc, "", "", |
| new ArraySet<>(), null); |
| } else if (wcdma instanceof android.hardware.radio.V1_2.CellIdentityWcdma) { |
| android.hardware.radio.V1_2.CellIdentityWcdma ci = |
| (android.hardware.radio.V1_2.CellIdentityWcdma) wcdma; |
| return new CellIdentityWcdma(ci.base.lac, ci.base.cid, ci.base.psc, ci.base.uarfcn, |
| ci.base.mcc, ci.base.mnc, ci.operatorNames.alphaLong, |
| ci.operatorNames.alphaShort, new ArraySet<>(), null); |
| } else if (wcdma instanceof android.hardware.radio.V1_5.CellIdentityWcdma) { |
| android.hardware.radio.V1_5.CellIdentityWcdma ci = |
| (android.hardware.radio.V1_5.CellIdentityWcdma) wcdma; |
| return new CellIdentityWcdma(ci.base.base.lac, ci.base.base.cid, ci.base.base.psc, |
| ci.base.base.uarfcn, ci.base.base.mcc, ci.base.base.mnc, |
| ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, |
| ci.additionalPlmns, convertHalClosedSubscriberGroupInfo(ci.optionalCsgInfo)); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentityWcdma defined in CellIdentityWcdma.aidl to CellIdentityWcdma |
| * @param cid CellIdentityWcdma defined in CellIdentityWcdma.aidl |
| * @return The converted CellIdentityWcdma |
| */ |
| public static CellIdentityWcdma convertHalCellIdentityWcdma( |
| android.hardware.radio.network.CellIdentityWcdma cid) { |
| return new CellIdentityWcdma(cid.lac, cid.cid, cid.psc, cid.uarfcn, cid.mcc, cid.mnc, |
| cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, |
| primitiveArrayToArrayList(cid.additionalPlmns), |
| convertHalClosedSubscriberGroupInfo(cid.csgInfo)); |
| } |
| |
| /** |
| * Convert a CellIdentityTdscdma defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityTdscdma |
| * @param tdscdma CellIdentityTdscdma defined in radio/1.0, 1.2, 1.5/types.hal |
| * @return The converted CellIdentityTdscdma |
| */ |
| public static CellIdentityTdscdma convertHalCellIdentityTdscdma(Object tdscdma) { |
| if (tdscdma == null) return null; |
| if (tdscdma instanceof android.hardware.radio.V1_0.CellIdentityTdscdma) { |
| android.hardware.radio.V1_0.CellIdentityTdscdma ci = |
| (android.hardware.radio.V1_0.CellIdentityTdscdma) tdscdma; |
| return new CellIdentityTdscdma(ci.mcc, ci.mnc, ci.lac, ci.cid, ci.cpid, |
| CellInfo.UNAVAILABLE, "", "", Collections.emptyList(), null); |
| } else if (tdscdma instanceof android.hardware.radio.V1_2.CellIdentityTdscdma) { |
| android.hardware.radio.V1_2.CellIdentityTdscdma ci = |
| (android.hardware.radio.V1_2.CellIdentityTdscdma) tdscdma; |
| return new CellIdentityTdscdma(ci.base.mcc, ci.base.mnc, ci.base.lac, ci.base.cid, |
| ci.base.cpid, ci.uarfcn, ci.operatorNames.alphaLong, |
| ci.operatorNames.alphaShort, Collections.emptyList(), null); |
| } else if (tdscdma instanceof android.hardware.radio.V1_5.CellIdentityTdscdma) { |
| android.hardware.radio.V1_5.CellIdentityTdscdma ci = |
| (android.hardware.radio.V1_5.CellIdentityTdscdma) tdscdma; |
| return new CellIdentityTdscdma(ci.base.base.mcc, ci.base.base.mnc, ci.base.base.lac, |
| ci.base.base.cid, ci.base.base.cpid, ci.base.uarfcn, |
| ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, |
| ci.additionalPlmns, convertHalClosedSubscriberGroupInfo(ci.optionalCsgInfo)); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentityTdscdma defined in CellIdentityTdscdma.aidl to CellIdentityTdscdma |
| * @param cid CellIdentityTdscdma defined in radio/1.0, 1.2, 1.5/types.hal |
| * @return The converted CellIdentityTdscdma |
| */ |
| public static CellIdentityTdscdma convertHalCellIdentityTdscdma( |
| android.hardware.radio.network.CellIdentityTdscdma cid) { |
| return new CellIdentityTdscdma(cid.mcc, cid.mnc, cid.lac, cid.cid, cid.cpid, cid.uarfcn, |
| cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, |
| primitiveArrayToArrayList(cid.additionalPlmns), |
| convertHalClosedSubscriberGroupInfo(cid.csgInfo)); |
| } |
| |
| /** |
| * Convert a CellIdentityNr defined in radio/1.4, 1.5/types.hal to CellIdentityNr |
| * @param nr CellIdentityNr defined in radio/1.4 1.5/types.hal |
| * @return The converted CellIdentityNr |
| */ |
| public static CellIdentityNr convertHalCellIdentityNr(Object nr) { |
| if (nr == null) return null; |
| if (nr instanceof android.hardware.radio.V1_4.CellIdentityNr) { |
| android.hardware.radio.V1_4.CellIdentityNr ci = |
| (android.hardware.radio.V1_4.CellIdentityNr) nr; |
| return new CellIdentityNr(ci.pci, ci.tac, ci.nrarfcn, new int[] {}, ci.mcc, ci.mnc, |
| ci.nci, ci.operatorNames.alphaLong, ci.operatorNames.alphaShort, |
| new ArraySet<>()); |
| } else if (nr instanceof android.hardware.radio.V1_5.CellIdentityNr) { |
| android.hardware.radio.V1_5.CellIdentityNr ci = |
| (android.hardware.radio.V1_5.CellIdentityNr) nr; |
| return new CellIdentityNr(ci.base.pci, ci.base.tac, ci.base.nrarfcn, |
| ci.bands.stream().mapToInt(Integer::intValue).toArray(), ci.base.mcc, |
| ci.base.mnc, ci.base.nci, ci.base.operatorNames.alphaLong, |
| ci.base.operatorNames.alphaShort, ci.additionalPlmns); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a CellIdentityNr defined in CellIdentityNr.aidl to CellIdentityNr |
| * @param cid CellIdentityNr defined in CellIdentityNr.aidl |
| * @return The converted CellIdentityNr |
| */ |
| public static CellIdentityNr convertHalCellIdentityNr( |
| android.hardware.radio.network.CellIdentityNr cid) { |
| return new CellIdentityNr(cid.pci, cid.tac, cid.nrarfcn, cid.bands, cid.mcc, cid.mnc, |
| cid.nci, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, |
| primitiveArrayToArrayList(cid.additionalPlmns)); |
| } |
| |
| /** |
| * Convert a SignalStrength defined in radio/1.0, 1.2, 1.4, 1.6/types.hal to SignalStrength |
| * @param ss SignalStrength defined in radio/1.0, 1.2, 1.4, 1.6/types.hal |
| * @return The converted SignalStrength |
| */ |
| public static SignalStrength convertHalSignalStrength(Object ss) { |
| if (ss == null) return null; |
| if (ss instanceof android.hardware.radio.V1_0.SignalStrength) { |
| android.hardware.radio.V1_0.SignalStrength signalStrength = |
| (android.hardware.radio.V1_0.SignalStrength) ss; |
| return new SignalStrength( |
| convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), |
| convertHalGsmSignalStrength(signalStrength.gw), new CellSignalStrengthWcdma(), |
| convertHalTdscdmaSignalStrength(signalStrength.tdScdma), |
| convertHalLteSignalStrength(signalStrength.lte), |
| new CellSignalStrengthNr()); |
| } else if (ss instanceof android.hardware.radio.V1_2.SignalStrength) { |
| android.hardware.radio.V1_2.SignalStrength signalStrength = |
| (android.hardware.radio.V1_2.SignalStrength) ss; |
| return new SignalStrength( |
| convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), |
| convertHalGsmSignalStrength(signalStrength.gsm), |
| convertHalWcdmaSignalStrength(signalStrength.wcdma), |
| convertHalTdscdmaSignalStrength(signalStrength.tdScdma), |
| convertHalLteSignalStrength(signalStrength.lte), new CellSignalStrengthNr()); |
| } else if (ss instanceof android.hardware.radio.V1_4.SignalStrength) { |
| android.hardware.radio.V1_4.SignalStrength signalStrength = |
| (android.hardware.radio.V1_4.SignalStrength) ss; |
| return new SignalStrength( |
| convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), |
| convertHalGsmSignalStrength(signalStrength.gsm), |
| convertHalWcdmaSignalStrength(signalStrength.wcdma), |
| convertHalTdscdmaSignalStrength(signalStrength.tdscdma), |
| convertHalLteSignalStrength(signalStrength.lte), |
| convertHalNrSignalStrength(signalStrength.nr)); |
| } else if (ss instanceof android.hardware.radio.V1_6.SignalStrength) { |
| android.hardware.radio.V1_6.SignalStrength signalStrength = |
| (android.hardware.radio.V1_6.SignalStrength) ss; |
| return new SignalStrength( |
| convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), |
| convertHalGsmSignalStrength(signalStrength.gsm), |
| convertHalWcdmaSignalStrength(signalStrength.wcdma), |
| convertHalTdscdmaSignalStrength(signalStrength.tdscdma), |
| convertHalLteSignalStrength(signalStrength.lte), |
| convertHalNrSignalStrength(signalStrength.nr)); |
| } |
| return null; |
| } |
| |
| /** |
| * Convert a SignalStrength defined in SignalStrength.aidl to SignalStrength |
| * @param signalStrength SignalStrength defined in SignalStrength.aidl |
| * @return The converted SignalStrength |
| */ |
| public static SignalStrength convertHalSignalStrength( |
| android.hardware.radio.network.SignalStrength signalStrength) { |
| return new SignalStrength( |
| convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), |
| convertHalGsmSignalStrength(signalStrength.gsm), |
| convertHalWcdmaSignalStrength(signalStrength.wcdma), |
| convertHalTdscdmaSignalStrength(signalStrength.tdscdma), |
| convertHalLteSignalStrength(signalStrength.lte), |
| convertHalNrSignalStrength(signalStrength.nr)); |
| } |
| |
| /** |
| * Convert a GsmSignalStrength defined in radio/1.0/types.hal to CellSignalStrengthGsm |
| * @param ss GsmSignalStrength defined in radio/1.0/types.hal |
| * @return The converted CellSignalStrengthGsm |
| */ |
| public static CellSignalStrengthGsm convertHalGsmSignalStrength( |
| android.hardware.radio.V1_0.GsmSignalStrength ss) { |
| CellSignalStrengthGsm ret = new CellSignalStrengthGsm( |
| CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, |
| ss.timingAdvance); |
| if (ret.getRssi() == CellInfo.UNAVAILABLE) { |
| ret.setDefaultValues(); |
| ret.updateLevel(null, null); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert a GsmSignalStrength defined in GsmSignalStrength.aidl to CellSignalStrengthGsm |
| * @param ss GsmSignalStrength defined in GsmSignalStrength.aidl |
| * @return The converted CellSignalStrengthGsm |
| */ |
| public static CellSignalStrengthGsm convertHalGsmSignalStrength( |
| android.hardware.radio.network.GsmSignalStrength ss) { |
| CellSignalStrengthGsm ret = new CellSignalStrengthGsm( |
| CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, |
| ss.timingAdvance); |
| if (ret.getRssi() == CellInfo.UNAVAILABLE) { |
| ret.setDefaultValues(); |
| ret.updateLevel(null, null); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert a CdmaSignalStrength and EvdoSignalStrength defined in radio/1.0/types.hal to |
| * CellSignalStrengthCdma |
| * @param cdma CdmaSignalStrength defined in radio/1.0/types.hal |
| * @param evdo EvdoSignalStrength defined in radio/1.0/types.hal |
| * @return The converted CellSignalStrengthCdma |
| */ |
| public static CellSignalStrengthCdma convertHalCdmaSignalStrength( |
| android.hardware.radio.V1_0.CdmaSignalStrength cdma, |
| android.hardware.radio.V1_0.EvdoSignalStrength evdo) { |
| return new CellSignalStrengthCdma(-cdma.dbm, -cdma.ecio, -evdo.dbm, -evdo.ecio, |
| evdo.signalNoiseRatio); |
| } |
| |
| /** |
| * Convert a CdmaSignalStrength and EvdoSignalStrength defined in radio/network to |
| * CellSignalStrengthCdma |
| * @param cdma CdmaSignalStrength defined in CdmaSignalStrength.aidl |
| * @param evdo EvdoSignalStrength defined in EvdoSignalStrength.aidl |
| * @return The converted CellSignalStrengthCdma |
| */ |
| public static CellSignalStrengthCdma convertHalCdmaSignalStrength( |
| android.hardware.radio.network.CdmaSignalStrength cdma, |
| android.hardware.radio.network.EvdoSignalStrength evdo) { |
| return new CellSignalStrengthCdma(-cdma.dbm, -cdma.ecio, -evdo.dbm, -evdo.ecio, |
| evdo.signalNoiseRatio); |
| } |
| |
| /** |
| * Convert a LteSignalStrength defined in radio/1.0, 1.6/types.hal to CellSignalStrengthLte |
| * @param lte LteSignalStrength defined in radio/1.0, 1.6/types.hal |
| * @return The converted CellSignalStrengthLte |
| */ |
| public static CellSignalStrengthLte convertHalLteSignalStrength(Object lte) { |
| if (lte == null) return null; |
| if (lte instanceof android.hardware.radio.V1_0.LteSignalStrength) { |
| android.hardware.radio.V1_0.LteSignalStrength ss = |
| (android.hardware.radio.V1_0.LteSignalStrength) lte; |
| return new CellSignalStrengthLte( |
| CellSignalStrengthLte.convertRssiAsuToDBm(ss.signalStrength), |
| ss.rsrp != CellInfo.UNAVAILABLE ? -ss.rsrp : ss.rsrp, |
| ss.rsrq != CellInfo.UNAVAILABLE ? -ss.rsrq : ss.rsrq, |
| CellSignalStrengthLte.convertRssnrUnitFromTenDbToDB(ss.rssnr), ss.cqi, |
| ss.timingAdvance); |
| } else if (lte instanceof android.hardware.radio.V1_6.LteSignalStrength) { |
| android.hardware.radio.V1_6.LteSignalStrength ss = |
| (android.hardware.radio.V1_6.LteSignalStrength) lte; |
| return new CellSignalStrengthLte( |
| CellSignalStrengthLte.convertRssiAsuToDBm(ss.base.signalStrength), |
| ss.base.rsrp != CellInfo.UNAVAILABLE ? -ss.base.rsrp : ss.base.rsrp, |
| ss.base.rsrq != CellInfo.UNAVAILABLE ? -ss.base.rsrq : ss.base.rsrq, |
| CellSignalStrengthLte.convertRssnrUnitFromTenDbToDB(ss.base.rssnr), |
| ss.cqiTableIndex, ss.base.cqi, ss.base.timingAdvance); |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Convert a LteSignalStrength defined in LteSignalStrength.aidl to CellSignalStrengthLte |
| * @param ss LteSignalStrength defined in LteSignalStrength.aidl |
| * @return The converted CellSignalStrengthLte |
| */ |
| public static CellSignalStrengthLte convertHalLteSignalStrength( |
| android.hardware.radio.network.LteSignalStrength ss) { |
| return new CellSignalStrengthLte( |
| CellSignalStrengthLte.convertRssiAsuToDBm(ss.signalStrength), |
| ss.rsrp != CellInfo.UNAVAILABLE ? -ss.rsrp : ss.rsrp, |
| ss.rsrq != CellInfo.UNAVAILABLE ? -ss.rsrq : ss.rsrq, |
| CellSignalStrengthLte.convertRssnrUnitFromTenDbToDB(ss.rssnr), ss.cqiTableIndex, |
| ss.cqi, ss.timingAdvance); |
| } |
| |
| /** |
| * Convert a WcdmaSignalStrength defined in radio/1.0, 1.2/types.hal to CellSignalStrengthWcdma |
| * @param wcdma WcdmaSignalStrength defined in radio/1.0, 1.2/types.hal |
| * @return The converted CellSignalStrengthWcdma |
| */ |
| public static CellSignalStrengthWcdma convertHalWcdmaSignalStrength(Object wcdma) { |
| if (wcdma == null) return null; |
| CellSignalStrengthWcdma ret = null; |
| if (wcdma instanceof android.hardware.radio.V1_0.WcdmaSignalStrength) { |
| android.hardware.radio.V1_0.WcdmaSignalStrength ss = |
| (android.hardware.radio.V1_0.WcdmaSignalStrength) wcdma; |
| ret = new CellSignalStrengthWcdma( |
| CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, |
| CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE); |
| } else if (wcdma instanceof android.hardware.radio.V1_2.WcdmaSignalStrength) { |
| android.hardware.radio.V1_2.WcdmaSignalStrength ss = |
| (android.hardware.radio.V1_2.WcdmaSignalStrength) wcdma; |
| ret = new CellSignalStrengthWcdma( |
| CellSignalStrength.getRssiDbmFromAsu(ss.base.signalStrength), |
| ss.base.bitErrorRate, CellSignalStrength.getRscpDbmFromAsu(ss.rscp), |
| CellSignalStrength.getEcNoDbFromAsu(ss.ecno)); |
| } |
| if (ret != null && ret.getRssi() == CellInfo.UNAVAILABLE |
| && ret.getRscp() == CellInfo.UNAVAILABLE) { |
| ret.setDefaultValues(); |
| ret.updateLevel(null, null); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert a WcdmaSignalStrength defined in WcdmaSignalStrength.aidl to CellSignalStrengthWcdma |
| * @param ss WcdmaSignalStrength defined in WcdmaSignalStrength.aidl |
| * @return The converted CellSignalStrengthWcdma |
| */ |
| public static CellSignalStrengthWcdma convertHalWcdmaSignalStrength( |
| android.hardware.radio.network.WcdmaSignalStrength ss) { |
| CellSignalStrengthWcdma ret = new CellSignalStrengthWcdma( |
| CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), |
| ss.bitErrorRate, CellSignalStrength.getRscpDbmFromAsu(ss.rscp), |
| CellSignalStrength.getEcNoDbFromAsu(ss.ecno)); |
| if (ret.getRssi() == CellInfo.UNAVAILABLE && ret.getRscp() == CellInfo.UNAVAILABLE) { |
| ret.setDefaultValues(); |
| ret.updateLevel(null, null); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert a TdScdmaSignalStrength defined in radio/1.0/types.hal or TdscdmaSignalStrength |
| * defined in radio/1.2/types.hal to CellSignalStrengthTdscdma |
| * @param tdscdma TdScdmaSignalStrength defined in radio/1.0/types.hal or TdscdmaSignalStrength |
| * defined in radio/1.2/types.hal |
| * @return The converted CellSignalStrengthTdscdma |
| */ |
| public static CellSignalStrengthTdscdma convertHalTdscdmaSignalStrength(Object tdscdma) { |
| if (tdscdma == null) return null; |
| CellSignalStrengthTdscdma ret = null; |
| if (tdscdma instanceof android.hardware.radio.V1_0.TdScdmaSignalStrength) { |
| android.hardware.radio.V1_0.TdScdmaSignalStrength ss = |
| (android.hardware.radio.V1_0.TdScdmaSignalStrength) tdscdma; |
| ret = new CellSignalStrengthTdscdma(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, |
| ss.rscp != CellInfo.UNAVAILABLE ? -ss.rscp : ss.rscp); |
| } else if (tdscdma instanceof android.hardware.radio.V1_2.TdscdmaSignalStrength) { |
| android.hardware.radio.V1_2.TdscdmaSignalStrength ss = |
| (android.hardware.radio.V1_2.TdscdmaSignalStrength) tdscdma; |
| ret = new CellSignalStrengthTdscdma( |
| CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, |
| CellSignalStrength.getRscpDbmFromAsu(ss.rscp)); |
| } |
| if (ret != null && ret.getRssi() == CellInfo.UNAVAILABLE |
| && ret.getRscp() == CellInfo.UNAVAILABLE) { |
| ret.setDefaultValues(); |
| ret.updateLevel(null, null); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert a TdscdmaSignalStrength defined in TdscdmaSignalStrength.aidl to |
| * CellSignalStrengthTdscdma |
| * @param ss TdscdmaSignalStrength defined in TdscdmaSignalStrength.aidl |
| * @return The converted CellSignalStrengthTdscdma |
| */ |
| public static CellSignalStrengthTdscdma convertHalTdscdmaSignalStrength( |
| android.hardware.radio.network.TdscdmaSignalStrength ss) { |
| CellSignalStrengthTdscdma ret = new CellSignalStrengthTdscdma( |
| CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), |
| ss.bitErrorRate, CellSignalStrength.getRscpDbmFromAsu(ss.rscp)); |
| if (ret.getRssi() == CellInfo.UNAVAILABLE && ret.getRscp() == CellInfo.UNAVAILABLE) { |
| ret.setDefaultValues(); |
| ret.updateLevel(null, null); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert a NrSignalStrength defined in radio/1.4, 1.6/types.hal to CellSignalStrengthNr |
| * @param nr NrSignalStrength defined in radio/1.4, 1.6/types.hal |
| * @return The converted CellSignalStrengthNr |
| */ |
| public static CellSignalStrengthNr convertHalNrSignalStrength(Object nr) { |
| if (nr == null) return null; |
| if (nr instanceof android.hardware.radio.V1_4.NrSignalStrength) { |
| android.hardware.radio.V1_4.NrSignalStrength ss = |
| (android.hardware.radio.V1_4.NrSignalStrength) nr; |
| return new CellSignalStrengthNr(CellSignalStrengthNr.flip(ss.csiRsrp), |
| CellSignalStrengthNr.flip(ss.csiRsrq), ss.csiSinr, |
| CellSignalStrengthNr.flip(ss.ssRsrp), CellSignalStrengthNr.flip(ss.ssRsrq), |
| ss.ssSinr); |
| } else if (nr instanceof android.hardware.radio.V1_6.NrSignalStrength) { |
| android.hardware.radio.V1_6.NrSignalStrength ss = |
| (android.hardware.radio.V1_6.NrSignalStrength) nr; |
| return new CellSignalStrengthNr(CellSignalStrengthNr.flip(ss.base.csiRsrp), |
| CellSignalStrengthNr.flip(ss.base.csiRsrq), ss.base.csiSinr, |
| ss.csiCqiTableIndex, ss.csiCqiReport, CellSignalStrengthNr.flip(ss.base.ssRsrp), |
| CellSignalStrengthNr.flip(ss.base.ssRsrq), ss.base.ssSinr); |
| } |
| return null; |
| } |
| |
| /** |
| * Convert a NrSignalStrength defined in NrSignalStrength.aidl to CellSignalStrengthNr |
| * @param ss NrSignalStrength defined in NrSignalStrength.aidl |
| * @return The converted CellSignalStrengthNr |
| */ |
| public static CellSignalStrengthNr convertHalNrSignalStrength( |
| android.hardware.radio.network.NrSignalStrength ss) { |
| return new CellSignalStrengthNr(CellSignalStrengthNr.flip(ss.csiRsrp), |
| CellSignalStrengthNr.flip(ss.csiRsrq), ss.csiSinr, ss.csiCqiTableIndex, |
| primitiveArrayToArrayList(ss.csiCqiReport), CellSignalStrengthNr.flip(ss.ssRsrp), |
| CellSignalStrengthNr.flip(ss.ssRsrq), ss.ssSinr); |
| } |
| |
| private static ClosedSubscriberGroupInfo convertHalClosedSubscriberGroupInfo( |
| android.hardware.radio.V1_5.OptionalCsgInfo optionalCsgInfo) { |
| android.hardware.radio.V1_5.ClosedSubscriberGroupInfo csgInfo = |
| optionalCsgInfo.getDiscriminator() |
| == android.hardware.radio.V1_5.OptionalCsgInfo.hidl_discriminator.csgInfo |
| ? optionalCsgInfo.csgInfo() : null; |
| if (csgInfo == null) return null; |
| return new ClosedSubscriberGroupInfo(csgInfo.csgIndication, csgInfo.homeNodebName, |
| csgInfo.csgIdentity); |
| } |
| |
| private static ClosedSubscriberGroupInfo convertHalClosedSubscriberGroupInfo( |
| android.hardware.radio.network.ClosedSubscriberGroupInfo csgInfo) { |
| if (csgInfo == null) return null; |
| return new ClosedSubscriberGroupInfo(csgInfo.csgIndication, csgInfo.homeNodebName, |
| csgInfo.csgIdentity); |
| } |
| |
| /** |
| * Convert a list of BarringInfo defined in radio/1.5/types.hal to a sparse array of |
| * BarringServiceInfos |
| * @param halBarringInfos List of BarringInfos defined in radio/1.5/types.hal |
| * @return The converted sparse array of BarringServiceInfos |
| */ |
| public static SparseArray<BarringInfo.BarringServiceInfo> convertHalBarringInfoList( |
| List<android.hardware.radio.V1_5.BarringInfo> halBarringInfos) { |
| SparseArray<BarringInfo.BarringServiceInfo> serviceInfos = new SparseArray<>(); |
| for (android.hardware.radio.V1_5.BarringInfo halBarringInfo : halBarringInfos) { |
| if (halBarringInfo.barringType |
| == android.hardware.radio.V1_5.BarringInfo.BarringType.CONDITIONAL) { |
| if (halBarringInfo.barringTypeSpecificInfo.getDiscriminator() |
| != android.hardware.radio.V1_5.BarringInfo.BarringTypeSpecificInfo |
| .hidl_discriminator.conditional) { |
| // this is an error case where the barring info is conditional but the |
| // conditional barring fields weren't included |
| continue; |
| } |
| android.hardware.radio.V1_5.BarringInfo.BarringTypeSpecificInfo |
| .Conditional conditionalInfo = |
| halBarringInfo.barringTypeSpecificInfo.conditional(); |
| serviceInfos.put( |
| halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( |
| halBarringInfo.barringType, // will always be CONDITIONAL here |
| conditionalInfo.isBarred, |
| conditionalInfo.factor, |
| conditionalInfo.timeSeconds)); |
| } else { |
| // Barring type is either NONE or UNCONDITIONAL |
| serviceInfos.put( |
| halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( |
| halBarringInfo.barringType, false, 0, 0)); |
| } |
| } |
| return serviceInfos; |
| } |
| |
| /** |
| * Convert a list of BarringInfo defined in BarringInfo.aidl to a sparse array of |
| * BarringServiceInfos |
| * @param halBarringInfos List of BarringInfos defined in BarringInfo.aidl |
| * @return The converted sparse array of BarringServiceInfos |
| */ |
| public static SparseArray<BarringInfo.BarringServiceInfo> convertHalBarringInfoList( |
| android.hardware.radio.network.BarringInfo[] halBarringInfos) { |
| SparseArray<BarringInfo.BarringServiceInfo> serviceInfos = new SparseArray<>(); |
| for (android.hardware.radio.network.BarringInfo halBarringInfo : halBarringInfos) { |
| if (halBarringInfo.barringType |
| == android.hardware.radio.network.BarringInfo.BARRING_TYPE_CONDITIONAL) { |
| if (halBarringInfo.barringTypeSpecificInfo == null) { |
| // this is an error case where the barring info is conditional but the |
| // conditional barring fields weren't included |
| continue; |
| } |
| serviceInfos.put( |
| halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( |
| halBarringInfo.barringType, // will always be CONDITIONAL here |
| halBarringInfo.barringTypeSpecificInfo.isBarred, |
| halBarringInfo.barringTypeSpecificInfo.factor, |
| halBarringInfo.barringTypeSpecificInfo.timeSeconds)); |
| } else { |
| // Barring type is either NONE or UNCONDITIONAL |
| serviceInfos.put(halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( |
| halBarringInfo.barringType, false, 0, 0)); |
| } |
| } |
| return serviceInfos; |
| } |
| |
| private static LinkAddress convertToLinkAddress(String addressString) { |
| return convertToLinkAddress(addressString, 0, LinkAddress.LIFETIME_UNKNOWN, |
| LinkAddress.LIFETIME_UNKNOWN); |
| } |
| |
| private static LinkAddress convertToLinkAddress(String addressString, int properties, |
| long deprecationTime, long expirationTime) { |
| addressString = addressString.trim(); |
| InetAddress address = null; |
| int prefixLength = -1; |
| try { |
| String[] pieces = addressString.split("/", 2); |
| address = InetAddresses.parseNumericAddress(pieces[0]); |
| if (pieces.length == 1) { |
| prefixLength = (address instanceof Inet4Address) ? 32 : 128; |
| } else if (pieces.length == 2) { |
| prefixLength = Integer.parseInt(pieces[1]); |
| } |
| } catch (NullPointerException e) { // Null string. |
| } catch (ArrayIndexOutOfBoundsException e) { // No prefix length. |
| } catch (NumberFormatException e) { // Non-numeric prefix. |
| } catch (IllegalArgumentException e) { // Invalid IP address. |
| } |
| |
| if (address == null || prefixLength == -1) { |
| throw new IllegalArgumentException("Invalid link address " + addressString); |
| } |
| |
| return new LinkAddress(address, prefixLength, properties, 0, deprecationTime, |
| expirationTime); |
| } |
| |
| /** |
| * Convert SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal into |
| * DataCallResponse |
| * @param dcResult SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal |
| * @return The converted DataCallResponse |
| */ |
| @VisibleForTesting |
| public static DataCallResponse convertHalDataCallResult(Object dcResult) { |
| if (dcResult == null) return null; |
| |
| int cause, cid, active, mtu, mtuV4, mtuV6; |
| long suggestedRetryTime; |
| String ifname; |
| int protocolType; |
| String[] addresses = null; |
| String[] dnses = null; |
| String[] gateways = null; |
| String[] pcscfs = null; |
| Qos defaultQos = null; |
| @DataCallResponse.HandoverFailureMode |
| int handoverFailureMode = DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY; |
| int pduSessionId = DataCallResponse.PDU_SESSION_ID_NOT_SET; |
| List<LinkAddress> laList = new ArrayList<>(); |
| List<QosBearerSession> qosSessions = new ArrayList<>(); |
| NetworkSliceInfo sliceInfo = null; |
| List<TrafficDescriptor> trafficDescriptors = new ArrayList<>(); |
| |
| if (dcResult instanceof android.hardware.radio.V1_0.SetupDataCallResult) { |
| final android.hardware.radio.V1_0.SetupDataCallResult result = |
| (android.hardware.radio.V1_0.SetupDataCallResult) dcResult; |
| cause = result.status; |
| suggestedRetryTime = result.suggestedRetryTime; |
| cid = result.cid; |
| active = result.active; |
| protocolType = ApnSetting.getProtocolIntFromString(result.type); |
| ifname = result.ifname; |
| if (!TextUtils.isEmpty(result.addresses)) { |
| addresses = result.addresses.split("\\s+"); |
| } |
| if (!TextUtils.isEmpty(result.dnses)) { |
| dnses = result.dnses.split("\\s+"); |
| } |
| if (!TextUtils.isEmpty(result.gateways)) { |
| gateways = result.gateways.split("\\s+"); |
| } |
| if (!TextUtils.isEmpty(result.pcscf)) { |
| pcscfs = result.pcscf.split("\\s+"); |
| } |
| mtu = mtuV4 = mtuV6 = result.mtu; |
| if (addresses != null) { |
| for (String address : addresses) { |
| laList.add(convertToLinkAddress(address)); |
| } |
| } |
| } else if (dcResult instanceof android.hardware.radio.V1_4.SetupDataCallResult) { |
| final android.hardware.radio.V1_4.SetupDataCallResult result = |
| (android.hardware.radio.V1_4.SetupDataCallResult) dcResult; |
| cause = result.cause; |
| suggestedRetryTime = result.suggestedRetryTime; |
| cid = result.cid; |
| active = result.active; |
| protocolType = result.type; |
| ifname = result.ifname; |
| addresses = result.addresses.toArray(new String[0]); |
| dnses = result.dnses.toArray(new String[0]); |
| gateways = result.gateways.toArray(new String[0]); |
| pcscfs = result.pcscf.toArray(new String[0]); |
| mtu = mtuV4 = mtuV6 = result.mtu; |
| if (addresses != null) { |
| for (String address : addresses) { |
| laList.add(convertToLinkAddress(address)); |
| } |
| } |
| } else if (dcResult instanceof android.hardware.radio.V1_5.SetupDataCallResult) { |
| final android.hardware.radio.V1_5.SetupDataCallResult result = |
| (android.hardware.radio.V1_5.SetupDataCallResult) dcResult; |
| cause = result.cause; |
| suggestedRetryTime = result.suggestedRetryTime; |
| cid = result.cid; |
| active = result.active; |
| protocolType = result.type; |
| ifname = result.ifname; |
| laList = result.addresses.stream().map(la -> convertToLinkAddress( |
| la.address, la.properties, la.deprecationTime, la.expirationTime)) |
| .collect(Collectors.toList()); |
| dnses = result.dnses.toArray(new String[0]); |
| gateways = result.gateways.toArray(new String[0]); |
| pcscfs = result.pcscf.toArray(new String[0]); |
| mtu = Math.max(result.mtuV4, result.mtuV6); |
| mtuV4 = result.mtuV4; |
| mtuV6 = result.mtuV6; |
| } else if (dcResult instanceof android.hardware.radio.V1_6.SetupDataCallResult) { |
| final android.hardware.radio.V1_6.SetupDataCallResult result = |
| (android.hardware.radio.V1_6.SetupDataCallResult) dcResult; |
| cause = result.cause; |
| suggestedRetryTime = result.suggestedRetryTime; |
| cid = result.cid; |
| active = result.active; |
| protocolType = result.type; |
| ifname = result.ifname; |
| laList = result.addresses.stream().map(la -> convertToLinkAddress( |
| la.address, la.properties, la.deprecationTime, la.expirationTime)) |
| .collect(Collectors.toList()); |
| dnses = result.dnses.toArray(new String[0]); |
| gateways = result.gateways.toArray(new String[0]); |
| pcscfs = result.pcscf.toArray(new String[0]); |
| mtu = Math.max(result.mtuV4, result.mtuV6); |
| mtuV4 = result.mtuV4; |
| mtuV6 = result.mtuV6; |
| handoverFailureMode = result.handoverFailureMode; |
| pduSessionId = result.pduSessionId; |
| defaultQos = convertHalQos(result.defaultQos); |
| qosSessions = result.qosSessions.stream().map(RILUtils::convertHalQosBearerSession) |
| .collect(Collectors.toList()); |
| sliceInfo = result.sliceInfo.getDiscriminator() |
| == android.hardware.radio.V1_6.OptionalSliceInfo.hidl_discriminator.noinit |
| ? null : convertHalSliceInfo(result.sliceInfo.value()); |
| for (android.hardware.radio.V1_6.TrafficDescriptor td : result.trafficDescriptors) { |
| try { |
| trafficDescriptors.add(RILUtils.convertHalTrafficDescriptor(td)); |
| } catch (IllegalArgumentException e) { |
| loge("convertHalDataCallResult: Failed to convert traffic descriptor. e=" + e); |
| } |
| } |
| } else { |
| loge("Unsupported SetupDataCallResult " + dcResult); |
| return null; |
| } |
| |
| // Process dns |
| List<InetAddress> dnsList = new ArrayList<>(); |
| if (dnses != null) { |
| for (String dns : dnses) { |
| dns = dns.trim(); |
| InetAddress ia; |
| try { |
| ia = InetAddresses.parseNumericAddress(dns); |
| dnsList.add(ia); |
| } catch (IllegalArgumentException e) { |
| Rlog.e(TAG, "Unknown dns: " + dns, e); |
| } |
| } |
| } |
| |
| // Process gateway |
| List<InetAddress> gatewayList = new ArrayList<>(); |
| if (gateways != null) { |
| for (String gateway : gateways) { |
| gateway = gateway.trim(); |
| InetAddress ia; |
| try { |
| ia = InetAddresses.parseNumericAddress(gateway); |
| gatewayList.add(ia); |
| } catch (IllegalArgumentException e) { |
| Rlog.e(TAG, "Unknown gateway: " + gateway, e); |
| } |
| } |
| } |
| |
| // Process gateway |
| List<InetAddress> pcscfList = new ArrayList<>(); |
| if (pcscfs != null) { |
| for (String pcscf : pcscfs) { |
| pcscf = pcscf.trim(); |
| InetAddress ia; |
| try { |
| ia = InetAddresses.parseNumericAddress(pcscf); |
| pcscfList.add(ia); |
| } catch (IllegalArgumentException e) { |
| Rlog.e(TAG, "Unknown pcscf: " + pcscf, e); |
| } |
| } |
| } |
| |
| return new DataCallResponse.Builder() |
| .setCause(cause) |
| .setRetryDurationMillis(suggestedRetryTime) |
| .setId(cid) |
| .setLinkStatus(active) |
| .setProtocolType(protocolType) |
| .setInterfaceName(ifname) |
| .setAddresses(laList) |
| .setDnsAddresses(dnsList) |
| .setGatewayAddresses(gatewayList) |
| .setPcscfAddresses(pcscfList) |
| .setMtu(mtu) |
| .setMtuV4(mtuV4) |
| .setMtuV6(mtuV6) |
| .setHandoverFailureMode(handoverFailureMode) |
| .setPduSessionId(pduSessionId) |
| .setDefaultQos(defaultQos) |
| .setQosBearerSessions(qosSessions) |
| .setSliceInfo(sliceInfo) |
| .setTrafficDescriptors(trafficDescriptors) |
| .build(); |
| } |
| |
| /** |
| * Convert SetupDataCallResult defined in SetupDataCallResult.aidl into DataCallResponse |
| * @param result SetupDataCallResult defined in SetupDataCallResult.aidl |
| * @return The converted DataCallResponse |
| */ |
| @VisibleForTesting |
| public static DataCallResponse convertHalDataCallResult( |
| android.hardware.radio.data.SetupDataCallResult result) { |
| if (result == null) return null; |
| List<LinkAddress> laList = new ArrayList<>(); |
| for (android.hardware.radio.data.LinkAddress la : result.addresses) { |
| laList.add(convertToLinkAddress(la.address, la.addressProperties, |
| la.deprecationTime, la.expirationTime)); |
| } |
| List<InetAddress> dnsList = new ArrayList<>(); |
| if (result.dnses != null) { |
| for (String dns : result.dnses) { |
| dns = dns.trim(); |
| InetAddress ia; |
| try { |
| ia = InetAddresses.parseNumericAddress(dns); |
| dnsList.add(ia); |
| } catch (IllegalArgumentException e) { |
| Rlog.e(TAG, "Unknown dns: " + dns, e); |
| } |
| } |
| } |
| List<InetAddress> gatewayList = new ArrayList<>(); |
| if (result.gateways != null) { |
| for (String gateway : result.gateways) { |
| gateway = gateway.trim(); |
| InetAddress ia; |
| try { |
| ia = InetAddresses.parseNumericAddress(gateway); |
| gatewayList.add(ia); |
| } catch (IllegalArgumentException e) { |
| Rlog.e(TAG, "Unknown gateway: " + gateway, e); |
| } |
| } |
| } |
| List<InetAddress> pcscfList = new ArrayList<>(); |
| if (result.pcscf != null) { |
| for (String pcscf : result.pcscf) { |
| pcscf = pcscf.trim(); |
| InetAddress ia; |
| try { |
| ia = InetAddresses.parseNumericAddress(pcscf); |
| pcscfList.add(ia); |
| } catch (IllegalArgumentException e) { |
| Rlog.e(TAG, "Unknown pcscf: " + pcscf, e); |
| } |
| } |
| } |
| List<QosBearerSession> qosSessions = new ArrayList<>(); |
| for (android.hardware.radio.data.QosSession session : result.qosSessions) { |
| qosSessions.add(convertHalQosBearerSession(session)); |
| } |
| List<TrafficDescriptor> trafficDescriptors = new ArrayList<>(); |
| for (android.hardware.radio.data.TrafficDescriptor td : result.trafficDescriptors) { |
| try { |
| trafficDescriptors.add(convertHalTrafficDescriptor(td)); |
| } catch (IllegalArgumentException e) { |
| loge("convertHalDataCallResult: Failed to convert traffic descriptor. e=" + e); |
| } |
| } |
| |
| return new DataCallResponse.Builder() |
| .setCause(result.cause) |
| .setRetryDurationMillis(result.suggestedRetryTime) |
| .setId(result.cid) |
| .setLinkStatus(result.active) |
| .setProtocolType(result.type) |
| .setInterfaceName(result.ifname) |
| .setAddresses(laList) |
| .setDnsAddresses(dnsList) |
| .setGatewayAddresses(gatewayList) |
| .setPcscfAddresses(pcscfList) |
| .setMtu(Math.max(result.mtuV4, result.mtuV6)) |
| .setMtuV4(result.mtuV4) |
| .setMtuV6(result.mtuV6) |
| .setHandoverFailureMode(result.handoverFailureMode) |
| .setPduSessionId(result.pduSessionId) |
| .setDefaultQos(convertHalQos(result.defaultQos)) |
| .setQosBearerSessions(qosSessions) |
| .setSliceInfo(result.sliceInfo == null ? null |
| : convertHalSliceInfo(result.sliceInfo)) |
| .setTrafficDescriptors(trafficDescriptors) |
| .build(); |
| } |
| |
| private static NetworkSliceInfo convertHalSliceInfo(android.hardware.radio.V1_6.SliceInfo si) { |
| NetworkSliceInfo.Builder builder = new NetworkSliceInfo.Builder() |
| .setSliceServiceType(si.sst) |
| .setMappedHplmnSliceServiceType(si.mappedHplmnSst); |
| if (si.sliceDifferentiator != NetworkSliceInfo.SLICE_DIFFERENTIATOR_NO_SLICE) { |
| builder.setSliceDifferentiator(si.sliceDifferentiator) |
| .setMappedHplmnSliceDifferentiator(si.mappedHplmnSD); |
| } |
| return builder.build(); |
| } |
| |
| private static NetworkSliceInfo convertHalSliceInfo(android.hardware.radio.data.SliceInfo si) { |
| NetworkSliceInfo.Builder builder = new NetworkSliceInfo.Builder() |
| .setSliceServiceType(si.sliceServiceType) |
| .setMappedHplmnSliceServiceType(si.mappedHplmnSst); |
| if (si.sliceDifferentiator != NetworkSliceInfo.SLICE_DIFFERENTIATOR_NO_SLICE) { |
| builder.setSliceDifferentiator(si.sliceDifferentiator) |
| .setMappedHplmnSliceDifferentiator(si.mappedHplmnSd); |
| } |
| return builder.build(); |
| } |
| |
| private static TrafficDescriptor convertHalTrafficDescriptor( |
| android.hardware.radio.V1_6.TrafficDescriptor td) throws IllegalArgumentException { |
| String dnn = td.dnn.getDiscriminator() |
| == android.hardware.radio.V1_6.OptionalDnn.hidl_discriminator.noinit |
| ? null : td.dnn.value(); |
| byte[] osAppId = td.osAppId.getDiscriminator() |
| == android.hardware.radio.V1_6.OptionalOsAppId.hidl_discriminator.noinit |
| ? null : arrayListToPrimitiveArray(td.osAppId.value().osAppId); |
| |
| TrafficDescriptor.Builder builder = new TrafficDescriptor.Builder(); |
| if (dnn != null) { |
| builder.setDataNetworkName(dnn); |
| } |
| if (osAppId != null) { |
| builder.setOsAppId(osAppId); |
| } |
| return builder.build(); |
| } |
| |
| private static TrafficDescriptor convertHalTrafficDescriptor( |
| android.hardware.radio.data.TrafficDescriptor td) throws IllegalArgumentException { |
| String dnn = td.dnn; |
| byte[] osAppId = td.osAppId == null ? null : td.osAppId.osAppId; |
| TrafficDescriptor.Builder builder = new TrafficDescriptor.Builder(); |
| if (dnn != null) { |
| builder.setDataNetworkName(dnn); |
| } |
| if (osAppId != null) { |
| builder.setOsAppId(osAppId); |
| } |
| return builder.build(); |
| } |
| |
| /** |
| * Convert SlicingConfig defined in radio/1.6/types.hal to NetworkSlicingConfig |
| * @param sc SlicingConfig defined in radio/1.6/types.hal |
| * @return The converted NetworkSlicingConfig |
| */ |
| public static NetworkSlicingConfig convertHalSlicingConfig( |
| android.hardware.radio.V1_6.SlicingConfig sc) { |
| List<UrspRule> urspRules = sc.urspRules.stream().map(ur -> new UrspRule(ur.precedence, |
| ur.trafficDescriptors.stream() |
| .map(td -> { |
| try { |
| return convertHalTrafficDescriptor(td); |
| } catch (IllegalArgumentException e) { |
| loge("convertHalSlicingConfig: Failed to convert traffic descriptor" |
| + ". e=" + e); |
| return null; |
| } |
| }) |
| .filter(Objects::nonNull) |
| .collect(Collectors.toList()), |
| ur.routeSelectionDescriptor.stream().map(rsd -> new RouteSelectionDescriptor( |
| rsd.precedence, rsd.sessionType.value(), rsd.sscMode.value(), |
| rsd.sliceInfo.stream().map(RILUtils::convertHalSliceInfo) |
| .collect(Collectors.toList()), |
| rsd.dnn)).collect(Collectors.toList()))) |
| .collect(Collectors.toList()); |
| return new NetworkSlicingConfig(urspRules, sc.sliceInfo.stream() |
| .map(RILUtils::convertHalSliceInfo).collect(Collectors.toList())); |
| } |
| |
| /** |
| * Convert SlicingConfig defined in SlicingConfig.aidl to NetworkSlicingConfig |
| * @param sc SlicingConfig defined in SlicingConfig.aidl |
| * @return The converted NetworkSlicingConfig |
| */ |
| public static NetworkSlicingConfig convertHalSlicingConfig( |
| android.hardware.radio.data.SlicingConfig sc) { |
| List<UrspRule> urspRules = new ArrayList<>(); |
| for (android.hardware.radio.data.UrspRule ur : sc.urspRules) { |
| List<TrafficDescriptor> tds = new ArrayList<>(); |
| for (android.hardware.radio.data.TrafficDescriptor td : ur.trafficDescriptors) { |
| try { |
| tds.add(convertHalTrafficDescriptor(td)); |
| } catch (IllegalArgumentException e) { |
| loge("convertHalTrafficDescriptor: " + e); |
| } |
| } |
| List<RouteSelectionDescriptor> rsds = new ArrayList<>(); |
| for (android.hardware.radio.data.RouteSelectionDescriptor rsd |
| : ur.routeSelectionDescriptor) { |
| List<NetworkSliceInfo> sliceInfo = new ArrayList<>(); |
| for (android.hardware.radio.data.SliceInfo si : rsd.sliceInfo) { |
| sliceInfo.add(convertHalSliceInfo(si)); |
| } |
| rsds.add(new RouteSelectionDescriptor(rsd.precedence, rsd.sessionType, rsd.sscMode, |
| sliceInfo, primitiveArrayToArrayList(rsd.dnn))); |
| } |
| urspRules.add(new UrspRule(ur.precedence, tds, rsds)); |
| } |
| List<NetworkSliceInfo> sliceInfo = new ArrayList<>(); |
| for (android.hardware.radio.data.SliceInfo si : sc.sliceInfo) { |
| sliceInfo.add(convertHalSliceInfo(si)); |
| } |
| return new NetworkSlicingConfig(urspRules, sliceInfo); |
| } |
| |
| private static Qos.QosBandwidth convertHalQosBandwidth( |
| android.hardware.radio.V1_6.QosBandwidth bandwidth) { |
| return new Qos.QosBandwidth(bandwidth.maxBitrateKbps, bandwidth.guaranteedBitrateKbps); |
| } |
| |
| private static Qos.QosBandwidth convertHalQosBandwidth( |
| android.hardware.radio.data.QosBandwidth bandwidth) { |
| return new Qos.QosBandwidth(bandwidth.maxBitrateKbps, bandwidth.guaranteedBitrateKbps); |
| } |
| |
| private static Qos convertHalQos(android.hardware.radio.V1_6.Qos qos) { |
| switch (qos.getDiscriminator()) { |
| case android.hardware.radio.V1_6.Qos.hidl_discriminator.eps: |
| android.hardware.radio.V1_6.EpsQos eps = qos.eps(); |
| return new EpsQos(convertHalQosBandwidth(eps.downlink), |
| convertHalQosBandwidth(eps.uplink), eps.qci); |
| case android.hardware.radio.V1_6.Qos.hidl_discriminator.nr: |
| android.hardware.radio.V1_6.NrQos nr = qos.nr(); |
| return new NrQos(convertHalQosBandwidth(nr.downlink), |
| convertHalQosBandwidth(nr.uplink), nr.qfi, nr.fiveQi, nr.averagingWindowMs); |
| default: |
| return null; |
| } |
| } |
| |
| private static Qos convertHalQos(android.hardware.radio.data.Qos qos) { |
| switch (qos.getTag()) { |
| case android.hardware.radio.data.Qos.eps: |
| android.hardware.radio.data.EpsQos eps = qos.getEps(); |
| return new EpsQos(convertHalQosBandwidth(eps.downlink), |
| convertHalQosBandwidth(eps.uplink), eps.qci); |
| case android.hardware.radio.data.Qos.nr: |
| android.hardware.radio.data.NrQos nr = qos.getNr(); |
| return new NrQos(convertHalQosBandwidth(nr.downlink), |
| convertHalQosBandwidth(nr.uplink), nr.qfi, nr.fiveQi, |
| nr.averagingWindowMs); |
| default: |
| return null; |
| } |
| } |
| |
| private static QosBearerFilter convertHalQosBearerFilter( |
| android.hardware.radio.V1_6.QosFilter qosFilter) { |
| List<LinkAddress> localAddressList = new ArrayList<>(); |
| String[] localAddresses = qosFilter.localAddresses.toArray(new String[0]); |
| if (localAddresses != null) { |
| for (String address : localAddresses) { |
| localAddressList.add(convertToLinkAddress(address)); |
| } |
| } |
| List<LinkAddress> remoteAddressList = new ArrayList<>(); |
| String[] remoteAddresses = qosFilter.remoteAddresses.toArray(new String[0]); |
| if (remoteAddresses != null) { |
| for (String address : remoteAddresses) { |
| remoteAddressList.add(convertToLinkAddress(address)); |
| } |
| } |
| QosBearerFilter.PortRange localPort = null; |
| if (qosFilter.localPort != null) { |
| if (qosFilter.localPort.getDiscriminator() |
| == android.hardware.radio.V1_6.MaybePort.hidl_discriminator.range) { |
| final android.hardware.radio.V1_6.PortRange portRange = qosFilter.localPort.range(); |
| localPort = new QosBearerFilter.PortRange(portRange.start, portRange.end); |
| } |
| } |
| QosBearerFilter.PortRange remotePort = null; |
| if (qosFilter.remotePort != null) { |
| if (qosFilter.remotePort.getDiscriminator() |
| == android.hardware.radio.V1_6.MaybePort.hidl_discriminator.range) { |
| final android.hardware.radio.V1_6.PortRange portRange = |
| qosFilter.remotePort.range(); |
| remotePort = new QosBearerFilter.PortRange(portRange.start, portRange.end); |
| } |
| } |
| int tos = -1; |
| if (qosFilter.tos != null) { |
| if (qosFilter.tos.getDiscriminator() == android.hardware.radio.V1_6.QosFilter |
| .TypeOfService.hidl_discriminator.value) { |
| tos = qosFilter.tos.value(); |
| } |
| } |
| long flowLabel = -1; |
| if (qosFilter.flowLabel != null) { |
| if (qosFilter.flowLabel.getDiscriminator() == android.hardware.radio.V1_6.QosFilter |
| .Ipv6FlowLabel.hidl_discriminator.value) { |
| flowLabel = qosFilter.flowLabel.value(); |
| } |
| } |
| long spi = -1; |
| if (qosFilter.spi != null) { |
| if (qosFilter.spi.getDiscriminator() |
| == android.hardware.radio.V1_6.QosFilter.IpsecSpi.hidl_discriminator.value) { |
| spi = qosFilter.spi.value(); |
| } |
| } |
| return new QosBearerFilter(localAddressList, remoteAddressList, localPort, remotePort, |
| qosFilter.protocol, tos, flowLabel, spi, qosFilter.direction, qosFilter.precedence); |
| } |
| |
| private static QosBearerFilter convertHalQosBearerFilter( |
| android.hardware.radio.data.QosFilter qosFilter) { |
| List<LinkAddress> localAddressList = new ArrayList<>(); |
| String[] localAddresses = qosFilter.localAddresses; |
| if (localAddresses != null) { |
| for (String address : localAddresses) { |
| localAddressList.add(convertToLinkAddress(address)); |
| } |
| } |
| List<LinkAddress> remoteAddressList = new ArrayList<>(); |
| String[] remoteAddresses = qosFilter.remoteAddresses; |
| if (remoteAddresses != null) { |
| for (String address : remoteAddresses) { |
| remoteAddressList.add(convertToLinkAddress(address)); |
| } |
| } |
| QosBearerFilter.PortRange localPort = null; |
| if (qosFilter.localPort != null) { |
| localPort = new QosBearerFilter.PortRange( |
| qosFilter.localPort.start, qosFilter.localPort.end); |
| } |
| QosBearerFilter.PortRange remotePort = null; |
| if (qosFilter.remotePort != null) { |
| remotePort = new QosBearerFilter.PortRange( |
| qosFilter.remotePort.start, qosFilter.remotePort.end); |
| } |
| int tos = -1; |
| if (qosFilter.tos != null) { |
| if (qosFilter.tos.getTag() |
| == android.hardware.radio.data.QosFilterTypeOfService.value) { |
| tos = qosFilter.tos.value; |
| } |
| } |
| long flowLabel = -1; |
| if (qosFilter.flowLabel != null) { |
| if (qosFilter.flowLabel.getTag() |
| == android.hardware.radio.data.QosFilterIpv6FlowLabel.value) { |
| flowLabel = qosFilter.flowLabel.value; |
| } |
| } |
| long spi = -1; |
| if (qosFilter.spi != null) { |
| if (qosFilter.spi.getTag() |
| == android.hardware.radio.data.QosFilterIpsecSpi.value) { |
| spi = qosFilter.spi.value; |
| } |
| } |
| return new QosBearerFilter(localAddressList, remoteAddressList, localPort, remotePort, |
| qosFilter.protocol, tos, flowLabel, spi, qosFilter.direction, qosFilter.precedence); |
| } |
| |
| private static QosBearerSession convertHalQosBearerSession( |
| android.hardware.radio.V1_6.QosSession qosSession) { |
| List<QosBearerFilter> qosBearerFilters = new ArrayList<>(); |
| if (qosSession.qosFilters != null) { |
| for (android.hardware.radio.V1_6.QosFilter filter : qosSession.qosFilters) { |
| qosBearerFilters.add(convertHalQosBearerFilter(filter)); |
| } |
| } |
| return new QosBearerSession(qosSession.qosSessionId, convertHalQos(qosSession.qos), |
| qosBearerFilters); |
| } |
| |
| private static QosBearerSession convertHalQosBearerSession( |
| android.hardware.radio.data.QosSession qosSession) { |
| List<QosBearerFilter> qosBearerFilters = new ArrayList<>(); |
| if (qosSession.qosFilters != null) { |
| for (android.hardware.radio.data.QosFilter filter : qosSession.qosFilters) { |
| qosBearerFilters.add(convertHalQosBearerFilter(filter)); |
| } |
| } |
| return new QosBearerSession(qosSession.qosSessionId, convertHalQos(qosSession.qos), |
| qosBearerFilters); |
| } |
| |
| /** |
| * Convert a list of SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal into |
| * a list of DataCallResponse |
| * @param dataCallResultList List of SetupDataCallResult defined in |
| * radio/1.0, 1.4, 1.5, 1.6/types.hal |
| * @return The converted list of DataCallResponses |
| */ |
| @VisibleForTesting |
| public static ArrayList<DataCallResponse> convertHalDataCallResultList( |
| List<? extends Object> dataCallResultList) { |
| ArrayList<DataCallResponse> response = new ArrayList<>(dataCallResultList.size()); |
| |
| for (Object obj : dataCallResultList) { |
| response.add(convertHalDataCallResult(obj)); |
| } |
| return response; |
| } |
| |
| /** |
| * Convert a list of SetupDataCallResult defined in SetupDataCallResult.aidl into a list of |
| * DataCallResponse |
| * @param dataCallResultList Array of SetupDataCallResult defined in SetupDataCallResult.aidl |
| * @return The converted list of DataCallResponses |
| */ |
| @VisibleForTesting |
| public static ArrayList<DataCallResponse> convertHalDataCallResultList( |
| android.hardware.radio.data.SetupDataCallResult[] dataCallResultList) { |
| ArrayList<DataCallResponse> response = new ArrayList<>(dataCallResultList.length); |
| |
| for (android.hardware.radio.data.SetupDataCallResult result : dataCallResultList) { |
| response.add(convertHalDataCallResult(result)); |
| } |
| return response; |
| } |
| |
| /** |
| * Convert KeepaliveStatusCode defined in radio/1.1/types.hal and KeepaliveStatus.aidl |
| * to KeepaliveStatus |
| * @param halCode KeepaliveStatus code defined in radio/1.1/types.hal or KeepaliveStatus.aidl |
| * @return The converted KeepaliveStatus |
| */ |
| public static @KeepaliveStatusCode int convertHalKeepaliveStatusCode(int halCode) { |
| switch (halCode) { |
| case android.hardware.radio.V1_1.KeepaliveStatusCode.ACTIVE: |
| return KeepaliveStatus.STATUS_ACTIVE; |
| case android.hardware.radio.V1_1.KeepaliveStatusCode.INACTIVE: |
| return KeepaliveStatus.STATUS_INACTIVE; |
| case android.hardware.radio.V1_1.KeepaliveStatusCode.PENDING: |
| return KeepaliveStatus.STATUS_PENDING; |
| default: |
| return -1; |
| } |
| } |
| |
| /** |
| * Convert RadioState defined in radio/1.0/types.hal and RadioState.aidl to RadioPowerState |
| * @param stateInt Radio state defined in radio/1.0/types.hal or RadioState.aidl |
| * @return The converted {@link Annotation.RadioPowerState RadioPowerState} |
| */ |
| public static @Annotation.RadioPowerState int convertHalRadioState(int stateInt) { |
| int state; |
| switch(stateInt) { |
| case android.hardware.radio.V1_0.RadioState.OFF: |
| state = TelephonyManager.RADIO_POWER_OFF; |
| break; |
| case android.hardware.radio.V1_0.RadioState.UNAVAILABLE: |
| state = TelephonyManager.RADIO_POWER_UNAVAILABLE; |
| break; |
| case android.hardware.radio.V1_0.RadioState.ON: |
| state = TelephonyManager.RADIO_POWER_ON; |
| break; |
| default: |
| throw new RuntimeException("Unrecognized RadioState: " + stateInt); |
| } |
| return state; |
| } |
| |
| /** |
| * Convert CellConnectionStatus defined in radio/1.2/types.hal to ConnectionStatus |
| * @param status Cell connection status defined in radio/1.2/types.hal |
| * @return The converted ConnectionStatus |
| */ |
| public static int convertHalCellConnectionStatus(int status) { |
| switch (status) { |
| case android.hardware.radio.V1_2.CellConnectionStatus.PRIMARY_SERVING: |
| return PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING; |
| case android.hardware.radio.V1_2.CellConnectionStatus.SECONDARY_SERVING: |
| return PhysicalChannelConfig.CONNECTION_SECONDARY_SERVING; |
| default: |
| return PhysicalChannelConfig.CONNECTION_UNKNOWN; |
| } |
| } |
| |
| /** |
| * Convert Call defined in radio/1.0, 1.2, 1.6/types.hal to DriverCall |
| * @param halCall Call defined in radio/1.0, 1.2, 1.6/types.hal |
| * @return The converted DriverCall |
| */ |
| public static DriverCall convertToDriverCall(Object halCall) { |
| DriverCall dc = new DriverCall(); |
| final android.hardware.radio.V1_6.Call call16; |
| final android.hardware.radio.V1_2.Call call12; |
| final android.hardware.radio.V1_0.Call call10; |
| if (halCall instanceof android.hardware.radio.V1_6.Call) { |
| call16 = (android.hardware.radio.V1_6.Call) halCall; |
| call12 = call16.base; |
| call10 = call12.base; |
| } else if (halCall instanceof android.hardware.radio.V1_2.Call) { |
| call16 = null; |
| call12 = (android.hardware.radio.V1_2.Call) halCall; |
| call10 = call12.base; |
| } else if (halCall instanceof android.hardware.radio.V1_0.Call) { |
| call16 = null; |
| call12 = null; |
| call10 = (android.hardware.radio.V1_0.Call) halCall; |
| } else { |
| call16 = null; |
| call12 = null; |
| call10 = null; |
| } |
| if (call10 != null) { |
| dc.state = DriverCall.stateFromCLCC((int) (call10.state)); |
| dc.index = call10.index; |
| dc.TOA = call10.toa; |
| dc.isMpty = call10.isMpty; |
| dc.isMT = call10.isMT; |
| dc.als = call10.als; |
| dc.isVoice = call10.isVoice; |
| dc.isVoicePrivacy = call10.isVoicePrivacy; |
| dc.number = call10.number; |
| dc.numberPresentation = DriverCall.presentationFromCLIP( |
| (int) (call10.numberPresentation)); |
| dc.name = call10.name; |
| dc.namePresentation = DriverCall.presentationFromCLIP((int) (call10.namePresentation)); |
| if (call10.uusInfo.size() == 1) { |
| dc.uusInfo = new UUSInfo(); |
| dc.uusInfo.setType(call10.uusInfo.get(0).uusType); |
| dc.uusInfo.setDcs(call10.uusInfo.get(0).uusDcs); |
| if (!TextUtils.isEmpty(call10.uusInfo.get(0).uusData)) { |
| byte[] userData = call10.uusInfo.get(0).uusData.getBytes(); |
| dc.uusInfo.setUserData(userData); |
| } |
| } |
| // Make sure there's a leading + on addresses with a TOA of 145 |
| dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); |
| } |
| if (call12 != null) { |
| dc.audioQuality = (int) (call12.audioQuality); |
| } |
| if (call16 != null) { |
| dc.forwardedNumber = call16.forwardedNumber; |
| } |
| return dc; |
| } |
| |
| /** |
| * Convert Call defined in Call.aidl to DriverCall |
| * @param halCall Call defined in Call.aidl |
| * @return The converted DriverCall |
| */ |
| public static DriverCall convertToDriverCall(android.hardware.radio.voice.Call halCall) { |
| DriverCall dc = new DriverCall(); |
| dc.state = DriverCall.stateFromCLCC((int) halCall.state); |
| dc.index = halCall.index; |
| dc.TOA = halCall.toa; |
| dc.isMpty = halCall.isMpty; |
| dc.isMT = halCall.isMT; |
| dc.als = halCall.als; |
| dc.isVoice = halCall.isVoice; |
| dc.isVoicePrivacy = halCall.isVoicePrivacy; |
| dc.number = halCall.number; |
| dc.numberPresentation = DriverCall.presentationFromCLIP((int) halCall.numberPresentation); |
| dc.name = halCall.name; |
| dc.namePresentation = DriverCall.presentationFromCLIP((int) halCall.namePresentation); |
| if (halCall.uusInfo.length == 1) { |
| dc.uusInfo = new UUSInfo(); |
| dc.uusInfo.setType(halCall.uusInfo[0].uusType); |
| dc.uusInfo.setDcs(halCall.uusInfo[0].uusDcs); |
| if (!TextUtils.isEmpty(halCall.uusInfo[0].uusData)) { |
| dc.uusInfo.setUserData(halCall.uusInfo[0].uusData.getBytes()); |
| } |
| } |
| // Make sure there's a leading + on addresses with a TOA of 145 |
| dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); |
| dc.audioQuality = (int) halCall.audioQuality; |
| dc.forwardedNumber = halCall.forwardedNumber; |
| return dc; |
| } |
| |
| /** |
| * Convert OperatorStatus defined in radio/1.0/types.hal to OperatorInfo.State |
| * @param status Operator status defined in radio/1.0/types.hal |
| * @return The converted OperatorStatus as a String |
| */ |
| public static String convertHalOperatorStatus(int status) { |
| if (status == android.hardware.radio.V1_0.OperatorStatus.UNKNOWN) { |
| return "unknown"; |
| } else if (status == android.hardware.radio.V1_0.OperatorStatus.AVAILABLE) { |
| return "available"; |
| } else if (status == android.hardware.radio.V1_0.OperatorStatus.CURRENT) { |
| return "current"; |
| } else if (status == android.hardware.radio.V1_0.OperatorStatus.FORBIDDEN) { |
| return "forbidden"; |
| } else { |
| return ""; |
| } |
| } |
| |
| /** |
| * Convert a list of Carriers defined in radio/1.0/types.hal to a list of CarrierIdentifiers |
| * @param carrierList List of Carriers defined in radio/1.0/types.hal |
| * @return The converted list of CarrierIdentifiers |
| */ |
| public static List<CarrierIdentifier> convertHalCarrierList( |
| List<android.hardware.radio.V1_0.Carrier> carrierList) { |
| List<CarrierIdentifier> ret = new ArrayList<>(); |
| for (int i = 0; i < carrierList.size(); i++) { |
| String mcc = carrierList.get(i).mcc; |
| String mnc = carrierList.get(i).mnc; |
| String spn = null, imsi = null, gid1 = null, gid2 = null; |
| int matchType = carrierList.get(i).matchType; |
| String matchData = carrierList.get(i).matchData; |
| if (matchType == CarrierIdentifier.MatchType.SPN) { |
| spn = matchData; |
| } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) { |
| imsi = matchData; |
| } else if (matchType == CarrierIdentifier.MatchType.GID1) { |
| gid1 = matchData; |
| } else if (matchType == CarrierIdentifier.MatchType.GID2) { |
| gid2 = matchData; |
| } |
| ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2)); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert a list of Carriers defined in radio/1.0/types.hal to a list of CarrierIdentifiers |
| * @param carrierList List of Carriers defined in radio/1.0/types.hal |
| * @return The converted list of CarrierIdentifiers |
| */ |
| public static List<CarrierIdentifier> convertHalCarrierList( |
| android.hardware.radio.sim.Carrier[] carrierList) { |
| List<CarrierIdentifier> ret = new ArrayList<>(); |
| for (int i = 0; i < carrierList.length; i++) { |
| String mcc = carrierList[i].mcc; |
| String mnc = carrierList[i].mnc; |
| String spn = null, imsi = null, gid1 = null, gid2 = null; |
| int matchType = carrierList[i].matchType; |
| String matchData = carrierList[i].matchData; |
| if (matchType == CarrierIdentifier.MatchType.SPN) { |
| spn = matchData; |
| } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) { |
| imsi = matchData; |
| } else if (matchType == CarrierIdentifier.MatchType.GID1) { |
| gid1 = matchData; |
| } else if (matchType == CarrierIdentifier.MatchType.GID2) { |
| gid2 = matchData; |
| } |
| ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2)); |
| } |
| return ret; |
| } |
| |
| /** |
| * Convert CardStatus defined in radio/1.0, 1.5/types.hal to IccCardStatus |
| * @param cardStatus CardStatus defined in radio/1.0, 1.5/types.hal |
| * @return The converted IccCardStatus |
| */ |
| public static IccCardStatus convertHalCardStatus(Object cardStatus) { |
| final android.hardware.radio.V1_0.CardStatus cardStatus10; |
| final android.hardware.radio.V1_5.CardStatus cardStatus15; |
| if (cardStatus instanceof android.hardware.radio.V1_5.CardStatus) { |
| cardStatus15 = (android.hardware.radio.V1_5.CardStatus) cardStatus; |
| cardStatus10 = cardStatus15.base.base.base; |
| } else if (cardStatus instanceof android.hardware.radio.V1_0.CardStatus) { |
| cardStatus15 = null; |
| cardStatus10 = (android.hardware.radio.V1_0.CardStatus) cardStatus; |
| } else { |
| cardStatus15 = null; |
| cardStatus10 = null; |
| } |
| |
| IccCardStatus iccCardStatus = new IccCardStatus(); |
| if (cardStatus10 != null) { |
| iccCardStatus.setCardState(cardStatus10.cardState); |
| iccCardStatus.setUniversalPinState(cardStatus10.universalPinState); |
| iccCardStatus.mGsmUmtsSubscriptionAppIndex = cardStatus10.gsmUmtsSubscriptionAppIndex; |
| iccCardStatus.mCdmaSubscriptionAppIndex = cardStatus10.cdmaSubscriptionAppIndex; |
| iccCardStatus.mImsSubscriptionAppIndex = cardStatus10.imsSubscriptionAppIndex; |
| int numApplications = cardStatus10.applications.size(); |
| |
| // limit to maximum allowed applications |
| if (numApplications > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) { |
| numApplications = com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS; |
| } |
| iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications]; |
| for (int i = 0; i < numApplications; i++) { |
| android.hardware.radio.V1_0.AppStatus rilAppStatus = |
| cardStatus10.applications.get(i); |
| IccCardApplicationStatus appStatus = new IccCardApplicationStatus(); |
| appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.appType); |
| appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.appState); |
| appStatus.perso_substate = appStatus.PersoSubstateFromRILInt( |
| rilAppStatus.persoSubstate); |
| appStatus.aid = rilAppStatus.aidPtr; |
| appStatus.app_label = rilAppStatus.appLabelPtr; |
| appStatus.pin1_replaced = rilAppStatus.pin1Replaced != 0; |
| appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.pin1); |
| appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.pin2); |
| iccCardStatus.mApplications[i] = appStatus; |
| } |
| } |
| if (cardStatus15 != null) { |
| IccSlotPortMapping slotPortMapping = new IccSlotPortMapping(); |
| slotPortMapping.mPhysicalSlotIndex = cardStatus15.base.base.physicalSlotId; |
| iccCardStatus.mSlotPortMapping = slotPortMapping; |
| iccCardStatus.atr = cardStatus15.base.base.atr; |
| iccCardStatus.iccid = cardStatus15.base.base.iccid; |
| iccCardStatus.eid = cardStatus15.base.eid; |
| int numApplications = cardStatus15.applications.size(); |
| |
| // limit to maximum allowed applications |
| if (numApplications > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) { |
| numApplications = com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS; |
| } |
| iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications]; |
| for (int i = 0; i < numApplications; i++) { |
| android.hardware.radio.V1_5.AppStatus rilAppStatus = |
| cardStatus15.applications.get(i); |
| IccCardApplicationStatus appStatus = new IccCardApplicationStatus(); |
| appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.base.appType); |
| appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.base.appState); |
| appStatus.perso_substate = appStatus.PersoSubstateFromRILInt( |
| rilAppStatus.persoSubstate); |
| appStatus.aid = rilAppStatus.base.aidPtr; |
| appStatus.app_label = rilAppStatus.base.appLabelPtr; |
| appStatus.pin1_replaced = rilAppStatus.base.pin1Replaced != 0; |
| appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.base.pin1); |
| appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.base.pin2); |
| iccCardStatus.mApplications[i] = appStatus; |
| } |
| } |
| return iccCardStatus; |
| } |
| |
| /** |
| * Convert CardStatus defined in CardStatus.aidl to IccCardStatus |
| * @param cardStatus CardStatus defined in CardStatus.aidl |
| * @return The converted IccCardStatus |
| */ |
| public static IccCardStatus convertHalCardStatus( |
| android.hardware.radio.sim.CardStatus cardStatus) { |
| IccCardStatus iccCardStatus = new IccCardStatus(); |
| iccCardStatus.setCardState(cardStatus.cardState); |
| iccCardStatus.setUniversalPinState(cardStatus.universalPinState); |
| iccCardStatus.mGsmUmtsSubscriptionAppIndex = cardStatus.gsmUmtsSubscriptionAppIndex; |
| iccCardStatus.mCdmaSubscriptionAppIndex = cardStatus.cdmaSubscriptionAppIndex; |
| iccCardStatus.mImsSubscriptionAppIndex = cardStatus.imsSubscriptionAppIndex; |
| iccCardStatus.atr = cardStatus.atr; |
| iccCardStatus.iccid = cardStatus.iccid; |
| iccCardStatus.eid = cardStatus.eid; |
| |
| int numApplications = Math.min(cardStatus.applications.length, |
| com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS); |
| iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications]; |
| for (int i = 0; i < numApplications; i++) { |
| android.hardware.radio.sim.AppStatus rilAppStatus = cardStatus.applications[i]; |
| IccCardApplicationStatus appStatus = new IccCardApplicationStatus(); |
| appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.appType); |
| appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.appState); |
| appStatus.perso_substate = appStatus.PersoSubstateFromRILInt( |
| rilAppStatus.persoSubstate); |
| appStatus.aid = rilAppStatus.aidPtr; |
| appStatus.app_label = rilAppStatus.appLabelPtr; |
| appStatus.pin1_replaced = rilAppStatus.pin1Replaced; |
| appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.pin1); |
| appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.pin2); |
| iccCardStatus.mApplications[i] = appStatus; |
| } |
| IccSlotPortMapping slotPortMapping = new IccSlotPortMapping(); |
| slotPortMapping.mPhysicalSlotIndex = cardStatus.slotMap.physicalSlotId; |
| slotPortMapping.mPortIndex = cardStatus.slotMap.portId; |
| iccCardStatus.mSlotPortMapping = slotPortMapping; |
| return iccCardStatus; |
| } |
| |
| /** |
| * Convert PhonebookCapacity defined in radio/1.6/types.hal to AdnCapacity |
| * @param pbCap PhonebookCapacity defined in radio/1.6/types.hal |
| * @return The converted AdnCapacity |
| */ |
| public static AdnCapacity convertHalPhonebookCapacity( |
| android.hardware.radio.V1_6.PhonebookCapacity pbCap) { |
| if (pbCap != null) { |
| return new AdnCapacity(pbCap.maxAdnRecords, pbCap.usedAdnRecords, pbCap.maxEmailRecords, |
| pbCap.usedEmailRecords, pbCap.maxAdditionalNumberRecords, |
| pbCap.usedAdditionalNumberRecords, pbCap.maxNameLen, pbCap.maxNumberLen, |
| pbCap.maxEmailLen, pbCap.maxAdditionalNumberLen); |
| } |
| return null; |
| } |
| |
| /** |
| * Convert PhonebookCapacity defined in PhonebookCapacity.aidl to AdnCapacity |
| * @param pbCap PhonebookCapacity defined in PhonebookCapacity.aidl |
| * @return The converted AdnCapacity |
| */ |
| public static AdnCapacity convertHalPhonebookCapacity( |
| android.hardware.radio.sim.PhonebookCapacity pbCap) { |
| if (pbCap != null) { |
| return new AdnCapacity(pbCap.maxAdnRecords, pbCap.usedAdnRecords, pbCap.maxEmailRecords, |
| pbCap.usedEmailRecords, pbCap.maxAdditionalNumberRecords, |
| pbCap.usedAdditionalNumberRecords, pbCap.maxNameLen, pbCap.maxNumberLen, |
| pbCap.maxEmailLen, pbCap.maxAdditionalNumberLen); |
| } |
| return null; |
| } |
| |
| /** |
| * Convert PhonebookRecordInfo defined in radio/1.6/types.hal to SimPhonebookRecord |
| * @param recInfo PhonebookRecordInfo defined in radio/1.6/types.hal |
| * @return The converted SimPhonebookRecord |
| */ |
| public static SimPhonebookRecord convertHalPhonebookRecordInfo( |
| android.hardware.radio.V1_6.PhonebookRecordInfo recInfo) { |
| String[] emails = recInfo.emails == null ? null |
| : recInfo.emails.toArray(new String[recInfo.emails.size()]); |
| String[] numbers = recInfo.additionalNumbers == null ? null |
| : recInfo.additionalNumbers.toArray(new String[recInfo.additionalNumbers.size()]); |
| return new SimPhonebookRecord(recInfo.recordId, recInfo.name, recInfo.number, emails, |
| numbers); |
| } |
| |
| /** |
| * Convert PhonebookRecordInfo defined in PhonebookRecordInfo.aidl to SimPhonebookRecord |
| * @param recInfo PhonebookRecordInfo defined in PhonebookRecordInfo.aidl |
| * @return The converted SimPhonebookRecord |
| */ |
| public static SimPhonebookRecord convertHalPhonebookRecordInfo( |
| android.hardware.radio.sim.PhonebookRecordInfo recInfo) { |
| return new SimPhonebookRecord(recInfo.recordId, recInfo.name, recInfo.number, |
| recInfo.emails, recInfo.additionalNumbers); |
| } |
| |
| /** |
| * Convert to PhonebookRecordInfo defined in radio/1.6/types.hal |
| * @param record SimPhonebookRecord to convert |
| * @return The converted PhonebookRecordInfo defined in radio/1.6/types.hal |
| */ |
| public static android.hardware.radio.V1_6.PhonebookRecordInfo convertToHalPhonebookRecordInfo( |
| SimPhonebookRecord record) { |
| if(record != null) { |
| return record.toPhonebookRecordInfo(); |
| } |
| return null; |
| } |
| |
| /** |
| * Convert to PhonebookRecordInfo.aidl |
| * @param record SimPhonebookRecord to convert |
| * @return The converted PhonebookRecordInfo |
| */ |
| public static android.hardware.radio.sim.PhonebookRecordInfo |
| convertToHalPhonebookRecordInfoAidl(SimPhonebookRecord record) { |
| if(record != null) { |
| return record.toPhonebookRecordInfoAidl(); |
| } |
| return null; |
| } |
| |
| /** |
| * Convert array of SimSlotStatus to IccSlotStatus |
| * @param o object that represents array/list of SimSlotStatus |
| * @return ArrayList of IccSlotStatus |
| */ |
| public static ArrayList<IccSlotStatus> convertHalSlotStatus(Object o) { |
| ArrayList<IccSlotStatus> response = new ArrayList<>(); |
| try { |
| final android.hardware.radio.config.SimSlotStatus[] halSlotStatusArray = |
| (android.hardware.radio.config.SimSlotStatus[]) o; |
| for (android.hardware.radio.config.SimSlotStatus slotStatus : halSlotStatusArray) { |
| IccSlotStatus iccSlotStatus = new IccSlotStatus(); |
| iccSlotStatus.setCardState(slotStatus.cardState); |
| int portCount = slotStatus.portInfo.length; |
| iccSlotStatus.mSimPortInfos = new IccSimPortInfo[portCount]; |
| for (int i = 0; i < portCount; i++) { |
| IccSimPortInfo simPortInfo = new IccSimPortInfo(); |
| simPortInfo.mIccId = slotStatus.portInfo[i].iccId; |
| // If port is not active, set invalid logical slot index(-1) irrespective of |
| // the modem response. For more info, check http://b/209035150 |
| simPortInfo.mLogicalSlotIndex = slotStatus.portInfo[i].portActive |
| ? slotStatus.portInfo[i].logicalSlotId : -1; |
| simPortInfo.mPortActive = slotStatus.portInfo[i].portActive; |
| iccSlotStatus.mSimPortInfos[i] = simPortInfo; |
| } |
| iccSlotStatus.atr = slotStatus.atr; |
| iccSlotStatus.eid = slotStatus.eid; |
| response.add(iccSlotStatus); |
| } |
| return response; |
| } catch (ClassCastException ignore) { } |
| try { |
| final ArrayList<android.hardware.radio.config.V1_2.SimSlotStatus> |
| halSlotStatusArray = |
| (ArrayList<android.hardware.radio.config.V1_2.SimSlotStatus>) o; |
| for (android.hardware.radio.config.V1_2.SimSlotStatus slotStatus : |
| halSlotStatusArray) { |
| IccSlotStatus iccSlotStatus = new IccSlotStatus(); |
| iccSlotStatus.setCardState(slotStatus.base.cardState); |
| // Old HAL versions does not support MEP, so only one port is available. |
| iccSlotStatus.mSimPortInfos = new IccSimPortInfo[1]; |
| IccSimPortInfo simPortInfo = new IccSimPortInfo(); |
| simPortInfo.mIccId = slotStatus.base.iccid; |
| simPortInfo.mPortActive = (slotStatus.base.slotState == IccSlotStatus.STATE_ACTIVE); |
| // If port/slot is not active, set invalid logical slot index(-1) irrespective of |
| // the modem response. For more info, check http://b/209035150 |
| simPortInfo.mLogicalSlotIndex = simPortInfo.mPortActive |
| ? slotStatus.base.logicalSlotId : -1; |
| iccSlotStatus.mSimPortInfos[TelephonyManager.DEFAULT_PORT_INDEX] = simPortInfo; |
| iccSlotStatus.atr = slotStatus.base.atr; |
| iccSlotStatus.eid = slotStatus.eid; |
| response.add(iccSlotStatus); |
| } |
| return response; |
| } catch (ClassCastException ignore) { } |
| try { |
| final ArrayList<android.hardware.radio.config.V1_0.SimSlotStatus> |
| halSlotStatusArray = |
| (ArrayList<android.hardware.radio.config.V1_0.SimSlotStatus>) o; |
| for (android.hardware.radio.config.V1_0.SimSlotStatus slotStatus : |
| halSlotStatusArray) { |
| IccSlotStatus iccSlotStatus = new IccSlotStatus(); |
| iccSlotStatus.setCardState(slotStatus.cardState); |
| // Old HAL versions does not support MEP, so only one port is available. |
| iccSlotStatus.mSimPortInfos = new IccSimPortInfo[1]; |
| IccSimPortInfo simPortInfo = new IccSimPortInfo(); |
| simPortInfo.mIccId = slotStatus.iccid; |
| simPortInfo.mPortActive = (slotStatus.slotState == IccSlotStatus.STATE_ACTIVE); |
| // If port/slot is not active, set invalid logical slot index(-1) irrespective of |
| // the modem response. For more info, check http://b/209035150 |
| simPortInfo.mLogicalSlotIndex = simPortInfo.mPortActive |
| ? slotStatus.logicalSlotId : -1; |
| iccSlotStatus.mSimPortInfos[TelephonyManager.DEFAULT_PORT_INDEX] = simPortInfo; |
| iccSlotStatus.atr = slotStatus.atr; |
| response.add(iccSlotStatus); |
| } |
| return response; |
| } catch (ClassCastException ignore) { } |
| return response; |
| } |
| |
| /** |
| * Convert List<UiccSlotMapping> list to SlotPortMapping[] |
| * @param slotMapping List<UiccSlotMapping> of slots mapping |
| * @return SlotPortMapping[] of slots mapping |
| */ |
| public static android.hardware.radio.config.SlotPortMapping[] convertSimSlotsMapping( |
| List<UiccSlotMapping> slotMapping) { |
| android.hardware.radio.config.SlotPortMapping[] res = |
| new android.hardware.radio.config.SlotPortMapping[slotMapping.size()]; |
| for (UiccSlotMapping mapping : slotMapping) { |
| int logicalSlotIdx = mapping.getLogicalSlotIndex(); |
| res[logicalSlotIdx] = new android.hardware.radio.config.SlotPortMapping(); |
| res[logicalSlotIdx].physicalSlotId = mapping.getPhysicalSlotIndex(); |
| res[logicalSlotIdx].portId = mapping.getPortIndex(); |
| } |
| return res; |
| } |
| |
| /** Convert a list of UiccSlotMapping to an ArrayList<Integer>.*/ |
| public static ArrayList<Integer> convertSlotMappingToList( |
| List<UiccSlotMapping> slotMapping) { |
| int[] physicalSlots = new int[slotMapping.size()]; |
| for (UiccSlotMapping mapping : slotMapping) { |
| physicalSlots[mapping.getLogicalSlotIndex()] = mapping.getPhysicalSlotIndex(); |
| } |
| return primitiveArrayToArrayList(physicalSlots); |
| } |
| |
| |
| /** |
| * Convert PhoneCapability to telephony PhoneCapability. |
| * @param deviceNrCapabilities device's nr capability array |
| * @param o PhoneCapability to convert |
| * @return converted PhoneCapability |
| */ |
| public static PhoneCapability convertHalPhoneCapability(int[] deviceNrCapabilities, Object o) { |
| int maxActiveVoiceCalls = 0; |
| int maxActiveData = 0; |
| boolean validationBeforeSwitchSupported = false; |
| List<ModemInfo> logicalModemList = new ArrayList<>(); |
| if (o instanceof android.hardware.radio.config.PhoneCapability) { |
| final android.hardware.radio.config.PhoneCapability phoneCapability = |
| (android.hardware.radio.config.PhoneCapability) o; |
| maxActiveData = phoneCapability.maxActiveData; |
| validationBeforeSwitchSupported = phoneCapability.isInternetLingeringSupported; |
| for (int modemId : phoneCapability.logicalModemIds) { |
| logicalModemList.add(new ModemInfo(modemId)); |
| } |
| } else if (o instanceof android.hardware.radio.config.V1_1.PhoneCapability) { |
| final android.hardware.radio.config.V1_1.PhoneCapability phoneCapability = |
| (android.hardware.radio.config.V1_1.PhoneCapability) o; |
| maxActiveData = phoneCapability.maxActiveData; |
| validationBeforeSwitchSupported = phoneCapability.isInternetLingeringSupported; |
| for (android.hardware.radio.config.V1_1.ModemInfo modemInfo : |
| phoneCapability.logicalModemList) { |
| logicalModemList.add(new ModemInfo(modemInfo.modemId)); |
| } |
| } |
| return new PhoneCapability(maxActiveVoiceCalls, maxActiveData, logicalModemList, |
| validationBeforeSwitchSupported, deviceNrCapabilities); |
| } |
| |
| /** Append the data to the end of an ArrayList */ |
| public static void appendPrimitiveArrayToArrayList(byte[] src, ArrayList<Byte> dst) { |
| for (byte b : src) { |
| dst.add(b); |
| } |
| } |
| |
| /** Convert a primitive byte array to an ArrayList<Integer>. */ |
| public static ArrayList<Byte> primitiveArrayToArrayList(byte[] arr) { |
| ArrayList<Byte> arrayList = new ArrayList<>(arr.length); |
| for (byte b : arr) { |
| arrayList.add(b); |
| } |
| return arrayList; |
| } |
| |
| /** Convert a primitive int array to an ArrayList<Integer>. */ |
| public static ArrayList<Integer> primitiveArrayToArrayList(int[] arr) { |
| ArrayList<Integer> arrayList = new ArrayList<>(arr.length); |
| for (int i : arr) { |
| arrayList.add(i); |
| } |
| return arrayList; |
| } |
| |
| /** Convert a primitive String array to an ArrayList<String>. */ |
| public static ArrayList<String> primitiveArrayToArrayList(String[] arr) { |
| return new ArrayList<>(Arrays.asList(arr)); |
| } |
| |
| /** Convert an ArrayList of Bytes to an exactly-sized primitive array */ |
| public static byte[] arrayListToPrimitiveArray(ArrayList<Byte> bytes) { |
| byte[] ret = new byte[bytes.size()]; |
| for (int i = 0; i < ret.length; i++) { |
| ret[i] = bytes.get(i); |
| } |
| return ret; |
| } |
| |
| /** Convert null to an empty String */ |
| public static String convertNullToEmptyString(String string) { |
| return string != null ? string : ""; |
| } |
| |
| /** |
| * RIL request to String |
| * @param request request |
| * @return The converted String request |
| */ |
| public static String requestToString(int request) { |
| switch(request) { |
| case RIL_REQUEST_GET_SIM_STATUS: |
| return "GET_SIM_STATUS"; |
| case RIL_REQUEST_ENTER_SIM_PIN: |
| return "ENTER_SIM_PIN"; |
| case RIL_REQUEST_ENTER_SIM_PUK: |
| return "ENTER_SIM_PUK"; |
| case RIL_REQUEST_ENTER_SIM_PIN2: |
| return "ENTER_SIM_PIN2"; |
| case RIL_REQUEST_ENTER_SIM_PUK2: |
| return "ENTER_SIM_PUK2"; |
| case RIL_REQUEST_CHANGE_SIM_PIN: |
| return "CHANGE_SIM_PIN"; |
| case RIL_REQUEST_CHANGE_SIM_PIN2: |
| return "CHANGE_SIM_PIN2"; |
| case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: |
| return "ENTER_NETWORK_DEPERSONALIZATION"; |
| case RIL_REQUEST_GET_CURRENT_CALLS: |
| return "GET_CURRENT_CALLS"; |
| case RIL_REQUEST_DIAL: |
| return "DIAL"; |
| case RIL_REQUEST_GET_IMSI: |
| return "GET_IMSI"; |
| case RIL_REQUEST_HANGUP: |
| return "HANGUP"; |
| case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: |
| return "HANGUP_WAITING_OR_BACKGROUND"; |
| case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: |
| return "HANGUP_FOREGROUND_RESUME_BACKGROUND"; |
| case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: |
| return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE"; |
| case RIL_REQUEST_CONFERENCE: |
| return "CONFERENCE"; |
| case RIL_REQUEST_UDUB: |
| return "UDUB"; |
| case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: |
| return "LAST_CALL_FAIL_CAUSE"; |
| case RIL_REQUEST_SIGNAL_STRENGTH: |
| return "SIGNAL_STRENGTH"; |
| case RIL_REQUEST_VOICE_REGISTRATION_STATE: |
| return "VOICE_REGISTRATION_STATE"; |
| case RIL_REQUEST_DATA_REGISTRATION_STATE: |
| return "DATA_REGISTRATION_STATE"; |
| case RIL_REQUEST_OPERATOR: |
| return "OPERATOR"; |
| case RIL_REQUEST_RADIO_POWER: |
| return "RADIO_POWER"; |
| case RIL_REQUEST_DTMF: |
| return "DTMF"; |
| case RIL_REQUEST_SEND_SMS: |
| return "SEND_SMS"; |
| case RIL_REQUEST_SEND_SMS_EXPECT_MORE: |
| return "SEND_SMS_EXPECT_MORE"; |
| case RIL_REQUEST_SETUP_DATA_CALL: |
| return "SETUP_DATA_CALL"; |
| case RIL_REQUEST_SIM_IO: |
| return "SIM_IO"; |
| case RIL_REQUEST_SEND_USSD: |
| return "SEND_USSD"; |
| case RIL_REQUEST_CANCEL_USSD: |
| return "CANCEL_USSD"; |
| case RIL_REQUEST_GET_CLIR: |
| return "GET_CLIR"; |
| case RIL_REQUEST_SET_CLIR: |
| return "SET_CLIR"; |
| case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: |
| return "QUERY_CALL_FORWARD_STATUS"; |
| case RIL_REQUEST_SET_CALL_FORWARD: |
| return "SET_CALL_FORWARD"; |
| case RIL_REQUEST_QUERY_CALL_WAITING: |
| return "QUERY_CALL_WAITING"; |
| case RIL_REQUEST_SET_CALL_WAITING: |
| return "SET_CALL_WAITING"; |
| case RIL_REQUEST_SMS_ACKNOWLEDGE: |
| return "SMS_ACKNOWLEDGE"; |
| case RIL_REQUEST_GET_IMEI: |
| return "GET_IMEI"; |
| case RIL_REQUEST_GET_IMEISV: |
| return "GET_IMEISV"; |
| case RIL_REQUEST_ANSWER: |
| return "ANSWER"; |
| case RIL_REQUEST_DEACTIVATE_DATA_CALL: |
| return "DEACTIVATE_DATA_CALL"; |
| case RIL_REQUEST_QUERY_FACILITY_LOCK: |
| return "QUERY_FACILITY_LOCK"; |
| case RIL_REQUEST_SET_FACILITY_LOCK: |
| return "SET_FACILITY_LOCK"; |
| case RIL_REQUEST_CHANGE_BARRING_PASSWORD: |
| return "CHANGE_BARRING_PASSWORD"; |
| case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: |
| return "QUERY_NETWORK_SELECTION_MODE"; |
| case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: |
| return "SET_NETWORK_SELECTION_AUTOMATIC"; |
| case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: |
| return "SET_NETWORK_SELECTION_MANUAL"; |
| case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : |
| return "QUERY_AVAILABLE_NETWORKS "; |
| case RIL_REQUEST_DTMF_START: |
| return "DTMF_START"; |
| case RIL_REQUEST_DTMF_STOP: |
| return "DTMF_STOP"; |
| case RIL_REQUEST_BASEBAND_VERSION: |
| return "BASEBAND_VERSION"; |
| case RIL_REQUEST_SEPARATE_CONNECTION: |
| return "SEPARATE_CONNECTION"; |
| case RIL_REQUEST_SET_MUTE: |
| return "SET_MUTE"; |
| case RIL_REQUEST_GET_MUTE: |
| return "GET_MUTE"; |
| case RIL_REQUEST_QUERY_CLIP: |
| return "QUERY_CLIP"; |
| case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: |
| return "LAST_DATA_CALL_FAIL_CAUSE"; |
| case RIL_REQUEST_DATA_CALL_LIST: |
| return "DATA_CALL_LIST"; |
| case RIL_REQUEST_RESET_RADIO: |
| return "RESET_RADIO"; |
| case RIL_REQUEST_OEM_HOOK_RAW: |
| return "OEM_HOOK_RAW"; |
| case RIL_REQUEST_OEM_HOOK_STRINGS: |
| return "OEM_HOOK_STRINGS"; |
| case RIL_REQUEST_SCREEN_STATE: |
| return "SCREEN_STATE"; |
| case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: |
| return "SET_SUPP_SVC_NOTIFICATION"; |
| case RIL_REQUEST_WRITE_SMS_TO_SIM: |
| return "WRITE_SMS_TO_SIM"; |
| case RIL_REQUEST_DELETE_SMS_ON_SIM: |
| return "DELETE_SMS_ON_SIM"; |
| case RIL_REQUEST_SET_BAND_MODE: |
| return "SET_BAND_MODE"; |
| case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: |
| return "QUERY_AVAILABLE_BAND_MODE"; |
| case RIL_REQUEST_STK_GET_PROFILE: |
| return "STK_GET_PROFILE"; |
| case RIL_REQUEST_STK_SET_PROFILE: |
| return "STK_SET_PROFILE"; |
| case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: |
| return "STK_SEND_ENVELOPE_COMMAND"; |
| case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: |
| return "STK_SEND_TERMINAL_RESPONSE"; |
| case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: |
| return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM"; |
| case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: |
| return "EXPLICIT_CALL_TRANSFER"; |
| case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: |
| return "SET_PREFERRED_NETWORK_TYPE"; |
| case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: |
| return "GET_PREFERRED_NETWORK_TYPE"; |
| case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: |
| return "GET_NEIGHBORING_CELL_IDS"; |
| case RIL_REQUEST_SET_LOCATION_UPDATES: |
| return "SET_LOCATION_UPDATES"; |
| case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: |
| return "CDMA_SET_SUBSCRIPTION_SOURCE"; |
| case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: |
| return "CDMA_SET_ROAMING_PREFERENCE"; |
| case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: |
| return "CDMA_QUERY_ROAMING_PREFERENCE"; |
| case RIL_REQUEST_SET_TTY_MODE: |
| return "SET_TTY_MODE"; |
| case RIL_REQUEST_QUERY_TTY_MODE: |
| return "QUERY_TTY_MODE"; |
| case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: |
| return "CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE"; |
| case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: |
| return "CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE"; |
| case RIL_REQUEST_CDMA_FLASH: |
| return "CDMA_FLASH"; |
| case RIL_REQUEST_CDMA_BURST_DTMF: |
| return "CDMA_BURST_DTMF"; |
| case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: |
| return "CDMA_VALIDATE_AND_WRITE_AKEY"; |
| case RIL_REQUEST_CDMA_SEND_SMS: |
| return "CDMA_SEND_SMS"; |
| case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: |
| return "CDMA_SMS_ACKNOWLEDGE"; |
| case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: |
| return "GSM_GET_BROADCAST_CONFIG"; |
| case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: |
| return "GSM_SET_BROADCAST_CONFIG"; |
| case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: |
| return "GSM_BROADCAST_ACTIVATION"; |
| case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: |
| return "CDMA_GET_BROADCAST_CONFIG"; |
| case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: |
| return "CDMA_SET_BROADCAST_CONFIG"; |
| case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: |
| return "CDMA_BROADCAST_ACTIVATION"; |
| case RIL_REQUEST_CDMA_SUBSCRIPTION: |
| return "CDMA_SUBSCRIPTION"; |
| case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: |
| return "CDMA_WRITE_SMS_TO_RUIM"; |
| case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: |
| return "CDMA_DELETE_SMS_ON_RUIM"; |
| case RIL_REQUEST_DEVICE_IDENTITY: |
| return "DEVICE_IDENTITY"; |
| case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: |
| return "EXIT_EMERGENCY_CALLBACK_MODE"; |
| case RIL_REQUEST_GET_SMSC_ADDRESS: |
| return "GET_SMSC_ADDRESS"; |
| case RIL_REQUEST_SET_SMSC_ADDRESS: |
| return "SET_SMSC_ADDRESS"; |
| case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: |
| return "REPORT_SMS_MEMORY_STATUS"; |
| case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: |
| return "REPORT_STK_SERVICE_IS_RUNNING"; |
| case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: |
| return "CDMA_GET_SUBSCRIPTION_SOURCE"; |
| case RIL_REQUEST_ISIM_AUTHENTICATION: |
| return "ISIM_AUTHENTICATION"; |
| case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: |
| return "ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU"; |
| case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: |
| return "STK_SEND_ENVELOPE_WITH_STATUS"; |
| case RIL_REQUEST_VOICE_RADIO_TECH: |
| return "VOICE_RADIO_TECH"; |
| case RIL_REQUEST_GET_CELL_INFO_LIST: |
| return "GET_CELL_INFO_LIST"; |
| case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: |
| return "SET_CELL_INFO_LIST_RATE"; |
| case RIL_REQUEST_SET_INITIAL_ATTACH_APN: |
| return "SET_INITIAL_ATTACH_APN"; |
| case RIL_REQUEST_IMS_REGISTRATION_STATE: |
| return "IMS_REGISTRATION_STATE"; |
| case RIL_REQUEST_IMS_SEND_SMS: |
| return "IMS_SEND_SMS"; |
| case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: |
| return "SIM_TRANSMIT_APDU_BASIC"; |
| case RIL_REQUEST_SIM_OPEN_CHANNEL: |
| return "SIM_OPEN_CHANNEL"; |
| case RIL_REQUEST_SIM_CLOSE_CHANNEL: |
| return "SIM_CLOSE_CHANNEL"; |
| case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: |
| return "SIM_TRANSMIT_APDU_CHANNEL"; |
| case RIL_REQUEST_NV_READ_ITEM: |
| return "NV_READ_ITEM"; |
| case RIL_REQUEST_NV_WRITE_ITEM: |
| return "NV_WRITE_ITEM"; |
| case RIL_REQUEST_NV_WRITE_CDMA_PRL: |
| return "NV_WRITE_CDMA_PRL"; |
| case RIL_REQUEST_NV_RESET_CONFIG: |
| return "NV_RESET_CONFIG"; |
| case RIL_REQUEST_SET_UICC_SUBSCRIPTION: |
| return "SET_UICC_SUBSCRIPTION"; |
| case RIL_REQUEST_ALLOW_DATA: |
| return "ALLOW_DATA"; |
| case RIL_REQUEST_GET_HARDWARE_CONFIG: |
| return "GET_HARDWARE_CONFIG"; |
| case RIL_REQUEST_SIM_AUTHENTICATION: |
| return "SIM_AUTHENTICATION"; |
| case RIL_REQUEST_GET_DC_RT_INFO: |
| return "GET_DC_RT_INFO"; |
| case RIL_REQUEST_SET_DC_RT_INFO_RATE: |
| return "SET_DC_RT_INFO_RATE"; |
| case RIL_REQUEST_SET_DATA_PROFILE: |
| return "SET_DATA_PROFILE"; |
| case RIL_REQUEST_SHUTDOWN: |
| return "SHUTDOWN"; |
| case RIL_REQUEST_GET_RADIO_CAPABILITY: |
| return "GET_RADIO_CAPABILITY"; |
| case RIL_REQUEST_SET_RADIO_CAPABILITY: |
| return "SET_RADIO_CAPABILITY"; |
| case RIL_REQUEST_START_LCE: |
| return "START_LCE"; |
| case RIL_REQUEST_STOP_LCE: |
| return "STOP_LCE"; |
| case RIL_REQUEST_PULL_LCEDATA: |
| return "PULL_LCEDATA"; |
| case RIL_REQUEST_GET_ACTIVITY_INFO: |
| return "GET_ACTIVITY_INFO"; |
| case RIL_REQUEST_SET_ALLOWED_CARRIERS: |
| return "SET_ALLOWED_CARRIERS"; |
| case RIL_REQUEST_GET_ALLOWED_CARRIERS: |
| return "GET_ALLOWED_CARRIERS"; |
| case RIL_REQUEST_SEND_DEVICE_STATE: |
| return "SEND_DEVICE_STATE"; |
| case RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER: |
| return "SET_UNSOLICITED_RESPONSE_FILTER"; |
| case RIL_REQUEST_SET_SIM_CARD_POWER: |
| return "SET_SIM_CARD_POWER"; |
| case RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION: |
| return "SET_CARRIER_INFO_IMSI_ENCRYPTION"; |
| case RIL_REQUEST_START_NETWORK_SCAN: |
| return "START_NETWORK_SCAN"; |
| case RIL_REQUEST_STOP_NETWORK_SCAN: |
| return "STOP_NETWORK_SCAN"; |
| case RIL_REQUEST_START_KEEPALIVE: |
| return "START_KEEPALIVE"; |
| case RIL_REQUEST_STOP_KEEPALIVE: |
| return "STOP_KEEPALIVE"; |
| case RIL_REQUEST_ENABLE_MODEM: |
| return "ENABLE_MODEM"; |
| case RIL_REQUEST_GET_MODEM_STATUS: |
| return "GET_MODEM_STATUS"; |
| case RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE: |
| return "CDMA_SEND_SMS_EXPECT_MORE"; |
| case RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY: |
| return "GET_SIM_PHONEBOOK_CAPACITY"; |
| case RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS: |
| return "GET_SIM_PHONEBOOK_RECORDS"; |
| case RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORD: |
| return "UPDATE_SIM_PHONEBOOK_RECORD"; |
| case RIL_REQUEST_GET_SLOT_STATUS: |
| return "GET_SLOT_STATUS"; |
| case RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING: |
| return "SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING"; |
| case RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA: |
| return "SET_SIGNAL_STRENGTH_REPORTING_CRITERIA"; |
| case RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA: |
| return "SET_LINK_CAPACITY_REPORTING_CRITERIA"; |
| case RIL_REQUEST_SET_PREFERRED_DATA_MODEM: |
| return "SET_PREFERRED_DATA_MODEM"; |
| case RIL_REQUEST_EMERGENCY_DIAL: |
| return "EMERGENCY_DIAL"; |
| case RIL_REQUEST_GET_PHONE_CAPABILITY: |
| return "GET_PHONE_CAPABILITY"; |
| case RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG: |
| return "SWITCH_DUAL_SIM_CONFIG"; |
| case RIL_REQUEST_ENABLE_UICC_APPLICATIONS: |
| return "ENABLE_UICC_APPLICATIONS"; |
| case RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT: |
| return "GET_UICC_APPLICATIONS_ENABLEMENT"; |
| case RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS: |
| return "SET_SYSTEM_SELECTION_CHANNELS"; |
| case RIL_REQUEST_GET_BARRING_INFO: |
| return "GET_BARRING_INFO"; |
| case RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION: |
| return "ENTER_SIM_DEPERSONALIZATION"; |
| case RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY: |
| return "ENABLE_NR_DUAL_CONNECTIVITY"; |
| case RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED: |
| return "IS_NR_DUAL_CONNECTIVITY_ENABLED"; |
| case RIL_REQUEST_ALLOCATE_PDU_SESSION_ID: |
| return "ALLOCATE_PDU_SESSION_ID"; |
| case RIL_REQUEST_RELEASE_PDU_SESSION_ID: |
| return "RELEASE_PDU_SESSION_ID"; |
| case RIL_REQUEST_START_HANDOVER: |
| return "START_HANDOVER"; |
| case RIL_REQUEST_CANCEL_HANDOVER: |
| return "CANCEL_HANDOVER"; |
| case RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS: |
| return "GET_SYSTEM_SELECTION_CHANNELS"; |
| case RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES: |
| return "GET_HAL_DEVICE_CAPABILITIES"; |
| case RIL_REQUEST_SET_DATA_THROTTLING: |
| return "SET_DATA_THROTTLING"; |
| case RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP: |
| return "SET_ALLOWED_NETWORK_TYPES_BITMAP"; |
| case RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP: |
| return "GET_ALLOWED_NETWORK_TYPES_BITMAP"; |
| case RIL_REQUEST_GET_SLICING_CONFIG: |
| return "GET_SLICING_CONFIG"; |
| case RIL_REQUEST_ENABLE_VONR: |
| return "ENABLE_VONR"; |
| case RIL_REQUEST_IS_VONR_ENABLED: |
| return "IS_VONR_ENABLED"; |
| case RIL_REQUEST_SET_USAGE_SETTING: |
| return "SET_USAGE_SETTING"; |
| case RIL_REQUEST_GET_USAGE_SETTING: |
| return "GET_USAGE_SETTING"; |
| default: |
| return "<unknown request " + request + ">"; |
| } |
| } |
| |
| /** |
| * RIL response to String |
| * @param response response |
| * @return The converted String response |
| */ |
| public static String responseToString(int response) { |
| switch (response) { |
| case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: |
| return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; |
| case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: |
| return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; |
| case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED: |
| return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED"; |
| case RIL_UNSOL_RESPONSE_NEW_SMS: |
| return "UNSOL_RESPONSE_NEW_SMS"; |
| case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: |
| return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT"; |
| case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: |
| return "UNSOL_RESPONSE_NEW_SMS_ON_SIM"; |
| case RIL_UNSOL_ON_USSD: |
| return "UNSOL_ON_USSD"; |
| case RIL_UNSOL_ON_USSD_REQUEST: |
| return "UNSOL_ON_USSD_REQUEST"; |
| case RIL_UNSOL_NITZ_TIME_RECEIVED: |
| return "UNSOL_NITZ_TIME_RECEIVED"; |
| case RIL_UNSOL_SIGNAL_STRENGTH: |
| return "UNSOL_SIGNAL_STRENGTH"; |
| case RIL_UNSOL_DATA_CALL_LIST_CHANGED: |
| return "UNSOL_DATA_CALL_LIST_CHANGED"; |
| case RIL_UNSOL_SUPP_SVC_NOTIFICATION: |
| return "UNSOL_SUPP_SVC_NOTIFICATION"; |
| case RIL_UNSOL_STK_SESSION_END: |
| return "UNSOL_STK_SESSION_END"; |
| case RIL_UNSOL_STK_PROACTIVE_COMMAND: |
| return "UNSOL_STK_PROACTIVE_COMMAND"; |
| case RIL_UNSOL_STK_EVENT_NOTIFY: |
| return "UNSOL_STK_EVENT_NOTIFY"; |
| case RIL_UNSOL_STK_CALL_SETUP: |
| return "UNSOL_STK_CALL_SETUP"; |
| case RIL_UNSOL_SIM_SMS_STORAGE_FULL: |
| return "UNSOL_SIM_SMS_STORAGE_FULL"; |
| case RIL_UNSOL_SIM_REFRESH: |
| return "UNSOL_SIM_REFRESH"; |
| case RIL_UNSOL_CALL_RING: |
| return "UNSOL_CALL_RING"; |
| case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: |
| return "UNSOL_RESPONSE_SIM_STATUS_CHANGED"; |
| case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: |
| return "UNSOL_RESPONSE_CDMA_NEW_SMS"; |
| case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: |
| return "UNSOL_RESPONSE_NEW_BROADCAST_SMS"; |
| case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: |
| return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL"; |
| case RIL_UNSOL_RESTRICTED_STATE_CHANGED: |
| return "UNSOL_RESTRICTED_STATE_CHANGED"; |
| case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: |
| return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE"; |
| case RIL_UNSOL_CDMA_CALL_WAITING: |
| return "UNSOL_CDMA_CALL_WAITING"; |
| case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: |
| return "UNSOL_CDMA_OTA_PROVISION_STATUS"; |
| case RIL_UNSOL_CDMA_INFO_REC: |
| return "UNSOL_CDMA_INFO_REC"; |
| case RIL_UNSOL_OEM_HOOK_RAW: |
| return "UNSOL_OEM_HOOK_RAW"; |
| case RIL_UNSOL_RINGBACK_TONE: |
| return "UNSOL_RINGBACK_TONE"; |
| case RIL_UNSOL_RESEND_INCALL_MUTE: |
| return "UNSOL_RESEND_INCALL_MUTE"; |
| case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: |
| return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED"; |
| case RIL_UNSOL_CDMA_PRL_CHANGED: |
| return "UNSOL_CDMA_PRL_CHANGED"; |
| case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: |
| return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE"; |
| case RIL_UNSOL_RIL_CONNECTED: |
| return "UNSOL_RIL_CONNECTED"; |
| case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: |
| return "UNSOL_VOICE_RADIO_TECH_CHANGED"; |
| case RIL_UNSOL_CELL_INFO_LIST: |
| return "UNSOL_CELL_INFO_LIST"; |
| case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: |
| return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED"; |
| case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: |
| return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED"; |
| case RIL_UNSOL_SRVCC_STATE_NOTIFY: |
| return "UNSOL_SRVCC_STATE_NOTIFY"; |
| case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: |
| return "UNSOL_HARDWARE_CONFIG_CHANGED"; |
| case RIL_UNSOL_DC_RT_INFO_CHANGED: |
| return "UNSOL_DC_RT_INFO_CHANGED"; |
| case RIL_UNSOL_RADIO_CAPABILITY: |
| return "UNSOL_RADIO_CAPABILITY"; |
| case RIL_UNSOL_ON_SS: |
| return "UNSOL_ON_SS"; |
| case RIL_UNSOL_STK_CC_ALPHA_NOTIFY: |
| return "UNSOL_STK_CC_ALPHA_NOTIFY"; |
| case RIL_UNSOL_LCEDATA_RECV: |
| return "UNSOL_LCE_INFO_RECV"; |
| case RIL_UNSOL_PCO_DATA: |
| return "UNSOL_PCO_DATA"; |
| case RIL_UNSOL_MODEM_RESTART: |
| return "UNSOL_MODEM_RESTART"; |
| case RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION: |
| return "UNSOL_CARRIER_INFO_IMSI_ENCRYPTION"; |
| case RIL_UNSOL_NETWORK_SCAN_RESULT: |
| return "UNSOL_NETWORK_SCAN_RESULT"; |
| case RIL_UNSOL_KEEPALIVE_STATUS: |
| return "UNSOL_KEEPALIVE_STATUS"; |
| case RIL_UNSOL_UNTHROTTLE_APN: |
| return "UNSOL_UNTHROTTLE_APN"; |
| case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED: |
| return "UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED"; |
| case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED: |
| return "UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED"; |
| case RIL_UNSOL_ICC_SLOT_STATUS: |
| return "UNSOL_ICC_SLOT_STATUS"; |
| case RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG: |
| return "UNSOL_PHYSICAL_CHANNEL_CONFIG"; |
| case RIL_UNSOL_EMERGENCY_NUMBER_LIST: |
| return "UNSOL_EMERGENCY_NUMBER_LIST"; |
| case RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED: |
| return "UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED"; |
| case RIL_UNSOL_REGISTRATION_FAILED: |
| return "UNSOL_REGISTRATION_FAILED"; |
| case RIL_UNSOL_BARRING_INFO_CHANGED: |
| return "UNSOL_BARRING_INFO_CHANGED"; |
| default: |
| return "<unknown response>"; |
| } |
| } |
| |
| /** |
| * Create capabilities based off of the radio hal version and feature set configurations. |
| * @param radioHalVersion radio hal version |
| * @param modemReducedFeatureSet1 reduced feature set |
| * @return set of capabilities |
| */ |
| @VisibleForTesting |
| public static Set<String> getCaps(HalVersion radioHalVersion, boolean modemReducedFeatureSet1) { |
| final Set<String> caps = new HashSet<>(); |
| |
| if (radioHalVersion.equals(RIL.RADIO_HAL_VERSION_UNKNOWN)) { |
| // If the Radio HAL is UNKNOWN, no capabilities will present themselves. |
| loge("Radio Hal Version is UNKNOWN!"); |
| } |
| |
| logd("Radio Hal Version = " + radioHalVersion.toString()); |
| if (radioHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) { |
| caps.add(CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); |
| logd("CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK"); |
| |
| if (!modemReducedFeatureSet1) { |
| caps.add(CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE); |
| logd("CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE"); |
| caps.add(CAPABILITY_NR_DUAL_CONNECTIVITY_CONFIGURATION_AVAILABLE); |
| logd("CAPABILITY_NR_DUAL_CONNECTIVITY_CONFIGURATION_AVAILABLE"); |
| caps.add(CAPABILITY_THERMAL_MITIGATION_DATA_THROTTLING); |
| logd("CAPABILITY_THERMAL_MITIGATION_DATA_THROTTLING"); |
| caps.add(CAPABILITY_SLICING_CONFIG_SUPPORTED); |
| logd("CAPABILITY_SLICING_CONFIG_SUPPORTED"); |
| caps.add(CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED); |
| logd("CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED"); |
| } else { |
| caps.add(CAPABILITY_SIM_PHONEBOOK_IN_MODEM); |
| logd("CAPABILITY_SIM_PHONEBOOK_IN_MODEM"); |
| } |
| } |
| return caps; |
| } |
| |
| private static boolean isPrimitiveOrWrapper(Class c) { |
| return c.isPrimitive() || WRAPPER_CLASSES.contains(c); |
| } |
| |
| /** |
| * Return a general String representation of a class |
| * @param o The object to convert to String |
| * @return A string containing all public non-static local variables of a class |
| */ |
| public static String convertToString(Object o) { |
| if (isPrimitiveOrWrapper(o.getClass()) || o.getClass() == String.class) return o.toString(); |
| if (o.getClass().isArray()) { |
| // Special handling for arrays |
| StringBuilder sb = new StringBuilder("["); |
| boolean added = false; |
| if (isPrimitiveOrWrapper(o.getClass().getComponentType())) { |
| for (int i = 0; i < Array.getLength(o); i++) { |
| sb.append(convertToString(Array.get(o, i))).append(", "); |
| added = true; |
| } |
| } else { |
| for (Object element : (Object[]) o) { |
| sb.append(convertToString(element)).append(", "); |
| added = true; |
| } |
| } |
| if (added) { |
| // Remove extra , |
| sb.delete(sb.length() - 2, sb.length()); |
| } |
| sb.append("]"); |
| return sb.toString(); |
| } |
| StringBuilder sb = new StringBuilder(o.getClass().getSimpleName()); |
| sb.append("{"); |
| Field[] fields = o.getClass().getDeclaredFields(); |
| int tag = -1; |
| try { |
| tag = (int) o.getClass().getDeclaredMethod("getTag").invoke(o); |
| } catch (IllegalAccessException | InvocationTargetException e) { |
| loge(e.toString()); |
| } catch (NoSuchMethodException ignored) { |
| // Ignored since only unions have the getTag method |
| } |
| if (tag != -1) { |
| // Special handling for unions |
| String tagName = null; |
| try { |
| Method method = o.getClass().getDeclaredMethod("_tagString", int.class); |
| method.setAccessible(true); |
| tagName = (String) method.invoke(o, tag); |
| } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { |
| loge(e.toString()); |
| } |
| if (tagName != null) { |
| sb.append(tagName); |
| sb.append("="); |
| // From tag, create method name getTag |
| String getTagMethod = "get" + tagName.substring(0, 1).toUpperCase(Locale.ROOT) |
| + tagName.substring(1); |
| Object val = null; |
| try { |
| val = o.getClass().getDeclaredMethod(getTagMethod).invoke(o); |
| } catch (NoSuchMethodException | IllegalAccessException |
| | InvocationTargetException e) { |
| loge(e.toString()); |
| } |
| if (val != null) { |
| sb.append(convertToString(val)); |
| } |
| } |
| } else { |
| boolean added = false; |
| for (Field field : fields) { |
| // Ignore static variables |
| if (Modifier.isStatic(field.getModifiers())) continue; |
| sb.append(field.getName()).append("="); |
| Object val = null; |
| try { |
| val = field.get(o); |
| } catch (IllegalAccessException e) { |
| loge(e.toString()); |
| } |
| if (val == null) continue; |
| sb.append(convertToString(val)).append(", "); |
| added = true; |
| } |
| if (added) { |
| // Remove extra , |
| sb.delete(sb.length() - 2, sb.length()); |
| } |
| } |
| sb.append("}"); |
| return sb.toString(); |
| } |
| |
| private static void logd(String log) { |
| Rlog.d("RILUtils", log); |
| } |
| |
| private static void loge(String log) { |
| Rlog.e("RILUtils", log); |
| } |
| } |