1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.telephony; 18 19 import static android.telephony.TelephonyManager.CAPABILITY_NR_DUAL_CONNECTIVITY_CONFIGURATION_AVAILABLE; 20 import static android.telephony.TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED; 21 import static android.telephony.TelephonyManager.CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE; 22 import static android.telephony.TelephonyManager.CAPABILITY_SIM_PHONEBOOK_IN_MODEM; 23 import static android.telephony.TelephonyManager.CAPABILITY_SLICING_CONFIG_SUPPORTED; 24 import static android.telephony.TelephonyManager.CAPABILITY_THERMAL_MITIGATION_DATA_THROTTLING; 25 import static android.telephony.TelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK; 26 27 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU; 28 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ALLOCATE_PDU_SESSION_ID; 29 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ALLOW_DATA; 30 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ANSWER; 31 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_BASEBAND_VERSION; 32 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CANCEL_HANDOVER; 33 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CANCEL_USSD; 34 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_BROADCAST_ACTIVATION; 35 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_BURST_DTMF; 36 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM; 37 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_FLASH; 38 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG; 39 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE; 40 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE; 41 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE; 42 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS; 43 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE; 44 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG; 45 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE; 46 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE; 47 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE; 48 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE; 49 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SUBSCRIPTION; 50 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY; 51 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM; 52 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_BARRING_PASSWORD; 53 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_SIM_PIN; 54 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_SIM_PIN2; 55 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CONFERENCE; 56 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DATA_CALL_LIST; 57 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DATA_REGISTRATION_STATE; 58 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL; 59 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DELETE_SMS_ON_SIM; 60 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEVICE_IDENTITY; 61 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DIAL; 62 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF; 63 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF_START; 64 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF_STOP; 65 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EMERGENCY_DIAL; 66 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_MODEM; 67 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY; 68 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_UICC_APPLICATIONS; 69 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_VONR; 70 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION; 71 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION; 72 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PIN; 73 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PIN2; 74 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PUK; 75 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PUK2; 76 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE; 77 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EXPLICIT_CALL_TRANSFER; 78 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ACTIVITY_INFO; 79 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ALLOWED_CARRIERS; 80 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP; 81 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_BARRING_INFO; 82 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CELL_INFO_LIST; 83 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CLIR; 84 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CURRENT_CALLS; 85 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_DC_RT_INFO; 86 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES; 87 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_HARDWARE_CONFIG; 88 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMEI; 89 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMEISV; 90 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMSI; 91 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_MODEM_STATUS; 92 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_MUTE; 93 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_NEIGHBORING_CELL_IDS; 94 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_PHONE_CAPABILITY; 95 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE; 96 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_RADIO_CAPABILITY; 97 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY; 98 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS; 99 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_STATUS; 100 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SLICING_CONFIG; 101 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SLOT_STATUS; 102 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SMSC_ADDRESS; 103 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS; 104 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT; 105 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_USAGE_SETTING; 106 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_BROADCAST_ACTIVATION; 107 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_GET_BROADCAST_CONFIG; 108 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_SET_BROADCAST_CONFIG; 109 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP; 110 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND; 111 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND; 112 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_REGISTRATION_STATE; 113 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_SEND_SMS; 114 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ISIM_AUTHENTICATION; 115 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED; 116 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IS_VONR_ENABLED; 117 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_LAST_CALL_FAIL_CAUSE; 118 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE; 119 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_READ_ITEM; 120 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_RESET_CONFIG; 121 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_WRITE_CDMA_PRL; 122 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_WRITE_ITEM; 123 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OEM_HOOK_RAW; 124 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OEM_HOOK_STRINGS; 125 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OPERATOR; 126 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_PULL_LCEDATA; 127 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE; 128 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_AVAILABLE_NETWORKS; 129 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CALL_FORWARD_STATUS; 130 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CALL_WAITING; 131 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CLIP; 132 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_FACILITY_LOCK; 133 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE; 134 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_TTY_MODE; 135 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RADIO_POWER; 136 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RELEASE_PDU_SESSION_ID; 137 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_REPORT_SMS_MEMORY_STATUS; 138 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING; 139 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RESET_RADIO; 140 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SCREEN_STATE; 141 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_DEVICE_STATE; 142 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS; 143 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS_EXPECT_MORE; 144 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_USSD; 145 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEPARATE_CONNECTION; 146 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL; 147 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_ALLOWED_CARRIERS; 148 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP; 149 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_BAND_MODE; 150 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CALL_FORWARD; 151 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CALL_WAITING; 152 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION; 153 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CLIR; 154 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DATA_PROFILE; 155 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DATA_THROTTLING; 156 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DC_RT_INFO_RATE; 157 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_FACILITY_LOCK; 158 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_INITIAL_ATTACH_APN; 159 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA; 160 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LOCATION_UPDATES; 161 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING; 162 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_MUTE; 163 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC; 164 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL; 165 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_PREFERRED_DATA_MODEM; 166 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE; 167 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_RADIO_CAPABILITY; 168 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA; 169 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SIM_CARD_POWER; 170 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SMSC_ADDRESS; 171 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION; 172 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS; 173 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_TTY_MODE; 174 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UICC_SUBSCRIPTION; 175 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER; 176 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE; 177 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_USAGE_SETTING; 178 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SHUTDOWN; 179 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIGNAL_STRENGTH; 180 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_AUTHENTICATION; 181 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_CLOSE_CHANNEL; 182 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_IO; 183 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_OPEN_CHANNEL; 184 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC; 185 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL; 186 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SMS_ACKNOWLEDGE; 187 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_HANDOVER; 188 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_KEEPALIVE; 189 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_LCE; 190 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_NETWORK_SCAN; 191 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_GET_PROFILE; 192 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM; 193 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND; 194 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS; 195 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE; 196 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SET_PROFILE; 197 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_KEEPALIVE; 198 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_LCE; 199 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_NETWORK_SCAN; 200 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG; 201 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE; 202 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_UDUB; 203 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORD; 204 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_VOICE_RADIO_TECH; 205 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_VOICE_REGISTRATION_STATE; 206 import static com.android.internal.telephony.RILConstants.RIL_REQUEST_WRITE_SMS_TO_SIM; 207 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_BARRING_INFO_CHANGED; 208 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CALL_RING; 209 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION; 210 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_CALL_WAITING; 211 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_INFO_REC; 212 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_OTA_PROVISION_STATUS; 213 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_PRL_CHANGED; 214 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL; 215 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED; 216 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CELL_INFO_LIST; 217 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_DATA_CALL_LIST_CHANGED; 218 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_DC_RT_INFO_CHANGED; 219 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_EMERGENCY_NUMBER_LIST; 220 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE; 221 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE; 222 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_HARDWARE_CONFIG_CHANGED; 223 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ICC_SLOT_STATUS; 224 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_KEEPALIVE_STATUS; 225 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_LCEDATA_RECV; 226 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_MODEM_RESTART; 227 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_NETWORK_SCAN_RESULT; 228 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_NITZ_TIME_RECEIVED; 229 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_OEM_HOOK_RAW; 230 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_SS; 231 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_USSD; 232 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_USSD_REQUEST; 233 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PCO_DATA; 234 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG; 235 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RADIO_CAPABILITY; 236 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_REGISTRATION_FAILED; 237 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESEND_INCALL_MUTE; 238 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED; 239 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_CDMA_NEW_SMS; 240 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED; 241 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED; 242 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS; 243 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS; 244 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM; 245 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT; 246 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED; 247 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED; 248 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED; 249 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED; 250 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESTRICTED_STATE_CHANGED; 251 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RIL_CONNECTED; 252 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RINGBACK_TONE; 253 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIGNAL_STRENGTH; 254 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIM_REFRESH; 255 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIM_SMS_STORAGE_FULL; 256 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SRVCC_STATE_NOTIFY; 257 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_CALL_SETUP; 258 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_CC_ALPHA_NOTIFY; 259 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_EVENT_NOTIFY; 260 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_PROACTIVE_COMMAND; 261 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_SESSION_END; 262 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SUPP_SVC_NOTIFICATION; 263 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED; 264 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED; 265 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UNTHROTTLE_APN; 266 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_VOICE_RADIO_TECH_CHANGED; 267 268 import android.annotation.Nullable; 269 import android.net.InetAddresses; 270 import android.net.LinkAddress; 271 import android.net.LinkProperties; 272 import android.os.SystemClock; 273 import android.service.carrier.CarrierIdentifier; 274 import android.telephony.AccessNetworkConstants; 275 import android.telephony.Annotation; 276 import android.telephony.BarringInfo; 277 import android.telephony.CarrierRestrictionRules; 278 import android.telephony.CellConfigLte; 279 import android.telephony.CellIdentity; 280 import android.telephony.CellIdentityCdma; 281 import android.telephony.CellIdentityGsm; 282 import android.telephony.CellIdentityLte; 283 import android.telephony.CellIdentityNr; 284 import android.telephony.CellIdentityTdscdma; 285 import android.telephony.CellIdentityWcdma; 286 import android.telephony.CellInfo; 287 import android.telephony.CellInfoCdma; 288 import android.telephony.CellInfoGsm; 289 import android.telephony.CellInfoLte; 290 import android.telephony.CellInfoNr; 291 import android.telephony.CellInfoTdscdma; 292 import android.telephony.CellInfoWcdma; 293 import android.telephony.CellSignalStrength; 294 import android.telephony.CellSignalStrengthCdma; 295 import android.telephony.CellSignalStrengthGsm; 296 import android.telephony.CellSignalStrengthLte; 297 import android.telephony.CellSignalStrengthNr; 298 import android.telephony.CellSignalStrengthTdscdma; 299 import android.telephony.CellSignalStrengthWcdma; 300 import android.telephony.ClosedSubscriberGroupInfo; 301 import android.telephony.LinkCapacityEstimate; 302 import android.telephony.ModemInfo; 303 import android.telephony.PhoneCapability; 304 import android.telephony.PhoneNumberUtils; 305 import android.telephony.PhysicalChannelConfig; 306 import android.telephony.RadioAccessSpecifier; 307 import android.telephony.ServiceState; 308 import android.telephony.SignalStrength; 309 import android.telephony.SignalThresholdInfo; 310 import android.telephony.SmsManager; 311 import android.telephony.TelephonyManager; 312 import android.telephony.UiccSlotMapping; 313 import android.telephony.data.ApnSetting; 314 import android.telephony.data.DataCallResponse; 315 import android.telephony.data.DataProfile; 316 import android.telephony.data.DataService; 317 import android.telephony.data.DataService.DeactivateDataReason; 318 import android.telephony.data.DataService.SetupDataReason; 319 import android.telephony.data.EpsQos; 320 import android.telephony.data.NetworkSliceInfo; 321 import android.telephony.data.NetworkSlicingConfig; 322 import android.telephony.data.NrQos; 323 import android.telephony.data.Qos; 324 import android.telephony.data.QosBearerFilter; 325 import android.telephony.data.QosBearerSession; 326 import android.telephony.data.RouteSelectionDescriptor; 327 import android.telephony.data.TrafficDescriptor; 328 import android.telephony.data.UrspRule; 329 import android.text.TextUtils; 330 import android.util.ArraySet; 331 import android.util.SparseArray; 332 333 import com.android.internal.annotations.VisibleForTesting; 334 import com.android.internal.telephony.cat.ComprehensionTlv; 335 import com.android.internal.telephony.cat.ComprehensionTlvTag; 336 import com.android.internal.telephony.cdma.SmsMessage; 337 import com.android.internal.telephony.cdma.sms.CdmaSmsAddress; 338 import com.android.internal.telephony.cdma.sms.CdmaSmsSubaddress; 339 import com.android.internal.telephony.cdma.sms.SmsEnvelope; 340 import com.android.internal.telephony.data.KeepaliveStatus; 341 import com.android.internal.telephony.data.KeepaliveStatus.KeepaliveStatusCode; 342 import com.android.internal.telephony.uicc.AdnCapacity; 343 import com.android.internal.telephony.uicc.IccCardApplicationStatus; 344 import com.android.internal.telephony.uicc.IccCardStatus; 345 import com.android.internal.telephony.uicc.IccSimPortInfo; 346 import com.android.internal.telephony.uicc.IccSlotPortMapping; 347 import com.android.internal.telephony.uicc.IccSlotStatus; 348 import com.android.internal.telephony.uicc.IccUtils; 349 import com.android.internal.telephony.uicc.SimPhonebookRecord; 350 import com.android.telephony.Rlog; 351 352 import java.io.ByteArrayInputStream; 353 import java.io.DataInputStream; 354 import java.io.IOException; 355 import java.lang.reflect.Array; 356 import java.lang.reflect.Field; 357 import java.lang.reflect.InvocationTargetException; 358 import java.lang.reflect.Method; 359 import java.lang.reflect.Modifier; 360 import java.net.Inet4Address; 361 import java.net.InetAddress; 362 import java.util.ArrayList; 363 import java.util.Arrays; 364 import java.util.Collections; 365 import java.util.HashSet; 366 import java.util.List; 367 import java.util.Locale; 368 import java.util.Objects; 369 import java.util.Set; 370 import java.util.stream.Collectors; 371 372 /** 373 * Utils class for HAL <-> RIL conversions 374 */ 375 public class RILUtils { 376 private static final String TAG = "RILUtils"; 377 378 // The number of required config values for broadcast SMS stored in RIL_CdmaBroadcastServiceInfo 379 public static final int CDMA_BSI_NO_OF_INTS_STRUCT = 3; 380 // The number of service categories for broadcast SMS 381 public static final int CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES = 31; 382 383 // Radio power failure UUIDs 384 public static final String RADIO_POWER_FAILURE_BUGREPORT_UUID = 385 "316f3801-fa21-4954-a42f-0041eada3b31"; 386 public static final String RADIO_POWER_FAILURE_RF_HARDWARE_ISSUE_UUID = 387 "316f3801-fa21-4954-a42f-0041eada3b32"; 388 public static final String RADIO_POWER_FAILURE_NO_RF_CALIBRATION_UUID = 389 "316f3801-fa21-4954-a42f-0041eada3b33"; 390 391 private static final Set<Class> WRAPPER_CLASSES = new HashSet(Arrays.asList( 392 Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, 393 Float.class, Double.class)); 394 395 /** 396 * Convert to PersoSubstate defined in radio/1.5/types.hal 397 * @param persoType PersoSubState type 398 * @return The converted PersoSubstate 399 */ convertToHalPersoType( IccCardApplicationStatus.PersoSubState persoType)400 public static int convertToHalPersoType( 401 IccCardApplicationStatus.PersoSubState persoType) { 402 switch (persoType) { 403 case PERSOSUBSTATE_IN_PROGRESS: 404 return android.hardware.radio.V1_5.PersoSubstate.IN_PROGRESS; 405 case PERSOSUBSTATE_READY: 406 return android.hardware.radio.V1_5.PersoSubstate.READY; 407 case PERSOSUBSTATE_SIM_NETWORK: 408 return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK; 409 case PERSOSUBSTATE_SIM_NETWORK_SUBSET: 410 return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_SUBSET; 411 case PERSOSUBSTATE_SIM_CORPORATE: 412 return android.hardware.radio.V1_5.PersoSubstate.SIM_CORPORATE; 413 case PERSOSUBSTATE_SIM_SERVICE_PROVIDER: 414 return android.hardware.radio.V1_5.PersoSubstate.SIM_SERVICE_PROVIDER; 415 case PERSOSUBSTATE_SIM_SIM: 416 return android.hardware.radio.V1_5.PersoSubstate.SIM_SIM; 417 case PERSOSUBSTATE_SIM_NETWORK_PUK: 418 return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_PUK; 419 case PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK: 420 return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_SUBSET_PUK; 421 case PERSOSUBSTATE_SIM_CORPORATE_PUK: 422 return android.hardware.radio.V1_5.PersoSubstate.SIM_CORPORATE_PUK; 423 case PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK: 424 return android.hardware.radio.V1_5.PersoSubstate.SIM_SERVICE_PROVIDER_PUK; 425 case PERSOSUBSTATE_SIM_SIM_PUK: 426 return android.hardware.radio.V1_5.PersoSubstate.SIM_SIM_PUK; 427 case PERSOSUBSTATE_RUIM_NETWORK1: 428 return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK1; 429 case PERSOSUBSTATE_RUIM_NETWORK2: 430 return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK2; 431 case PERSOSUBSTATE_RUIM_HRPD: 432 return android.hardware.radio.V1_5.PersoSubstate.RUIM_HRPD; 433 case PERSOSUBSTATE_RUIM_CORPORATE: 434 return android.hardware.radio.V1_5.PersoSubstate.RUIM_CORPORATE; 435 case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER: 436 return android.hardware.radio.V1_5.PersoSubstate.RUIM_SERVICE_PROVIDER; 437 case PERSOSUBSTATE_RUIM_RUIM: 438 return android.hardware.radio.V1_5.PersoSubstate.RUIM_RUIM; 439 case PERSOSUBSTATE_RUIM_NETWORK1_PUK: 440 return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK1_PUK; 441 case PERSOSUBSTATE_RUIM_NETWORK2_PUK: 442 return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK2_PUK; 443 case PERSOSUBSTATE_RUIM_HRPD_PUK: 444 return android.hardware.radio.V1_5.PersoSubstate.RUIM_HRPD_PUK; 445 case PERSOSUBSTATE_RUIM_CORPORATE_PUK: 446 return android.hardware.radio.V1_5.PersoSubstate.RUIM_CORPORATE_PUK; 447 case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK: 448 return android.hardware.radio.V1_5.PersoSubstate.RUIM_SERVICE_PROVIDER_PUK; 449 case PERSOSUBSTATE_RUIM_RUIM_PUK: 450 return android.hardware.radio.V1_5.PersoSubstate.RUIM_RUIM_PUK; 451 case PERSOSUBSTATE_SIM_SPN: 452 return android.hardware.radio.V1_5.PersoSubstate.SIM_SPN; 453 case PERSOSUBSTATE_SIM_SPN_PUK: 454 return android.hardware.radio.V1_5.PersoSubstate.SIM_SPN_PUK; 455 case PERSOSUBSTATE_SIM_SP_EHPLMN: 456 return android.hardware.radio.V1_5.PersoSubstate.SIM_SP_EHPLMN; 457 case PERSOSUBSTATE_SIM_SP_EHPLMN_PUK: 458 return android.hardware.radio.V1_5.PersoSubstate.SIM_SP_EHPLMN_PUK; 459 case PERSOSUBSTATE_SIM_ICCID: 460 return android.hardware.radio.V1_5.PersoSubstate.SIM_ICCID; 461 case PERSOSUBSTATE_SIM_ICCID_PUK: 462 return android.hardware.radio.V1_5.PersoSubstate.SIM_ICCID_PUK; 463 case PERSOSUBSTATE_SIM_IMPI: 464 return android.hardware.radio.V1_5.PersoSubstate.SIM_IMPI; 465 case PERSOSUBSTATE_SIM_IMPI_PUK: 466 return android.hardware.radio.V1_5.PersoSubstate.SIM_IMPI_PUK; 467 case PERSOSUBSTATE_SIM_NS_SP: 468 return android.hardware.radio.V1_5.PersoSubstate.SIM_NS_SP; 469 case PERSOSUBSTATE_SIM_NS_SP_PUK: 470 return android.hardware.radio.V1_5.PersoSubstate.SIM_NS_SP_PUK; 471 default: 472 return android.hardware.radio.V1_5.PersoSubstate.UNKNOWN; 473 } 474 } 475 476 /** 477 * Convert to PersoSubstate.aidl 478 * @param persoType PersoSubState type 479 * @return The converted PersoSubstate 480 */ convertToHalPersoTypeAidl( IccCardApplicationStatus.PersoSubState persoType)481 public static int convertToHalPersoTypeAidl( 482 IccCardApplicationStatus.PersoSubState persoType) { 483 switch (persoType) { 484 case PERSOSUBSTATE_IN_PROGRESS: 485 return android.hardware.radio.sim.PersoSubstate.IN_PROGRESS; 486 case PERSOSUBSTATE_READY: 487 return android.hardware.radio.sim.PersoSubstate.READY; 488 case PERSOSUBSTATE_SIM_NETWORK: 489 return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK; 490 case PERSOSUBSTATE_SIM_NETWORK_SUBSET: 491 return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK_SUBSET; 492 case PERSOSUBSTATE_SIM_CORPORATE: 493 return android.hardware.radio.sim.PersoSubstate.SIM_CORPORATE; 494 case PERSOSUBSTATE_SIM_SERVICE_PROVIDER: 495 return android.hardware.radio.sim.PersoSubstate.SIM_SERVICE_PROVIDER; 496 case PERSOSUBSTATE_SIM_SIM: 497 return android.hardware.radio.sim.PersoSubstate.SIM_SIM; 498 case PERSOSUBSTATE_SIM_NETWORK_PUK: 499 return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK_PUK; 500 case PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK: 501 return android.hardware.radio.sim.PersoSubstate.SIM_NETWORK_SUBSET_PUK; 502 case PERSOSUBSTATE_SIM_CORPORATE_PUK: 503 return android.hardware.radio.sim.PersoSubstate.SIM_CORPORATE_PUK; 504 case PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK: 505 return android.hardware.radio.sim.PersoSubstate.SIM_SERVICE_PROVIDER_PUK; 506 case PERSOSUBSTATE_SIM_SIM_PUK: 507 return android.hardware.radio.sim.PersoSubstate.SIM_SIM_PUK; 508 case PERSOSUBSTATE_RUIM_NETWORK1: 509 return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK1; 510 case PERSOSUBSTATE_RUIM_NETWORK2: 511 return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK2; 512 case PERSOSUBSTATE_RUIM_HRPD: 513 return android.hardware.radio.sim.PersoSubstate.RUIM_HRPD; 514 case PERSOSUBSTATE_RUIM_CORPORATE: 515 return android.hardware.radio.sim.PersoSubstate.RUIM_CORPORATE; 516 case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER: 517 return android.hardware.radio.sim.PersoSubstate.RUIM_SERVICE_PROVIDER; 518 case PERSOSUBSTATE_RUIM_RUIM: 519 return android.hardware.radio.sim.PersoSubstate.RUIM_RUIM; 520 case PERSOSUBSTATE_RUIM_NETWORK1_PUK: 521 return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK1_PUK; 522 case PERSOSUBSTATE_RUIM_NETWORK2_PUK: 523 return android.hardware.radio.sim.PersoSubstate.RUIM_NETWORK2_PUK; 524 case PERSOSUBSTATE_RUIM_HRPD_PUK: 525 return android.hardware.radio.sim.PersoSubstate.RUIM_HRPD_PUK; 526 case PERSOSUBSTATE_RUIM_CORPORATE_PUK: 527 return android.hardware.radio.sim.PersoSubstate.RUIM_CORPORATE_PUK; 528 case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK: 529 return android.hardware.radio.sim.PersoSubstate.RUIM_SERVICE_PROVIDER_PUK; 530 case PERSOSUBSTATE_RUIM_RUIM_PUK: 531 return android.hardware.radio.sim.PersoSubstate.RUIM_RUIM_PUK; 532 case PERSOSUBSTATE_SIM_SPN: 533 return android.hardware.radio.sim.PersoSubstate.SIM_SPN; 534 case PERSOSUBSTATE_SIM_SPN_PUK: 535 return android.hardware.radio.sim.PersoSubstate.SIM_SPN_PUK; 536 case PERSOSUBSTATE_SIM_SP_EHPLMN: 537 return android.hardware.radio.sim.PersoSubstate.SIM_SP_EHPLMN; 538 case PERSOSUBSTATE_SIM_SP_EHPLMN_PUK: 539 return android.hardware.radio.sim.PersoSubstate.SIM_SP_EHPLMN_PUK; 540 case PERSOSUBSTATE_SIM_ICCID: 541 return android.hardware.radio.sim.PersoSubstate.SIM_ICCID; 542 case PERSOSUBSTATE_SIM_ICCID_PUK: 543 return android.hardware.radio.sim.PersoSubstate.SIM_ICCID_PUK; 544 case PERSOSUBSTATE_SIM_IMPI: 545 return android.hardware.radio.sim.PersoSubstate.SIM_IMPI; 546 case PERSOSUBSTATE_SIM_IMPI_PUK: 547 return android.hardware.radio.sim.PersoSubstate.SIM_IMPI_PUK; 548 case PERSOSUBSTATE_SIM_NS_SP: 549 return android.hardware.radio.sim.PersoSubstate.SIM_NS_SP; 550 case PERSOSUBSTATE_SIM_NS_SP_PUK: 551 return android.hardware.radio.sim.PersoSubstate.SIM_NS_SP_PUK; 552 default: 553 return android.hardware.radio.sim.PersoSubstate.UNKNOWN; 554 } 555 } 556 557 /** 558 * Convert to GsmSmsMessage defined in radio/1.0/types.hal 559 * @param smscPdu SMSC address 560 * @param pdu SMS in PDU format 561 * @return A converted GsmSmsMessage 562 */ convertToHalGsmSmsMessage( String smscPdu, String pdu)563 public static android.hardware.radio.V1_0.GsmSmsMessage convertToHalGsmSmsMessage( 564 String smscPdu, String pdu) { 565 android.hardware.radio.V1_0.GsmSmsMessage msg = 566 new android.hardware.radio.V1_0.GsmSmsMessage(); 567 msg.smscPdu = smscPdu == null ? "" : smscPdu; 568 msg.pdu = pdu == null ? "" : pdu; 569 return msg; 570 } 571 572 /** 573 * Convert to GsmSmsMessage.aidl 574 * @param smscPdu SMSC address 575 * @param pdu SMS in PDU format 576 * @return A converted GsmSmsMessage 577 */ convertToHalGsmSmsMessageAidl( String smscPdu, String pdu)578 public static android.hardware.radio.messaging.GsmSmsMessage convertToHalGsmSmsMessageAidl( 579 String smscPdu, String pdu) { 580 android.hardware.radio.messaging.GsmSmsMessage msg = 581 new android.hardware.radio.messaging.GsmSmsMessage(); 582 msg.smscPdu = convertNullToEmptyString(smscPdu); 583 msg.pdu = convertNullToEmptyString(pdu); 584 return msg; 585 } 586 587 /** 588 * Convert to CdmaSmsMessage defined in radio/1.0/types.hal 589 * @param pdu SMS in PDU format 590 * @return A converted CdmaSmsMessage 591 */ convertToHalCdmaSmsMessage( byte[] pdu)592 public static android.hardware.radio.V1_0.CdmaSmsMessage convertToHalCdmaSmsMessage( 593 byte[] pdu) { 594 android.hardware.radio.V1_0.CdmaSmsMessage msg = 595 new android.hardware.radio.V1_0.CdmaSmsMessage(); 596 int addrNbrOfDigits; 597 int subaddrNbrOfDigits; 598 int bearerDataLength; 599 ByteArrayInputStream bais = new ByteArrayInputStream(pdu); 600 DataInputStream dis = new DataInputStream(bais); 601 602 try { 603 msg.teleserviceId = dis.readInt(); // teleServiceId 604 msg.isServicePresent = (byte) dis.readInt() == 1; // servicePresent 605 msg.serviceCategory = dis.readInt(); // serviceCategory 606 msg.address.digitMode = dis.read(); // address digit mode 607 msg.address.numberMode = dis.read(); // address number mode 608 msg.address.numberType = dis.read(); // address number type 609 msg.address.numberPlan = dis.read(); // address number plan 610 addrNbrOfDigits = (byte) dis.read(); 611 for (int i = 0; i < addrNbrOfDigits; i++) { 612 msg.address.digits.add(dis.readByte()); // address_orig_bytes[i] 613 } 614 msg.subAddress.subaddressType = dis.read(); //subaddressType 615 msg.subAddress.odd = (byte) dis.read() == 1; //subaddr odd 616 subaddrNbrOfDigits = (byte) dis.read(); 617 for (int i = 0; i < subaddrNbrOfDigits; i++) { 618 msg.subAddress.digits.add(dis.readByte()); //subaddr_orig_bytes[i] 619 } 620 621 bearerDataLength = dis.read(); 622 for (int i = 0; i < bearerDataLength; i++) { 623 msg.bearerData.add(dis.readByte()); //bearerData[i] 624 } 625 } catch (IOException ex) { 626 } 627 return msg; 628 } 629 630 /** 631 * Convert to CdmaSmsMessage.aidl 632 * @param pdu SMS in PDU format 633 * @return The converted CdmaSmsMessage 634 */ convertToHalCdmaSmsMessageAidl( byte[] pdu)635 public static android.hardware.radio.messaging.CdmaSmsMessage convertToHalCdmaSmsMessageAidl( 636 byte[] pdu) { 637 android.hardware.radio.messaging.CdmaSmsMessage msg = 638 new android.hardware.radio.messaging.CdmaSmsMessage(); 639 msg.address = new android.hardware.radio.messaging.CdmaSmsAddress(); 640 msg.subAddress = new android.hardware.radio.messaging.CdmaSmsSubaddress(); 641 int addrNbrOfDigits; 642 int subaddrNbrOfDigits; 643 int bearerDataLength; 644 ByteArrayInputStream bais = new ByteArrayInputStream(pdu); 645 DataInputStream dis = new DataInputStream(bais); 646 647 try { 648 msg.teleserviceId = dis.readInt(); // teleServiceId 649 msg.isServicePresent = (byte) dis.readInt() == 1; // servicePresent 650 msg.serviceCategory = dis.readInt(); // serviceCategory 651 msg.address.digitMode = dis.read(); // address digit mode 652 msg.address.isNumberModeDataNetwork = 653 dis.read() == CdmaSmsAddress.NUMBER_MODE_DATA_NETWORK; // address number mode 654 msg.address.numberType = dis.read(); // address number type 655 msg.address.numberPlan = dis.read(); // address number plan 656 addrNbrOfDigits = (byte) dis.read(); 657 byte[] digits = new byte[addrNbrOfDigits]; 658 for (int i = 0; i < addrNbrOfDigits; i++) { 659 digits[i] = dis.readByte(); // address_orig_bytes[i] 660 } 661 msg.address.digits = digits; 662 msg.subAddress.subaddressType = dis.read(); //subaddressType 663 msg.subAddress.odd = (byte) dis.read() == 1; //subaddr odd 664 subaddrNbrOfDigits = (byte) dis.read(); 665 digits = new byte[subaddrNbrOfDigits]; 666 for (int i = 0; i < subaddrNbrOfDigits; i++) { 667 digits[i] = dis.readByte(); //subaddr_orig_bytes[i] 668 } 669 msg.subAddress.digits = digits; 670 671 bearerDataLength = dis.read(); 672 byte[] bearerData = new byte[bearerDataLength]; 673 for (int i = 0; i < bearerDataLength; i++) { 674 bearerData[i] = dis.readByte(); //bearerData[i] 675 } 676 msg.bearerData = bearerData; 677 } catch (IOException ex) { 678 } 679 return msg; 680 } 681 682 /** 683 * Convert CdmaSmsMessage defined in radio/1.0/types.hal to SmsMessage 684 * Note only primitive fields are set 685 * @param cdmaSmsMessage CdmaSmsMessage defined in radio/1.0/types.hal 686 * @return A converted SmsMessage 687 */ convertHalCdmaSmsMessage( android.hardware.radio.V1_0.CdmaSmsMessage cdmaSmsMessage)688 public static SmsMessage convertHalCdmaSmsMessage( 689 android.hardware.radio.V1_0.CdmaSmsMessage cdmaSmsMessage) { 690 // Note: Parcel.readByte actually reads one Int and masks to byte 691 SmsEnvelope env = new SmsEnvelope(); 692 CdmaSmsAddress addr = new CdmaSmsAddress(); 693 CdmaSmsSubaddress subaddr = new CdmaSmsSubaddress(); 694 byte[] data; 695 byte count; 696 int countInt; 697 int addressDigitMode; 698 699 //currently not supported by the modem-lib: env.mMessageType 700 env.teleService = cdmaSmsMessage.teleserviceId; 701 702 if (cdmaSmsMessage.isServicePresent) { 703 env.messageType = SmsEnvelope.MESSAGE_TYPE_BROADCAST; 704 } else { 705 if (SmsEnvelope.TELESERVICE_NOT_SET == env.teleService) { 706 // assume type ACK 707 env.messageType = SmsEnvelope.MESSAGE_TYPE_ACKNOWLEDGE; 708 } else { 709 env.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT; 710 } 711 } 712 env.serviceCategory = cdmaSmsMessage.serviceCategory; 713 714 // address 715 addressDigitMode = cdmaSmsMessage.address.digitMode; 716 addr.digitMode = (byte) (0xFF & addressDigitMode); 717 addr.numberMode = (byte) (0xFF & cdmaSmsMessage.address.numberMode); 718 addr.ton = cdmaSmsMessage.address.numberType; 719 addr.numberPlan = (byte) (0xFF & cdmaSmsMessage.address.numberPlan); 720 count = (byte) cdmaSmsMessage.address.digits.size(); 721 addr.numberOfDigits = count; 722 data = new byte[count]; 723 for (int index = 0; index < count; index++) { 724 data[index] = cdmaSmsMessage.address.digits.get(index); 725 726 // convert the value if it is 4-bit DTMF to 8 bit 727 if (addressDigitMode == CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF) { 728 data[index] = SmsMessage.convertDtmfToAscii(data[index]); 729 } 730 } 731 732 addr.origBytes = data; 733 734 subaddr.type = cdmaSmsMessage.subAddress.subaddressType; 735 subaddr.odd = (byte) (cdmaSmsMessage.subAddress.odd ? 1 : 0); 736 count = (byte) cdmaSmsMessage.subAddress.digits.size(); 737 738 if (count < 0) { 739 count = 0; 740 } 741 742 // p_cur->sSubAddress.digits[digitCount] : 743 744 data = new byte[count]; 745 746 for (int index = 0; index < count; ++index) { 747 data[index] = cdmaSmsMessage.subAddress.digits.get(index); 748 } 749 750 subaddr.origBytes = data; 751 752 /* currently not supported by the modem-lib: 753 env.bearerReply 754 env.replySeqNo 755 env.errorClass 756 env.causeCode 757 */ 758 759 // bearer data 760 countInt = cdmaSmsMessage.bearerData.size(); 761 if (countInt < 0) { 762 countInt = 0; 763 } 764 765 data = new byte[countInt]; 766 for (int index = 0; index < countInt; index++) { 767 data[index] = cdmaSmsMessage.bearerData.get(index); 768 } 769 // BD gets further decoded when accessed in SMSDispatcher 770 env.bearerData = data; 771 772 // link the filled objects to the SMS 773 env.origAddress = addr; 774 env.origSubaddress = subaddr; 775 776 SmsMessage msg = new SmsMessage(addr, env); 777 778 return msg; 779 } 780 781 /** 782 * Convert CdmaSmsMessage defined in CdmaSmsMessage.aidl to SmsMessage 783 * Note only primitive fields are set 784 * @param msg CdmaSmsMessage defined in CdmaSmsMessage.aidl 785 * @return A converted SmsMessage 786 */ convertHalCdmaSmsMessage( android.hardware.radio.messaging.CdmaSmsMessage msg)787 public static SmsMessage convertHalCdmaSmsMessage( 788 android.hardware.radio.messaging.CdmaSmsMessage msg) { 789 // Note: Parcel.readByte actually reads one Int and masks to byte 790 SmsEnvelope env = new SmsEnvelope(); 791 CdmaSmsAddress addr = new CdmaSmsAddress(); 792 CdmaSmsSubaddress subaddr = new CdmaSmsSubaddress(); 793 794 // address 795 int addressDigitMode = msg.address.digitMode; 796 addr.digitMode = (byte) (0xFF & addressDigitMode); 797 addr.numberMode = (byte) (0xFF & (msg.address.isNumberModeDataNetwork ? 1 : 0)); 798 addr.ton = msg.address.numberType; 799 addr.numberPlan = (byte) (0xFF & msg.address.numberPlan); 800 addr.numberOfDigits = msg.address.digits.length; 801 byte[] data = new byte[msg.address.digits.length]; 802 for (int index = 0; index < data.length; index++) { 803 data[index] = msg.address.digits[index]; 804 // convert the value if it is 4-bit DTMF to 8 bit 805 if (addressDigitMode == CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF) { 806 data[index] = SmsMessage.convertDtmfToAscii(data[index]); 807 } 808 } 809 addr.origBytes = data; 810 811 // subaddress 812 subaddr.type = msg.subAddress.subaddressType; 813 subaddr.odd = (byte) (msg.subAddress.odd ? 1 : 0); 814 subaddr.origBytes = msg.subAddress.digits; 815 816 // envelope 817 // currently not supported by the modem-lib: env.bearerReply, env.replySeqNo, 818 // env.errorClass, env.causeCode, env.mMessageType 819 env.teleService = msg.teleserviceId; 820 if (msg.isServicePresent) { 821 env.messageType = SmsEnvelope.MESSAGE_TYPE_BROADCAST; 822 } else { 823 if (SmsEnvelope.TELESERVICE_NOT_SET == env.teleService) { 824 // assume type ACK 825 env.messageType = SmsEnvelope.MESSAGE_TYPE_ACKNOWLEDGE; 826 } else { 827 env.messageType = SmsEnvelope.MESSAGE_TYPE_POINT_TO_POINT; 828 } 829 } 830 env.serviceCategory = msg.serviceCategory; 831 832 // bearer data is further decoded when accessed in SmsDispatcher 833 env.bearerData = msg.bearerData; 834 835 // link the filled objects to the SMS 836 env.origAddress = addr; 837 env.origSubaddress = subaddr; 838 839 return new SmsMessage(addr, env); 840 } 841 842 /** 843 * Convert to DataProfileInfo defined in radio/1.0/types.hal 844 * @param dp Data profile 845 * @return The converted DataProfileInfo 846 */ convertToHalDataProfile10( DataProfile dp)847 public static android.hardware.radio.V1_0.DataProfileInfo convertToHalDataProfile10( 848 DataProfile dp) { 849 android.hardware.radio.V1_0.DataProfileInfo dpi = 850 new android.hardware.radio.V1_0.DataProfileInfo(); 851 852 dpi.profileId = dp.getProfileId(); 853 dpi.apn = dp.getApn(); 854 dpi.protocol = ApnSetting.getProtocolStringFromInt(dp.getProtocolType()); 855 dpi.roamingProtocol = ApnSetting.getProtocolStringFromInt(dp.getRoamingProtocolType()); 856 dpi.authType = dp.getAuthType(); 857 dpi.user = TextUtils.emptyIfNull(dp.getUserName()); 858 dpi.password = TextUtils.emptyIfNull(dp.getPassword()); 859 dpi.type = dp.getType(); 860 dpi.maxConnsTime = dp.getMaxConnectionsTime(); 861 dpi.maxConns = dp.getMaxConnections(); 862 dpi.waitTime = dp.getWaitTime(); 863 dpi.enabled = dp.isEnabled(); 864 dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); 865 // Shift by 1 bit due to the discrepancy between 866 // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of 867 // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. 868 dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( 869 dp.getBearerBitmask()) << 1; 870 dpi.mtu = dp.getMtuV4(); 871 dpi.mvnoType = android.hardware.radio.V1_0.MvnoType.NONE; 872 dpi.mvnoMatchData = ""; 873 874 return dpi; 875 } 876 877 /** 878 * Convert to DataProfileInfo defined in radio/1.4/types.hal 879 * @param dp Data profile 880 * @return The converted DataProfileInfo 881 */ convertToHalDataProfile14( DataProfile dp)882 public static android.hardware.radio.V1_4.DataProfileInfo convertToHalDataProfile14( 883 DataProfile dp) { 884 android.hardware.radio.V1_4.DataProfileInfo dpi = 885 new android.hardware.radio.V1_4.DataProfileInfo(); 886 887 dpi.apn = dp.getApn(); 888 dpi.protocol = dp.getProtocolType(); 889 dpi.roamingProtocol = dp.getRoamingProtocolType(); 890 dpi.authType = dp.getAuthType(); 891 dpi.user = TextUtils.emptyIfNull(dp.getUserName()); 892 dpi.password = TextUtils.emptyIfNull(dp.getPassword()); 893 dpi.type = dp.getType(); 894 dpi.maxConnsTime = dp.getMaxConnectionsTime(); 895 dpi.maxConns = dp.getMaxConnections(); 896 dpi.waitTime = dp.getWaitTime(); 897 dpi.enabled = dp.isEnabled(); 898 dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); 899 // Shift by 1 bit due to the discrepancy between 900 // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of 901 // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. 902 dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( 903 dp.getBearerBitmask()) << 1; 904 dpi.mtu = dp.getMtuV4(); 905 dpi.persistent = dp.isPersistent(); 906 dpi.preferred = dp.isPreferred(); 907 908 // profile id is only meaningful when it's persistent on the modem. 909 dpi.profileId = (dpi.persistent) ? dp.getProfileId() 910 : android.hardware.radio.V1_0.DataProfileId.INVALID; 911 912 return dpi; 913 } 914 915 /** 916 * Convert to DataProfileInfo defined in radio/1.5/types.hal 917 * @param dp Data profile 918 * @return The converted DataProfileInfo 919 */ convertToHalDataProfile15( DataProfile dp)920 public static android.hardware.radio.V1_5.DataProfileInfo convertToHalDataProfile15( 921 DataProfile dp) { 922 android.hardware.radio.V1_5.DataProfileInfo dpi = 923 new android.hardware.radio.V1_5.DataProfileInfo(); 924 925 dpi.apn = dp.getApn(); 926 dpi.protocol = dp.getProtocolType(); 927 dpi.roamingProtocol = dp.getRoamingProtocolType(); 928 dpi.authType = dp.getAuthType(); 929 dpi.user = TextUtils.emptyIfNull(dp.getUserName()); 930 dpi.password = TextUtils.emptyIfNull(dp.getPassword()); 931 dpi.type = dp.getType(); 932 dpi.maxConnsTime = dp.getMaxConnectionsTime(); 933 dpi.maxConns = dp.getMaxConnections(); 934 dpi.waitTime = dp.getWaitTime(); 935 dpi.enabled = dp.isEnabled(); 936 dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); 937 // Shift by 1 bit due to the discrepancy between 938 // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of 939 // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. 940 dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( 941 dp.getBearerBitmask()) << 1; 942 dpi.mtuV4 = dp.getMtuV4(); 943 dpi.mtuV6 = dp.getMtuV6(); 944 dpi.persistent = dp.isPersistent(); 945 dpi.preferred = dp.isPreferred(); 946 947 // profile id is only meaningful when it's persistent on the modem. 948 dpi.profileId = (dpi.persistent) ? dp.getProfileId() 949 : android.hardware.radio.V1_0.DataProfileId.INVALID; 950 951 return dpi; 952 } 953 954 /** 955 * Convert to DataProfileInfo.aidl 956 * @param dp Data profile 957 * @return The converted DataProfileInfo 958 */ convertToHalDataProfile( DataProfile dp)959 public static android.hardware.radio.data.DataProfileInfo convertToHalDataProfile( 960 DataProfile dp) { 961 android.hardware.radio.data.DataProfileInfo dpi = 962 new android.hardware.radio.data.DataProfileInfo(); 963 964 dpi.apn = dp.getApn(); 965 dpi.protocol = dp.getProtocolType(); 966 dpi.roamingProtocol = dp.getRoamingProtocolType(); 967 dpi.authType = dp.getAuthType(); 968 dpi.user = convertNullToEmptyString(dp.getUserName()); 969 dpi.password = convertNullToEmptyString(dp.getPassword()); 970 dpi.type = dp.getType(); 971 dpi.maxConnsTime = dp.getMaxConnectionsTime(); 972 dpi.maxConns = dp.getMaxConnections(); 973 dpi.waitTime = dp.getWaitTime(); 974 dpi.enabled = dp.isEnabled(); 975 dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask(); 976 // Shift by 1 bit due to the discrepancy between RadioAccessFamily.aidl and the bitmask 977 // version of ServiceState.RIL_RADIO_TECHNOLOGY_XXXX. 978 dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask( 979 dp.getBearerBitmask()) << 1; 980 dpi.mtuV4 = dp.getMtuV4(); 981 dpi.mtuV6 = dp.getMtuV6(); 982 dpi.persistent = dp.isPersistent(); 983 dpi.preferred = dp.isPreferred(); 984 dpi.alwaysOn = false; 985 if (dp.getApnSetting() != null) { 986 dpi.alwaysOn = dp.getApnSetting().isAlwaysOn(); 987 } 988 dpi.trafficDescriptor = convertToHalTrafficDescriptorAidl(dp.getTrafficDescriptor()); 989 990 // profile id is only meaningful when it's persistent on the modem. 991 dpi.profileId = (dpi.persistent) ? dp.getProfileId() 992 : android.hardware.radio.data.DataProfileInfo.ID_INVALID; 993 994 return dpi; 995 } 996 997 /** 998 * Convert from DataProfileInfo.aidl to DataProfile 999 * @param dpi DataProfileInfo 1000 * @return The converted DataProfile 1001 */ convertToDataProfile( android.hardware.radio.data.DataProfileInfo dpi)1002 public static DataProfile convertToDataProfile( 1003 android.hardware.radio.data.DataProfileInfo dpi) { 1004 ApnSetting apnSetting = new ApnSetting.Builder() 1005 .setEntryName(dpi.apn) 1006 .setApnName(dpi.apn) 1007 .setApnTypeBitmask(dpi.supportedApnTypesBitmap) 1008 .setAuthType(dpi.authType) 1009 .setMaxConnsTime(dpi.maxConnsTime) 1010 .setMaxConns(dpi.maxConns) 1011 .setWaitTime(dpi.waitTime) 1012 .setCarrierEnabled(dpi.enabled) 1013 .setModemCognitive(dpi.persistent) 1014 .setMtuV4(dpi.mtuV4) 1015 .setMtuV6(dpi.mtuV6) 1016 .setNetworkTypeBitmask(ServiceState.convertBearerBitmaskToNetworkTypeBitmask( 1017 dpi.bearerBitmap) >> 1) 1018 .setProfileId(dpi.profileId) 1019 .setPassword(dpi.password) 1020 .setProtocol(dpi.protocol) 1021 .setRoamingProtocol(dpi.roamingProtocol) 1022 .setUser(dpi.user) 1023 .setAlwaysOn(dpi.alwaysOn) 1024 .build(); 1025 1026 TrafficDescriptor td; 1027 try { 1028 td = convertHalTrafficDescriptor(dpi.trafficDescriptor); 1029 } catch (IllegalArgumentException e) { 1030 loge("convertToDataProfile: Failed to convert traffic descriptor. e=" + e); 1031 td = null; 1032 } 1033 1034 return new DataProfile.Builder() 1035 .setType(dpi.type) 1036 .setPreferred(dpi.preferred) 1037 .setTrafficDescriptor(td) 1038 .setApnSetting(apnSetting) 1039 .build(); 1040 } 1041 1042 /** 1043 * Convert to OptionalSliceInfo defined in radio/1.6/types.hal 1044 * @param sliceInfo Slice info 1045 * @return The converted OptionalSliceInfo 1046 */ convertToHalSliceInfo( @ullable NetworkSliceInfo sliceInfo)1047 public static android.hardware.radio.V1_6.OptionalSliceInfo convertToHalSliceInfo( 1048 @Nullable NetworkSliceInfo sliceInfo) { 1049 android.hardware.radio.V1_6.OptionalSliceInfo optionalSliceInfo = 1050 new android.hardware.radio.V1_6.OptionalSliceInfo(); 1051 if (sliceInfo == null) { 1052 return optionalSliceInfo; 1053 } 1054 1055 android.hardware.radio.V1_6.SliceInfo si = new android.hardware.radio.V1_6.SliceInfo(); 1056 si.sst = (byte) sliceInfo.getSliceServiceType(); 1057 si.mappedHplmnSst = (byte) sliceInfo.getMappedHplmnSliceServiceType(); 1058 si.sliceDifferentiator = sliceInfo.getSliceDifferentiator(); 1059 si.mappedHplmnSD = sliceInfo.getMappedHplmnSliceDifferentiator(); 1060 optionalSliceInfo.value(si); 1061 return optionalSliceInfo; 1062 } 1063 1064 /** 1065 * Convert to SliceInfo.aidl 1066 * @param sliceInfo Slice info 1067 * @return The converted SliceInfo 1068 */ convertToHalSliceInfoAidl( @ullable NetworkSliceInfo sliceInfo)1069 public static android.hardware.radio.data.SliceInfo convertToHalSliceInfoAidl( 1070 @Nullable NetworkSliceInfo sliceInfo) { 1071 if (sliceInfo == null) { 1072 return null; 1073 } 1074 1075 android.hardware.radio.data.SliceInfo si = new android.hardware.radio.data.SliceInfo(); 1076 si.sliceServiceType = (byte) sliceInfo.getSliceServiceType(); 1077 si.mappedHplmnSst = (byte) sliceInfo.getMappedHplmnSliceServiceType(); 1078 si.sliceDifferentiator = sliceInfo.getSliceDifferentiator(); 1079 si.mappedHplmnSd = sliceInfo.getMappedHplmnSliceDifferentiator(); 1080 return si; 1081 } 1082 1083 /** 1084 * Convert to OptionalTrafficDescriptor defined in radio/1.6/types.hal 1085 * @param trafficDescriptor Traffic descriptor 1086 * @return The converted OptionalTrafficDescriptor 1087 */ 1088 public static android.hardware.radio.V1_6.OptionalTrafficDescriptor convertToHalTrafficDescriptor(@ullable TrafficDescriptor trafficDescriptor)1089 convertToHalTrafficDescriptor(@Nullable TrafficDescriptor trafficDescriptor) { 1090 android.hardware.radio.V1_6.OptionalTrafficDescriptor optionalTrafficDescriptor = 1091 new android.hardware.radio.V1_6.OptionalTrafficDescriptor(); 1092 if (trafficDescriptor == null) { 1093 return optionalTrafficDescriptor; 1094 } 1095 1096 android.hardware.radio.V1_6.TrafficDescriptor td = 1097 new android.hardware.radio.V1_6.TrafficDescriptor(); 1098 1099 android.hardware.radio.V1_6.OptionalDnn optionalDnn = 1100 new android.hardware.radio.V1_6.OptionalDnn(); 1101 if (trafficDescriptor.getDataNetworkName() != null) { 1102 optionalDnn.value(trafficDescriptor.getDataNetworkName()); 1103 } 1104 td.dnn = optionalDnn; 1105 1106 android.hardware.radio.V1_6.OptionalOsAppId optionalOsAppId = 1107 new android.hardware.radio.V1_6.OptionalOsAppId(); 1108 if (trafficDescriptor.getOsAppId() != null) { 1109 android.hardware.radio.V1_6.OsAppId osAppId = new android.hardware.radio.V1_6.OsAppId(); 1110 osAppId.osAppId = primitiveArrayToArrayList(trafficDescriptor.getOsAppId()); 1111 optionalOsAppId.value(osAppId); 1112 } 1113 td.osAppId = optionalOsAppId; 1114 1115 optionalTrafficDescriptor.value(td); 1116 return optionalTrafficDescriptor; 1117 } 1118 1119 /** 1120 * Convert to TrafficDescriptor.aidl 1121 * @param trafficDescriptor Traffic descriptor 1122 * @return The converted TrafficDescriptor 1123 */ 1124 public static android.hardware.radio.data.TrafficDescriptor convertToHalTrafficDescriptorAidl(@ullable TrafficDescriptor trafficDescriptor)1125 convertToHalTrafficDescriptorAidl(@Nullable TrafficDescriptor trafficDescriptor) { 1126 if (trafficDescriptor == null) { 1127 return new android.hardware.radio.data.TrafficDescriptor(); 1128 } 1129 1130 android.hardware.radio.data.TrafficDescriptor td = 1131 new android.hardware.radio.data.TrafficDescriptor(); 1132 td.dnn = trafficDescriptor.getDataNetworkName(); 1133 if (trafficDescriptor.getOsAppId() == null) { 1134 td.osAppId = null; 1135 } else { 1136 android.hardware.radio.data.OsAppId osAppId = new android.hardware.radio.data.OsAppId(); 1137 osAppId.osAppId = trafficDescriptor.getOsAppId(); 1138 td.osAppId = osAppId; 1139 } 1140 return td; 1141 } 1142 1143 /** 1144 * Convert to ResetNvType defined in radio/1.0/types.hal 1145 * @param resetType NV reset type 1146 * @return The converted reset type in integer or -1 if param is invalid 1147 */ convertToHalResetNvType(int resetType)1148 public static int convertToHalResetNvType(int resetType) { 1149 /** 1150 * resetType values 1151 * 1 - reload all NV items 1152 * 2 - erase NV reset (SCRTN) 1153 * 3 - factory reset (RTN) 1154 */ 1155 switch (resetType) { 1156 case 1: return android.hardware.radio.V1_0.ResetNvType.RELOAD; 1157 case 2: return android.hardware.radio.V1_0.ResetNvType.ERASE; 1158 case 3: return android.hardware.radio.V1_0.ResetNvType.FACTORY_RESET; 1159 } 1160 return -1; 1161 } 1162 1163 /** 1164 * Convert to ResetNvType.aidl 1165 * @param resetType NV reset type 1166 * @return The converted reset type in integer or -1 if param is invalid 1167 */ convertToHalResetNvTypeAidl(int resetType)1168 public static int convertToHalResetNvTypeAidl(int resetType) { 1169 /** 1170 * resetType values 1171 * 1 - reload all NV items 1172 * 2 - erase NV reset (SCRTN) 1173 * 3 - factory reset (RTN) 1174 */ 1175 switch (resetType) { 1176 case 1: return android.hardware.radio.modem.ResetNvType.RELOAD; 1177 case 2: return android.hardware.radio.modem.ResetNvType.ERASE; 1178 case 3: return android.hardware.radio.modem.ResetNvType.FACTORY_RESET; 1179 } 1180 return -1; 1181 } 1182 1183 /** 1184 * Convert to a list of LinkAddress defined in radio/1.5/types.hal 1185 * @param linkProperties Link properties 1186 * @return The converted list of LinkAddresses 1187 */ convertToHalLinkProperties15( LinkProperties linkProperties)1188 public static ArrayList<android.hardware.radio.V1_5.LinkAddress> convertToHalLinkProperties15( 1189 LinkProperties linkProperties) { 1190 ArrayList<android.hardware.radio.V1_5.LinkAddress> addresses15 = new ArrayList<>(); 1191 if (linkProperties != null) { 1192 for (android.net.LinkAddress la : linkProperties.getAllLinkAddresses()) { 1193 android.hardware.radio.V1_5.LinkAddress linkAddress = 1194 new android.hardware.radio.V1_5.LinkAddress(); 1195 linkAddress.address = la.getAddress().getHostAddress(); 1196 linkAddress.properties = la.getFlags(); 1197 linkAddress.deprecationTime = la.getDeprecationTime(); 1198 linkAddress.expirationTime = la.getExpirationTime(); 1199 addresses15.add(linkAddress); 1200 } 1201 } 1202 return addresses15; 1203 } 1204 1205 /** 1206 * Convert to a list of LinkAddress.aidl 1207 * @param linkProperties Link properties 1208 * @return The converted list of LinkAddresses 1209 */ convertToHalLinkProperties( LinkProperties linkProperties)1210 public static android.hardware.radio.data.LinkAddress[] convertToHalLinkProperties( 1211 LinkProperties linkProperties) { 1212 if (linkProperties == null) { 1213 return new android.hardware.radio.data.LinkAddress[0]; 1214 } 1215 android.hardware.radio.data.LinkAddress[] addresses = 1216 new android.hardware.radio.data.LinkAddress[ 1217 linkProperties.getAllLinkAddresses().size()]; 1218 for (int i = 0; i < linkProperties.getAllLinkAddresses().size(); i++) { 1219 LinkAddress la = linkProperties.getAllLinkAddresses().get(i); 1220 android.hardware.radio.data.LinkAddress linkAddress = 1221 new android.hardware.radio.data.LinkAddress(); 1222 linkAddress.address = la.getAddress().getHostAddress(); 1223 linkAddress.addressProperties = la.getFlags(); 1224 linkAddress.deprecationTime = la.getDeprecationTime(); 1225 linkAddress.expirationTime = la.getExpirationTime(); 1226 addresses[i] = linkAddress; 1227 } 1228 return addresses; 1229 } 1230 1231 /** 1232 * Convert RadioAccessSpecifier defined in radio/1.5/types.hal to RadioAccessSpecifier 1233 * @param specifier RadioAccessSpecifier defined in radio/1.5/types.hal 1234 * @return The converted RadioAccessSpecifier 1235 */ convertHalRadioAccessSpecifier( android.hardware.radio.V1_5.RadioAccessSpecifier specifier)1236 public static RadioAccessSpecifier convertHalRadioAccessSpecifier( 1237 android.hardware.radio.V1_5.RadioAccessSpecifier specifier) { 1238 if (specifier == null) return null; 1239 ArrayList<Integer> halBands = new ArrayList<>(); 1240 switch (specifier.bands.getDiscriminator()) { 1241 case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator 1242 .geranBands: 1243 halBands = specifier.bands.geranBands(); 1244 break; 1245 case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator 1246 .utranBands: 1247 halBands = specifier.bands.utranBands(); 1248 break; 1249 case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator 1250 .eutranBands: 1251 halBands = specifier.bands.eutranBands(); 1252 break; 1253 case android.hardware.radio.V1_5.RadioAccessSpecifier.Bands.hidl_discriminator 1254 .ngranBands: 1255 halBands = specifier.bands.ngranBands(); 1256 break; 1257 } 1258 return new RadioAccessSpecifier(convertHalRadioAccessNetworks(specifier.radioAccessNetwork), 1259 halBands.stream().mapToInt(Integer::intValue).toArray(), 1260 specifier.channels.stream().mapToInt(Integer::intValue).toArray()); 1261 } 1262 1263 /** 1264 * Convert RadioAccessSpecifier defined in RadioAccessSpecifier.aidl to RadioAccessSpecifier 1265 * @param specifier RadioAccessSpecifier defined in RadioAccessSpecifier.aidl 1266 * @return The converted RadioAccessSpecifier 1267 */ convertHalRadioAccessSpecifier( android.hardware.radio.network.RadioAccessSpecifier specifier)1268 public static RadioAccessSpecifier convertHalRadioAccessSpecifier( 1269 android.hardware.radio.network.RadioAccessSpecifier specifier) { 1270 if (specifier == null) return null; 1271 int[] halBands = null; 1272 switch (specifier.bands.getTag()) { 1273 case android.hardware.radio.network.RadioAccessSpecifierBands.geranBands: 1274 halBands = specifier.bands.getGeranBands(); 1275 break; 1276 case android.hardware.radio.network.RadioAccessSpecifierBands.utranBands: 1277 halBands = specifier.bands.getUtranBands(); 1278 break; 1279 case android.hardware.radio.network.RadioAccessSpecifierBands.eutranBands: 1280 halBands = specifier.bands.getEutranBands(); 1281 break; 1282 case android.hardware.radio.network.RadioAccessSpecifierBands.ngranBands: 1283 halBands = specifier.bands.getNgranBands(); 1284 break; 1285 } 1286 return new RadioAccessSpecifier(specifier.accessNetwork, halBands, specifier.channels); 1287 } 1288 1289 /** 1290 * Convert to RadioAccessSpecifier defined in radio/1.1/types.hal 1291 * @param ras Radio access specifier 1292 * @return The converted RadioAccessSpecifier 1293 */ 1294 public static android.hardware.radio.V1_1.RadioAccessSpecifier convertToHalRadioAccessSpecifier11(RadioAccessSpecifier ras)1295 convertToHalRadioAccessSpecifier11(RadioAccessSpecifier ras) { 1296 android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat = 1297 new android.hardware.radio.V1_1.RadioAccessSpecifier(); 1298 rasInHalFormat.radioAccessNetwork = ras.getRadioAccessNetwork(); 1299 ArrayList<Integer> bands = new ArrayList<>(); 1300 if (ras.getBands() != null) { 1301 for (int band : ras.getBands()) { 1302 bands.add(band); 1303 } 1304 } 1305 switch (ras.getRadioAccessNetwork()) { 1306 case AccessNetworkConstants.AccessNetworkType.GERAN: 1307 rasInHalFormat.geranBands = bands; 1308 break; 1309 case AccessNetworkConstants.AccessNetworkType.UTRAN: 1310 rasInHalFormat.utranBands = bands; 1311 break; 1312 case AccessNetworkConstants.AccessNetworkType.EUTRAN: 1313 rasInHalFormat.eutranBands = bands; 1314 break; 1315 default: 1316 return null; 1317 } 1318 1319 if (ras.getChannels() != null) { 1320 for (int channel : ras.getChannels()) { 1321 rasInHalFormat.channels.add(channel); 1322 } 1323 } 1324 1325 return rasInHalFormat; 1326 } 1327 1328 /** 1329 * Convert to RadioAccessSpecifier defined in radio/1.5/types.hal 1330 * @param ras Radio access specifier 1331 * @return The converted RadioAccessSpecifier 1332 */ 1333 public static android.hardware.radio.V1_5.RadioAccessSpecifier convertToHalRadioAccessSpecifier15(RadioAccessSpecifier ras)1334 convertToHalRadioAccessSpecifier15(RadioAccessSpecifier ras) { 1335 android.hardware.radio.V1_5.RadioAccessSpecifier rasInHalFormat = 1336 new android.hardware.radio.V1_5.RadioAccessSpecifier(); 1337 android.hardware.radio.V1_5.RadioAccessSpecifier.Bands bandsInHalFormat = 1338 new android.hardware.radio.V1_5.RadioAccessSpecifier.Bands(); 1339 rasInHalFormat.radioAccessNetwork = convertToHalRadioAccessNetworks( 1340 ras.getRadioAccessNetwork()); 1341 ArrayList<Integer> bands = new ArrayList<>(); 1342 if (ras.getBands() != null) { 1343 for (int band : ras.getBands()) { 1344 bands.add(band); 1345 } 1346 } 1347 switch (ras.getRadioAccessNetwork()) { 1348 case AccessNetworkConstants.AccessNetworkType.GERAN: 1349 bandsInHalFormat.geranBands(bands); 1350 break; 1351 case AccessNetworkConstants.AccessNetworkType.UTRAN: 1352 bandsInHalFormat.utranBands(bands); 1353 break; 1354 case AccessNetworkConstants.AccessNetworkType.EUTRAN: 1355 bandsInHalFormat.eutranBands(bands); 1356 break; 1357 case AccessNetworkConstants.AccessNetworkType.NGRAN: 1358 bandsInHalFormat.ngranBands(bands); 1359 break; 1360 default: 1361 return null; 1362 } 1363 rasInHalFormat.bands = bandsInHalFormat; 1364 1365 if (ras.getChannels() != null) { 1366 for (int channel : ras.getChannels()) { 1367 rasInHalFormat.channels.add(channel); 1368 } 1369 } 1370 1371 return rasInHalFormat; 1372 } 1373 1374 /** 1375 * Convert to RadioAccessSpecifier.aidl 1376 * @param ras Radio access specifier 1377 * @return The converted RadioAccessSpecifier 1378 */ 1379 public static android.hardware.radio.network.RadioAccessSpecifier convertToHalRadioAccessSpecifierAidl(RadioAccessSpecifier ras)1380 convertToHalRadioAccessSpecifierAidl(RadioAccessSpecifier ras) { 1381 android.hardware.radio.network.RadioAccessSpecifier rasInHalFormat = 1382 new android.hardware.radio.network.RadioAccessSpecifier(); 1383 android.hardware.radio.network.RadioAccessSpecifierBands bandsInHalFormat = 1384 new android.hardware.radio.network.RadioAccessSpecifierBands(); 1385 rasInHalFormat.accessNetwork = convertToHalAccessNetworkAidl(ras.getRadioAccessNetwork()); 1386 int[] bands; 1387 if (ras.getBands() != null) { 1388 bands = new int[ras.getBands().length]; 1389 for (int i = 0; i < ras.getBands().length; i++) { 1390 bands[i] = ras.getBands()[i]; 1391 } 1392 } else { 1393 bands = new int[0]; 1394 } 1395 switch (ras.getRadioAccessNetwork()) { 1396 case AccessNetworkConstants.AccessNetworkType.GERAN: 1397 bandsInHalFormat.setGeranBands(bands); 1398 break; 1399 case AccessNetworkConstants.AccessNetworkType.UTRAN: 1400 bandsInHalFormat.setUtranBands(bands); 1401 break; 1402 case AccessNetworkConstants.AccessNetworkType.EUTRAN: 1403 bandsInHalFormat.setEutranBands(bands); 1404 break; 1405 case AccessNetworkConstants.AccessNetworkType.NGRAN: 1406 bandsInHalFormat.setNgranBands(bands); 1407 break; 1408 default: 1409 return null; 1410 } 1411 rasInHalFormat.bands = bandsInHalFormat; 1412 1413 int[] channels; 1414 if (ras.getChannels() != null) { 1415 channels = new int[ras.getChannels().length]; 1416 for (int i = 0; i < ras.getChannels().length; i++) { 1417 channels[i] = ras.getChannels()[i]; 1418 } 1419 } else { 1420 channels = new int[0]; 1421 } 1422 rasInHalFormat.channels = channels; 1423 1424 return rasInHalFormat; 1425 } 1426 1427 /** 1428 * Convert to censored terminal response 1429 * @param terminalResponse Terminal response 1430 * @return The converted censored terminal response 1431 */ convertToCensoredTerminalResponse(String terminalResponse)1432 public static String convertToCensoredTerminalResponse(String terminalResponse) { 1433 try { 1434 byte[] bytes = IccUtils.hexStringToBytes(terminalResponse); 1435 if (bytes != null) { 1436 List<ComprehensionTlv> ctlvs = ComprehensionTlv.decodeMany(bytes, 0); 1437 int from = 0; 1438 for (ComprehensionTlv ctlv : ctlvs) { 1439 // Find text strings which might be personal information input by user, 1440 // then replace it with "********". 1441 if (ComprehensionTlvTag.TEXT_STRING.value() == ctlv.getTag()) { 1442 byte[] target = Arrays.copyOfRange(ctlv.getRawValue(), from, 1443 ctlv.getValueIndex() + ctlv.getLength()); 1444 terminalResponse = terminalResponse.toLowerCase().replace( 1445 IccUtils.bytesToHexString(target).toLowerCase(), "********"); 1446 } 1447 // The text string tag and the length field should also be hidden. 1448 from = ctlv.getValueIndex() + ctlv.getLength(); 1449 } 1450 } 1451 } catch (Exception e) { 1452 terminalResponse = null; 1453 } 1454 1455 return terminalResponse; 1456 } 1457 1458 /** 1459 * Convert to {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by 1460 * {@link android.telephony.Annotation.NetworkType}. 1461 * 1462 * @param raf {@link android.hardware.radio.V1_0.RadioAccessFamily} 1463 * @return {@link TelephonyManager.NetworkTypeBitMask} 1464 */ 1465 @TelephonyManager.NetworkTypeBitMask convertHalNetworkTypeBitMask(int raf)1466 public static int convertHalNetworkTypeBitMask(int raf) { 1467 int networkTypeRaf = 0; 1468 1469 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GSM) != 0) { 1470 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM; 1471 } 1472 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GPRS) != 0) { 1473 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS; 1474 } 1475 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EDGE) != 0) { 1476 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE; 1477 } 1478 // convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA 1479 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95A) != 0) { 1480 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; 1481 } 1482 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95B) != 0) { 1483 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; 1484 } 1485 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT) != 0) { 1486 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT; 1487 } 1488 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0) != 0) { 1489 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0; 1490 } 1491 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A) != 0) { 1492 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A; 1493 } 1494 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B) != 0) { 1495 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B; 1496 } 1497 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EHRPD) != 0) { 1498 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD; 1499 } 1500 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSUPA) != 0) { 1501 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA; 1502 } 1503 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSDPA) != 0) { 1504 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA; 1505 } 1506 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPA) != 0) { 1507 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA; 1508 } 1509 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPAP) != 0) { 1510 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP; 1511 } 1512 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.UMTS) != 0) { 1513 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS; 1514 } 1515 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA) != 0) { 1516 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA; 1517 } 1518 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE) != 0) { 1519 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE; 1520 } 1521 if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA) != 0) { 1522 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA; 1523 } 1524 if ((raf & android.hardware.radio.V1_4.RadioAccessFamily.NR) != 0) { 1525 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_NR; 1526 } 1527 if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) != 0) { 1528 networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN; 1529 } 1530 return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf; 1531 } 1532 1533 /** 1534 * Convert to RadioAccessFamily defined in radio/1.4/types.hal 1535 * @param networkTypeBitmask {@link TelephonyManager.NetworkTypeBitMask}, the bitmask 1536 * represented by {@link android.telephony.Annotation.NetworkType} 1537 * @return The converted RadioAccessFamily 1538 */ convertToHalRadioAccessFamily( @elephonyManager.NetworkTypeBitMask int networkTypeBitmask)1539 public static int convertToHalRadioAccessFamily( 1540 @TelephonyManager.NetworkTypeBitMask int networkTypeBitmask) { 1541 int raf = 0; 1542 1543 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GSM) != 0) { 1544 raf |= android.hardware.radio.V1_0.RadioAccessFamily.GSM; 1545 } 1546 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GPRS) != 0) { 1547 raf |= android.hardware.radio.V1_0.RadioAccessFamily.GPRS; 1548 } 1549 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EDGE) != 0) { 1550 raf |= android.hardware.radio.V1_0.RadioAccessFamily.EDGE; 1551 } 1552 // convert CDMA to IS95A, consistent with ServiceState.networkTypeToRilRadioTechnology 1553 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_CDMA) != 0) { 1554 raf |= android.hardware.radio.V1_0.RadioAccessFamily.IS95A; 1555 } 1556 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT) != 0) { 1557 raf |= android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT; 1558 } 1559 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0) != 0) { 1560 raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0; 1561 } 1562 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A) != 0) { 1563 raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A; 1564 } 1565 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B) != 0) { 1566 raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B; 1567 } 1568 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD) != 0) { 1569 raf |= android.hardware.radio.V1_0.RadioAccessFamily.EHRPD; 1570 } 1571 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA) != 0) { 1572 raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSUPA; 1573 } 1574 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA) != 0) { 1575 raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSDPA; 1576 } 1577 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPA) != 0) { 1578 raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPA; 1579 } 1580 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP) != 0) { 1581 raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPAP; 1582 } 1583 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_UMTS) != 0) { 1584 raf |= android.hardware.radio.V1_0.RadioAccessFamily.UMTS; 1585 } 1586 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA) != 0) { 1587 raf |= android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA; 1588 } 1589 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN) != 0) { 1590 raf |= (1 << android.hardware.radio.V1_4.RadioTechnology.IWLAN); 1591 } 1592 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE) != 0) { 1593 raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE; 1594 } 1595 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA) != 0) { 1596 raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA; 1597 } 1598 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0) { 1599 raf |= android.hardware.radio.V1_4.RadioAccessFamily.NR; 1600 } 1601 return (raf == 0) ? android.hardware.radio.V1_4.RadioAccessFamily.UNKNOWN : raf; 1602 } 1603 1604 /** 1605 * Convert to RadioAccessFamily.aidl 1606 * @param networkTypeBitmask {@link TelephonyManager.NetworkTypeBitMask}, the bitmask 1607 * represented by {@link android.telephony.Annotation.NetworkType} 1608 * @return The converted RadioAccessFamily 1609 */ convertToHalRadioAccessFamilyAidl( @elephonyManager.NetworkTypeBitMask int networkTypeBitmask)1610 public static int convertToHalRadioAccessFamilyAidl( 1611 @TelephonyManager.NetworkTypeBitMask int networkTypeBitmask) { 1612 int raf = 0; 1613 1614 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GSM) != 0) { 1615 raf |= android.hardware.radio.RadioAccessFamily.GSM; 1616 } 1617 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GPRS) != 0) { 1618 raf |= android.hardware.radio.RadioAccessFamily.GPRS; 1619 } 1620 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EDGE) != 0) { 1621 raf |= android.hardware.radio.RadioAccessFamily.EDGE; 1622 } 1623 // convert CDMA to IS95A, consistent with ServiceState.networkTypeToRilRadioTechnology 1624 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_CDMA) != 0) { 1625 raf |= android.hardware.radio.RadioAccessFamily.IS95A; 1626 } 1627 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT) != 0) { 1628 raf |= android.hardware.radio.RadioAccessFamily.ONE_X_RTT; 1629 } 1630 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0) != 0) { 1631 raf |= android.hardware.radio.RadioAccessFamily.EVDO_0; 1632 } 1633 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A) != 0) { 1634 raf |= android.hardware.radio.RadioAccessFamily.EVDO_A; 1635 } 1636 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B) != 0) { 1637 raf |= android.hardware.radio.RadioAccessFamily.EVDO_B; 1638 } 1639 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD) != 0) { 1640 raf |= android.hardware.radio.RadioAccessFamily.EHRPD; 1641 } 1642 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA) != 0) { 1643 raf |= android.hardware.radio.RadioAccessFamily.HSUPA; 1644 } 1645 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA) != 0) { 1646 raf |= android.hardware.radio.RadioAccessFamily.HSDPA; 1647 } 1648 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPA) != 0) { 1649 raf |= android.hardware.radio.RadioAccessFamily.HSPA; 1650 } 1651 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP) != 0) { 1652 raf |= android.hardware.radio.RadioAccessFamily.HSPAP; 1653 } 1654 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_UMTS) != 0) { 1655 raf |= android.hardware.radio.RadioAccessFamily.UMTS; 1656 } 1657 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA) != 0) { 1658 raf |= android.hardware.radio.RadioAccessFamily.TD_SCDMA; 1659 } 1660 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN) != 0) { 1661 raf |= android.hardware.radio.RadioAccessFamily.IWLAN; 1662 } 1663 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE) != 0) { 1664 raf |= android.hardware.radio.RadioAccessFamily.LTE; 1665 } 1666 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA) != 0) { 1667 raf |= android.hardware.radio.RadioAccessFamily.LTE_CA; 1668 } 1669 if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0) { 1670 raf |= android.hardware.radio.RadioAccessFamily.NR; 1671 } 1672 return (raf == 0) ? android.hardware.radio.RadioAccessFamily.UNKNOWN : raf; 1673 } 1674 1675 /** 1676 * Convert AccessNetworkType to AccessNetwork defined in radio/1.5/types.hal 1677 * @param accessNetworkType Access network type 1678 * @return The converted AccessNetwork 1679 */ convertToHalAccessNetwork(int accessNetworkType)1680 public static int convertToHalAccessNetwork(int accessNetworkType) { 1681 switch (accessNetworkType) { 1682 case AccessNetworkConstants.AccessNetworkType.GERAN: 1683 return android.hardware.radio.V1_5.AccessNetwork.GERAN; 1684 case AccessNetworkConstants.AccessNetworkType.UTRAN: 1685 return android.hardware.radio.V1_5.AccessNetwork.UTRAN; 1686 case AccessNetworkConstants.AccessNetworkType.EUTRAN: 1687 return android.hardware.radio.V1_5.AccessNetwork.EUTRAN; 1688 case AccessNetworkConstants.AccessNetworkType.CDMA2000: 1689 return android.hardware.radio.V1_5.AccessNetwork.CDMA2000; 1690 case AccessNetworkConstants.AccessNetworkType.IWLAN: 1691 return android.hardware.radio.V1_5.AccessNetwork.IWLAN; 1692 case AccessNetworkConstants.AccessNetworkType.NGRAN: 1693 return android.hardware.radio.V1_5.AccessNetwork.NGRAN; 1694 case AccessNetworkConstants.AccessNetworkType.UNKNOWN: 1695 default: 1696 return android.hardware.radio.V1_5.AccessNetwork.UNKNOWN; 1697 } 1698 } 1699 1700 /** 1701 * Convert to AccessNetwork.aidl 1702 * @param accessNetworkType Access network type 1703 * @return The converted AccessNetwork 1704 */ convertToHalAccessNetworkAidl(int accessNetworkType)1705 public static int convertToHalAccessNetworkAidl(int accessNetworkType) { 1706 switch (accessNetworkType) { 1707 case AccessNetworkConstants.AccessNetworkType.GERAN: 1708 return android.hardware.radio.AccessNetwork.GERAN; 1709 case AccessNetworkConstants.AccessNetworkType.UTRAN: 1710 return android.hardware.radio.AccessNetwork.UTRAN; 1711 case AccessNetworkConstants.AccessNetworkType.EUTRAN: 1712 return android.hardware.radio.AccessNetwork.EUTRAN; 1713 case AccessNetworkConstants.AccessNetworkType.CDMA2000: 1714 return android.hardware.radio.AccessNetwork.CDMA2000; 1715 case AccessNetworkConstants.AccessNetworkType.IWLAN: 1716 return android.hardware.radio.AccessNetwork.IWLAN; 1717 case AccessNetworkConstants.AccessNetworkType.NGRAN: 1718 return android.hardware.radio.AccessNetwork.NGRAN; 1719 case AccessNetworkConstants.AccessNetworkType.UNKNOWN: 1720 default: 1721 return android.hardware.radio.AccessNetwork.UNKNOWN; 1722 } 1723 } 1724 1725 /** 1726 * Convert to RadioAccessNetwork defined in radio/1.1/types.hal 1727 * @param accessNetworkType Access network type 1728 * @return The converted RadioAccessNetwork 1729 */ convertToHalRadioAccessNetworks(int accessNetworkType)1730 public static int convertToHalRadioAccessNetworks(int accessNetworkType) { 1731 switch (accessNetworkType) { 1732 case AccessNetworkConstants.AccessNetworkType.GERAN: 1733 return android.hardware.radio.V1_1.RadioAccessNetworks.GERAN; 1734 case AccessNetworkConstants.AccessNetworkType.UTRAN: 1735 return android.hardware.radio.V1_1.RadioAccessNetworks.UTRAN; 1736 case AccessNetworkConstants.AccessNetworkType.EUTRAN: 1737 return android.hardware.radio.V1_1.RadioAccessNetworks.EUTRAN; 1738 case AccessNetworkConstants.AccessNetworkType.NGRAN: 1739 return android.hardware.radio.V1_5.RadioAccessNetworks.NGRAN; 1740 case AccessNetworkConstants.AccessNetworkType.CDMA2000: 1741 return android.hardware.radio.V1_5.RadioAccessNetworks.CDMA2000; 1742 case AccessNetworkConstants.AccessNetworkType.UNKNOWN: 1743 default: 1744 return android.hardware.radio.V1_5.RadioAccessNetworks.UNKNOWN; 1745 } 1746 } 1747 1748 /** 1749 * Convert RadioAccessNetworks defined in radio/1.5/types.hal to AccessNetworkType 1750 * @param ran RadioAccessNetwork defined in radio/1.5/types.hal 1751 * @return The converted AccessNetworkType 1752 */ convertHalRadioAccessNetworks(int ran)1753 public static int convertHalRadioAccessNetworks(int ran) { 1754 switch (ran) { 1755 case android.hardware.radio.V1_5.RadioAccessNetworks.GERAN: 1756 return AccessNetworkConstants.AccessNetworkType.GERAN; 1757 case android.hardware.radio.V1_5.RadioAccessNetworks.UTRAN: 1758 return AccessNetworkConstants.AccessNetworkType.UTRAN; 1759 case android.hardware.radio.V1_5.RadioAccessNetworks.EUTRAN: 1760 return AccessNetworkConstants.AccessNetworkType.EUTRAN; 1761 case android.hardware.radio.V1_5.RadioAccessNetworks.NGRAN: 1762 return AccessNetworkConstants.AccessNetworkType.NGRAN; 1763 case android.hardware.radio.V1_5.RadioAccessNetworks.CDMA2000: 1764 return AccessNetworkConstants.AccessNetworkType.CDMA2000; 1765 case android.hardware.radio.V1_5.RadioAccessNetworks.UNKNOWN: 1766 default: 1767 return AccessNetworkConstants.AccessNetworkType.UNKNOWN; 1768 } 1769 } 1770 1771 /** 1772 * Convert to SimApdu defined in radio/1.0/types.hal 1773 * @param channel channel 1774 * @param cla cla 1775 * @param instruction instruction 1776 * @param p1 p1 1777 * @param p2 p2 1778 * @param p3 p3 1779 * @param data data 1780 * @return The converted SimApdu 1781 */ convertToHalSimApdu(int channel, int cla, int instruction, int p1, int p2, int p3, String data)1782 public static android.hardware.radio.V1_0.SimApdu convertToHalSimApdu(int channel, int cla, 1783 int instruction, int p1, int p2, int p3, String data) { 1784 android.hardware.radio.V1_0.SimApdu msg = new android.hardware.radio.V1_0.SimApdu(); 1785 msg.sessionId = channel; 1786 msg.cla = cla; 1787 msg.instruction = instruction; 1788 msg.p1 = p1; 1789 msg.p2 = p2; 1790 msg.p3 = p3; 1791 msg.data = convertNullToEmptyString(data); 1792 return msg; 1793 } 1794 1795 /** 1796 * Convert to SimApdu.aidl 1797 * @param channel channel 1798 * @param cla cla 1799 * @param instruction instruction 1800 * @param p1 p1 1801 * @param p2 p2 1802 * @param p3 p3 1803 * @param data data 1804 * @return The converted SimApdu 1805 */ convertToHalSimApduAidl(int channel, int cla, int instruction, int p1, int p2, int p3, String data)1806 public static android.hardware.radio.sim.SimApdu convertToHalSimApduAidl(int channel, int cla, 1807 int instruction, int p1, int p2, int p3, String data) { 1808 android.hardware.radio.sim.SimApdu msg = new android.hardware.radio.sim.SimApdu(); 1809 msg.sessionId = channel; 1810 msg.cla = cla; 1811 msg.instruction = instruction; 1812 msg.p1 = p1; 1813 msg.p2 = p2; 1814 msg.p3 = p3; 1815 msg.data = convertNullToEmptyString(data); 1816 return msg; 1817 } 1818 1819 /** 1820 * Convert to SimLockMultiSimPolicy defined in radio/1.4/types.hal 1821 * @param policy Multi SIM policy 1822 * @return The converted SimLockMultiSimPolicy 1823 */ convertToHalSimLockMultiSimPolicy(int policy)1824 public static int convertToHalSimLockMultiSimPolicy(int policy) { 1825 switch (policy) { 1826 case CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT: 1827 return android.hardware.radio.V1_4.SimLockMultiSimPolicy 1828 .ONE_VALID_SIM_MUST_BE_PRESENT; 1829 case CarrierRestrictionRules.MULTISIM_POLICY_NONE: 1830 // fallthrough 1831 default: 1832 return android.hardware.radio.V1_4.SimLockMultiSimPolicy.NO_MULTISIM_POLICY; 1833 1834 } 1835 } 1836 1837 /** 1838 * Convert to SimLockMultiSimPolicy.aidl 1839 * @param policy Multi SIM policy 1840 * @return The converted SimLockMultiSimPolicy 1841 */ convertToHalSimLockMultiSimPolicyAidl(int policy)1842 public static int convertToHalSimLockMultiSimPolicyAidl(int policy) { 1843 switch (policy) { 1844 case CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT: 1845 return android.hardware.radio.sim.SimLockMultiSimPolicy 1846 .ONE_VALID_SIM_MUST_BE_PRESENT; 1847 case CarrierRestrictionRules.MULTISIM_POLICY_NONE: 1848 // fallthrough 1849 default: 1850 return android.hardware.radio.sim.SimLockMultiSimPolicy.NO_MULTISIM_POLICY; 1851 1852 } 1853 } 1854 1855 /** 1856 * Convert a list of CarrierIdentifiers into a list of Carriers defined in radio/1.0/types.hal 1857 * @param carriers List of CarrierIdentifiers 1858 * @return The converted list of Carriers 1859 */ convertToHalCarrierRestrictionList( List<CarrierIdentifier> carriers)1860 public static ArrayList<android.hardware.radio.V1_0.Carrier> convertToHalCarrierRestrictionList( 1861 List<CarrierIdentifier> carriers) { 1862 ArrayList<android.hardware.radio.V1_0.Carrier> result = new ArrayList<>(); 1863 for (CarrierIdentifier ci : carriers) { 1864 android.hardware.radio.V1_0.Carrier c = new android.hardware.radio.V1_0.Carrier(); 1865 c.mcc = convertNullToEmptyString(ci.getMcc()); 1866 c.mnc = convertNullToEmptyString(ci.getMnc()); 1867 int matchType = CarrierIdentifier.MatchType.ALL; 1868 String matchData = null; 1869 if (!TextUtils.isEmpty(ci.getSpn())) { 1870 matchType = CarrierIdentifier.MatchType.SPN; 1871 matchData = ci.getSpn(); 1872 } else if (!TextUtils.isEmpty(ci.getImsi())) { 1873 matchType = CarrierIdentifier.MatchType.IMSI_PREFIX; 1874 matchData = ci.getImsi(); 1875 } else if (!TextUtils.isEmpty(ci.getGid1())) { 1876 matchType = CarrierIdentifier.MatchType.GID1; 1877 matchData = ci.getGid1(); 1878 } else if (!TextUtils.isEmpty(ci.getGid2())) { 1879 matchType = CarrierIdentifier.MatchType.GID2; 1880 matchData = ci.getGid2(); 1881 } 1882 c.matchType = matchType; 1883 c.matchData = convertNullToEmptyString(matchData); 1884 result.add(c); 1885 } 1886 return result; 1887 } 1888 1889 /** 1890 * Convert a list of CarrierIdentifiers into an array of Carrier.aidl 1891 * @param carriers List of CarrierIdentifiers 1892 * @return The converted array of Carriers 1893 */ convertToHalCarrierRestrictionListAidl( List<CarrierIdentifier> carriers)1894 public static android.hardware.radio.sim.Carrier[] convertToHalCarrierRestrictionListAidl( 1895 List<CarrierIdentifier> carriers) { 1896 android.hardware.radio.sim.Carrier[] result = 1897 new android.hardware.radio.sim.Carrier[carriers.size()]; 1898 for (int i = 0; i < carriers.size(); i++) { 1899 CarrierIdentifier ci = carriers.get(i); 1900 android.hardware.radio.sim.Carrier carrier = new android.hardware.radio.sim.Carrier(); 1901 carrier.mcc = convertNullToEmptyString(ci.getMcc()); 1902 carrier.mnc = convertNullToEmptyString(ci.getMnc()); 1903 int matchType = CarrierIdentifier.MatchType.ALL; 1904 String matchData = null; 1905 if (!TextUtils.isEmpty(ci.getSpn())) { 1906 matchType = CarrierIdentifier.MatchType.SPN; 1907 matchData = ci.getSpn(); 1908 } else if (!TextUtils.isEmpty(ci.getImsi())) { 1909 matchType = CarrierIdentifier.MatchType.IMSI_PREFIX; 1910 matchData = ci.getImsi(); 1911 } else if (!TextUtils.isEmpty(ci.getGid1())) { 1912 matchType = CarrierIdentifier.MatchType.GID1; 1913 matchData = ci.getGid1(); 1914 } else if (!TextUtils.isEmpty(ci.getGid2())) { 1915 matchType = CarrierIdentifier.MatchType.GID2; 1916 matchData = ci.getGid2(); 1917 } 1918 carrier.matchType = matchType; 1919 carrier.matchData = convertNullToEmptyString(matchData); 1920 result[i] = carrier; 1921 } 1922 return result; 1923 } 1924 1925 /** 1926 * Convert to Dial defined in radio/1.0/types.hal 1927 * @param address Address 1928 * @param clirMode CLIR mode 1929 * @param uusInfo UUS info 1930 * @return The converted Dial 1931 */ convertToHalDial(String address, int clirMode, UUSInfo uusInfo)1932 public static android.hardware.radio.V1_0.Dial convertToHalDial(String address, int clirMode, 1933 UUSInfo uusInfo) { 1934 android.hardware.radio.V1_0.Dial dial = new android.hardware.radio.V1_0.Dial(); 1935 dial.address = convertNullToEmptyString(address); 1936 dial.clir = clirMode; 1937 if (uusInfo != null) { 1938 android.hardware.radio.V1_0.UusInfo info = new android.hardware.radio.V1_0.UusInfo(); 1939 info.uusType = uusInfo.getType(); 1940 info.uusDcs = uusInfo.getDcs(); 1941 info.uusData = new String(uusInfo.getUserData()); 1942 dial.uusInfo.add(info); 1943 } 1944 return dial; 1945 } 1946 1947 /** 1948 * Convert to Dial.aidl 1949 * @param address Address 1950 * @param clirMode CLIR mode 1951 * @param uusInfo UUS info 1952 * @return The converted Dial.aidl 1953 */ convertToHalDialAidl(String address, int clirMode, UUSInfo uusInfo)1954 public static android.hardware.radio.voice.Dial convertToHalDialAidl(String address, 1955 int clirMode, UUSInfo uusInfo) { 1956 android.hardware.radio.voice.Dial dial = new android.hardware.radio.voice.Dial(); 1957 dial.address = convertNullToEmptyString(address); 1958 dial.clir = clirMode; 1959 if (uusInfo != null) { 1960 android.hardware.radio.voice.UusInfo info = new android.hardware.radio.voice.UusInfo(); 1961 info.uusType = uusInfo.getType(); 1962 info.uusDcs = uusInfo.getDcs(); 1963 info.uusData = new String(uusInfo.getUserData()); 1964 dial.uusInfo = new android.hardware.radio.voice.UusInfo[] {info}; 1965 } else { 1966 dial.uusInfo = new android.hardware.radio.voice.UusInfo[0]; 1967 } 1968 return dial; 1969 } 1970 1971 /** 1972 * Convert to SignalThresholdInfo defined in radio/1.5/types.hal 1973 * @param signalThresholdInfo Signal threshold info 1974 * @return The converted SignalThresholdInfo 1975 */ convertToHalSignalThresholdInfo( SignalThresholdInfo signalThresholdInfo)1976 public static android.hardware.radio.V1_5.SignalThresholdInfo convertToHalSignalThresholdInfo( 1977 SignalThresholdInfo signalThresholdInfo) { 1978 android.hardware.radio.V1_5.SignalThresholdInfo signalThresholdInfoHal = 1979 new android.hardware.radio.V1_5.SignalThresholdInfo(); 1980 signalThresholdInfoHal.signalMeasurement = signalThresholdInfo.getSignalMeasurementType(); 1981 signalThresholdInfoHal.hysteresisMs = signalThresholdInfo.getHysteresisMs(); 1982 signalThresholdInfoHal.hysteresisDb = signalThresholdInfo.getHysteresisDb(); 1983 signalThresholdInfoHal.thresholds = primitiveArrayToArrayList( 1984 signalThresholdInfo.getThresholds()); 1985 signalThresholdInfoHal.isEnabled = signalThresholdInfo.isEnabled(); 1986 return signalThresholdInfoHal; 1987 } 1988 1989 /** 1990 * Convert to SignalThresholdInfo.aidl 1991 * @param signalThresholdInfo Signal threshold info 1992 * @return The converted SignalThresholdInfo 1993 */ 1994 public static android.hardware.radio.network.SignalThresholdInfo convertToHalSignalThresholdInfoAidl(SignalThresholdInfo signalThresholdInfo)1995 convertToHalSignalThresholdInfoAidl(SignalThresholdInfo signalThresholdInfo) { 1996 android.hardware.radio.network.SignalThresholdInfo signalThresholdInfoHal = 1997 new android.hardware.radio.network.SignalThresholdInfo(); 1998 signalThresholdInfoHal.signalMeasurement = signalThresholdInfo.getSignalMeasurementType(); 1999 signalThresholdInfoHal.hysteresisMs = signalThresholdInfo.getHysteresisMs(); 2000 signalThresholdInfoHal.hysteresisDb = signalThresholdInfo.getHysteresisDb(); 2001 signalThresholdInfoHal.thresholds = signalThresholdInfo.getThresholds(); 2002 signalThresholdInfoHal.isEnabled = signalThresholdInfo.isEnabled(); 2003 signalThresholdInfoHal.ran = signalThresholdInfo.getRadioAccessNetworkType(); 2004 return signalThresholdInfoHal; 2005 } 2006 2007 /** 2008 * Convert to SmsWriteArgsStatus defined in radio/1.0/types.hal 2009 * @param status StatusOnIcc 2010 * @return The converted SmsWriteArgsStatus defined in radio/1.0/types.hal 2011 */ convertToHalSmsWriteArgsStatus(int status)2012 public static int convertToHalSmsWriteArgsStatus(int status) { 2013 switch (status & 0x7) { 2014 case SmsManager.STATUS_ON_ICC_READ: 2015 return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_READ; 2016 case SmsManager.STATUS_ON_ICC_UNREAD: 2017 return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_UNREAD; 2018 case SmsManager.STATUS_ON_ICC_SENT: 2019 return android.hardware.radio.V1_0.SmsWriteArgsStatus.STO_SENT; 2020 case SmsManager.STATUS_ON_ICC_UNSENT: 2021 return android.hardware.radio.V1_0.SmsWriteArgsStatus.STO_UNSENT; 2022 default: 2023 return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_READ; 2024 } 2025 } 2026 2027 /** 2028 * Convert to statuses defined in SmsWriteArgs.aidl 2029 * @param status StatusOnIcc 2030 * @return The converted statuses defined in SmsWriteArgs.aidl 2031 */ convertToHalSmsWriteArgsStatusAidl(int status)2032 public static int convertToHalSmsWriteArgsStatusAidl(int status) { 2033 switch (status & 0x7) { 2034 case SmsManager.STATUS_ON_ICC_READ: 2035 return android.hardware.radio.messaging.SmsWriteArgs.STATUS_REC_READ; 2036 case SmsManager.STATUS_ON_ICC_UNREAD: 2037 return android.hardware.radio.messaging.SmsWriteArgs.STATUS_REC_UNREAD; 2038 case SmsManager.STATUS_ON_ICC_SENT: 2039 return android.hardware.radio.messaging.SmsWriteArgs.STATUS_STO_SENT; 2040 case SmsManager.STATUS_ON_ICC_UNSENT: 2041 return android.hardware.radio.messaging.SmsWriteArgs.STATUS_STO_UNSENT; 2042 default: 2043 return android.hardware.radio.messaging.SmsWriteArgs.STATUS_REC_READ; 2044 } 2045 } 2046 2047 /** 2048 * Convert a list of HardwareConfig defined in radio/1.0/types.hal to a list of HardwareConfig 2049 * @param hwListRil List of HardwareConfig defined in radio/1.0/types.hal 2050 * @return The converted list of HardwareConfig 2051 */ convertHalHardwareConfigList( ArrayList<android.hardware.radio.V1_0.HardwareConfig> hwListRil)2052 public static ArrayList<HardwareConfig> convertHalHardwareConfigList( 2053 ArrayList<android.hardware.radio.V1_0.HardwareConfig> hwListRil) { 2054 int num; 2055 ArrayList<HardwareConfig> response; 2056 HardwareConfig hw; 2057 2058 num = hwListRil.size(); 2059 response = new ArrayList<>(num); 2060 2061 for (android.hardware.radio.V1_0.HardwareConfig hwRil : hwListRil) { 2062 int type = hwRil.type; 2063 switch(type) { 2064 case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: { 2065 hw = new HardwareConfig(type); 2066 android.hardware.radio.V1_0.HardwareConfigModem hwModem = hwRil.modem.get(0); 2067 hw.assignModem(hwRil.uuid, hwRil.state, hwModem.rilModel, hwModem.rat, 2068 hwModem.maxVoice, hwModem.maxData, hwModem.maxStandby); 2069 break; 2070 } 2071 case HardwareConfig.DEV_HARDWARE_TYPE_SIM: { 2072 hw = new HardwareConfig(type); 2073 hw.assignSim(hwRil.uuid, hwRil.state, hwRil.sim.get(0).modemUuid); 2074 break; 2075 } 2076 default: { 2077 throw new RuntimeException( 2078 "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardware type:" + type); 2079 } 2080 } 2081 response.add(hw); 2082 } 2083 return response; 2084 } 2085 2086 /** 2087 * Convert a list of HardwareConfig defined in HardwareConfig.aidl to a list of HardwareConfig 2088 * @param hwListRil List of HardwareConfig defined in HardwareConfig.aidl 2089 * @return The converted list of HardwareConfig 2090 */ convertHalHardwareConfigList( android.hardware.radio.modem.HardwareConfig[] hwListRil)2091 public static ArrayList<HardwareConfig> convertHalHardwareConfigList( 2092 android.hardware.radio.modem.HardwareConfig[] hwListRil) { 2093 ArrayList<HardwareConfig> response = new ArrayList<>(hwListRil.length); 2094 HardwareConfig hw; 2095 2096 for (android.hardware.radio.modem.HardwareConfig hwRil : hwListRil) { 2097 int type = hwRil.type; 2098 switch (type) { 2099 case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: { 2100 hw = new HardwareConfig(type); 2101 android.hardware.radio.modem.HardwareConfigModem hwModem = hwRil.modem[0]; 2102 hw.assignModem(hwRil.uuid, hwRil.state, hwModem.rilModel, hwModem.rat, 2103 hwModem.maxVoiceCalls, hwModem.maxDataCalls, hwModem.maxStandby); 2104 break; 2105 } 2106 case HardwareConfig.DEV_HARDWARE_TYPE_SIM: { 2107 hw = new HardwareConfig(type); 2108 hw.assignSim(hwRil.uuid, hwRil.state, hwRil.sim[0].modemUuid); 2109 break; 2110 } 2111 default: { 2112 throw new RuntimeException( 2113 "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardware type:" + type); 2114 } 2115 } 2116 response.add(hw); 2117 } 2118 return response; 2119 } 2120 2121 /** 2122 * Convert RadioCapability defined in radio/1.0/types.hal to RadioCapability 2123 * @param rc RadioCapability defined in radio/1.0/types.hal 2124 * @param ril RIL 2125 * @return The converted RadioCapability 2126 */ convertHalRadioCapability( android.hardware.radio.V1_0.RadioCapability rc, RIL ril)2127 public static RadioCapability convertHalRadioCapability( 2128 android.hardware.radio.V1_0.RadioCapability rc, RIL ril) { 2129 int session = rc.session; 2130 int phase = rc.phase; 2131 int rat = convertHalNetworkTypeBitMask(rc.raf); 2132 String logicModemUuid = rc.logicalModemUuid; 2133 int status = rc.status; 2134 2135 ril.riljLog("convertHalRadioCapability: session=" + session + ", phase=" + phase + ", rat=" 2136 + rat + ", logicModemUuid=" + logicModemUuid + ", status=" + status + ", rcRil.raf=" 2137 + rc.raf); 2138 return new RadioCapability(ril.mPhoneId, session, phase, rat, logicModemUuid, status); 2139 } 2140 2141 /** 2142 * Convert RadioCapability defined in RadioCapability.aidl to RadioCapability 2143 * @param rc RadioCapability defined in RadioCapability.aidl 2144 * @param ril RIL 2145 * @return The converted RadioCapability 2146 */ convertHalRadioCapability( android.hardware.radio.modem.RadioCapability rc, RIL ril)2147 public static RadioCapability convertHalRadioCapability( 2148 android.hardware.radio.modem.RadioCapability rc, RIL ril) { 2149 int session = rc.session; 2150 int phase = rc.phase; 2151 int rat = convertHalNetworkTypeBitMask(rc.raf); 2152 String logicModemUuid = rc.logicalModemUuid; 2153 int status = rc.status; 2154 2155 ril.riljLog("convertHalRadioCapability: session=" + session + ", phase=" + phase + ", rat=" 2156 + rat + ", logicModemUuid=" + logicModemUuid + ", status=" + status + ", rcRil.raf=" 2157 + rc.raf); 2158 return new RadioCapability(ril.mPhoneId, session, phase, rat, logicModemUuid, status); 2159 } 2160 2161 /** 2162 * Convert LceDataInfo defined in radio/1.0/types.hal and LinkCapacityEstimate defined in 2163 * radio/1.2, 1.6/types.hal to a list of LinkCapacityEstimates 2164 * @param lceObj LceDataInfo defined in radio/1.0/types.hal or LinkCapacityEstimate defined in 2165 * radio/1.2, 1.6/types.hal 2166 * @return The converted list of LinkCapacityEstimates 2167 */ convertHalLceData(Object lceObj)2168 public static List<LinkCapacityEstimate> convertHalLceData(Object lceObj) { 2169 final List<LinkCapacityEstimate> lceList = new ArrayList<>(); 2170 if (lceObj == null) return lceList; 2171 if (lceObj instanceof android.hardware.radio.V1_0.LceDataInfo) { 2172 android.hardware.radio.V1_0.LceDataInfo lce = 2173 (android.hardware.radio.V1_0.LceDataInfo) lceObj; 2174 lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED, 2175 lce.lastHopCapacityKbps, LinkCapacityEstimate.INVALID)); 2176 } else if (lceObj instanceof android.hardware.radio.V1_2.LinkCapacityEstimate) { 2177 android.hardware.radio.V1_2.LinkCapacityEstimate lce = 2178 (android.hardware.radio.V1_2.LinkCapacityEstimate) lceObj; 2179 lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED, 2180 lce.downlinkCapacityKbps, lce.uplinkCapacityKbps)); 2181 } else if (lceObj instanceof android.hardware.radio.V1_6.LinkCapacityEstimate) { 2182 android.hardware.radio.V1_6.LinkCapacityEstimate lce = 2183 (android.hardware.radio.V1_6.LinkCapacityEstimate) lceObj; 2184 int primaryDownlinkCapacityKbps = lce.downlinkCapacityKbps; 2185 int primaryUplinkCapacityKbps = lce.uplinkCapacityKbps; 2186 if (primaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID 2187 && lce.secondaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID) { 2188 primaryDownlinkCapacityKbps = 2189 lce.downlinkCapacityKbps - lce.secondaryDownlinkCapacityKbps; 2190 } 2191 if (primaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID 2192 && lce.secondaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID) { 2193 primaryUplinkCapacityKbps = 2194 lce.uplinkCapacityKbps - lce.secondaryUplinkCapacityKbps; 2195 } 2196 lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_PRIMARY, 2197 primaryDownlinkCapacityKbps, primaryUplinkCapacityKbps)); 2198 lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_SECONDARY, 2199 lce.secondaryDownlinkCapacityKbps, lce.secondaryUplinkCapacityKbps)); 2200 } 2201 return lceList; 2202 } 2203 2204 /** 2205 * Convert LceDataInfo defined in LceDataInfo.aidl to a list of LinkCapacityEstimates 2206 * @param lce LceDataInfo defined in LceDataInfo.aidl 2207 * @return The converted list of LinkCapacityEstimates 2208 */ convertHalLceData( android.hardware.radio.network.LceDataInfo lce)2209 public static List<LinkCapacityEstimate> convertHalLceData( 2210 android.hardware.radio.network.LceDataInfo lce) { 2211 final List<LinkCapacityEstimate> lceList = new ArrayList<>(); 2212 lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED, 2213 lce.lastHopCapacityKbps, LinkCapacityEstimate.INVALID)); 2214 return lceList; 2215 } 2216 2217 /** 2218 * Convert LinkCapacityEstimate defined in LinkCapacityEstimate.aidl to a list of 2219 * LinkCapacityEstimates 2220 * @param lce LinkCapacityEstimate defined in LinkCapacityEstimate.aidl 2221 * @return The converted list of LinkCapacityEstimates 2222 */ convertHalLceData( android.hardware.radio.network.LinkCapacityEstimate lce)2223 public static List<LinkCapacityEstimate> convertHalLceData( 2224 android.hardware.radio.network.LinkCapacityEstimate lce) { 2225 final List<LinkCapacityEstimate> lceList = new ArrayList<>(); 2226 int primaryDownlinkCapacityKbps = lce.downlinkCapacityKbps; 2227 int primaryUplinkCapacityKbps = lce.uplinkCapacityKbps; 2228 if (primaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID 2229 && lce.secondaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID) { 2230 primaryDownlinkCapacityKbps = 2231 lce.downlinkCapacityKbps - lce.secondaryDownlinkCapacityKbps; 2232 } 2233 if (primaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID 2234 && lce.secondaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID) { 2235 primaryUplinkCapacityKbps = 2236 lce.uplinkCapacityKbps - lce.secondaryUplinkCapacityKbps; 2237 } 2238 lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_PRIMARY, 2239 primaryDownlinkCapacityKbps, primaryUplinkCapacityKbps)); 2240 lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_SECONDARY, 2241 lce.secondaryDownlinkCapacityKbps, lce.secondaryUplinkCapacityKbps)); 2242 return lceList; 2243 } 2244 2245 2246 /** 2247 * Convert a list of CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal to a list of 2248 * CellInfos 2249 * @param records List of CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal 2250 * @return The converted list of CellInfos 2251 */ convertHalCellInfoList(ArrayList<Object> records)2252 public static ArrayList<CellInfo> convertHalCellInfoList(ArrayList<Object> records) { 2253 ArrayList<CellInfo> response = new ArrayList<>(records.size()); 2254 if (records.isEmpty()) return response; 2255 final long nanotime = SystemClock.elapsedRealtimeNanos(); 2256 for (Object obj : records) { 2257 response.add(convertHalCellInfo(obj, nanotime)); 2258 } 2259 return response; 2260 } 2261 2262 /** 2263 * Convert a list of CellInfo defined in CellInfo.aidl to a list of CellInfos 2264 * @param records List of CellInfo defined in CellInfo.aidl 2265 * @return The converted list of CellInfos 2266 */ convertHalCellInfoList( android.hardware.radio.network.CellInfo[] records)2267 public static ArrayList<CellInfo> convertHalCellInfoList( 2268 android.hardware.radio.network.CellInfo[] records) { 2269 ArrayList<CellInfo> response = new ArrayList<>(records.length); 2270 if (records.length == 0) return response; 2271 final long nanotime = SystemClock.elapsedRealtimeNanos(); 2272 for (android.hardware.radio.network.CellInfo ci : records) { 2273 response.add(convertHalCellInfo(ci, nanotime)); 2274 } 2275 return response; 2276 } 2277 2278 /** 2279 * Convert a CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal to CellInfo 2280 * @param cellInfo CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal 2281 * @param nanotime time the CellInfo was created 2282 * @return The converted CellInfo 2283 */ convertHalCellInfo(Object cellInfo, long nanotime)2284 private static CellInfo convertHalCellInfo(Object cellInfo, long nanotime) { 2285 if (cellInfo == null) return null; 2286 int type; 2287 int connectionStatus; 2288 boolean registered; 2289 CellIdentityGsm gsmCi = null; 2290 CellSignalStrengthGsm gsmSs = null; 2291 CellIdentityCdma cdmaCi = null; 2292 CellSignalStrengthCdma cdmaSs = null; 2293 CellIdentityLte lteCi = null; 2294 CellSignalStrengthLte lteSs = null; 2295 CellConfigLte lteCc = null; 2296 CellIdentityWcdma wcdmaCi = null; 2297 CellSignalStrengthWcdma wcdmaSs = null; 2298 CellIdentityTdscdma tdscdmaCi = null; 2299 CellSignalStrengthTdscdma tdscdmaSs = null; 2300 CellIdentityNr nrCi = null; 2301 CellSignalStrengthNr nrSs = null; 2302 if (cellInfo instanceof android.hardware.radio.V1_0.CellInfo) { 2303 final android.hardware.radio.V1_0.CellInfo record = 2304 (android.hardware.radio.V1_0.CellInfo) cellInfo; 2305 connectionStatus = CellInfo.CONNECTION_UNKNOWN; 2306 registered = record.registered; 2307 switch (record.cellInfoType) { 2308 case android.hardware.radio.V1_0.CellInfoType.GSM: 2309 type = CellInfo.TYPE_GSM; 2310 android.hardware.radio.V1_0.CellInfoGsm gsm = record.gsm.get(0); 2311 gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); 2312 gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); 2313 break; 2314 case android.hardware.radio.V1_0.CellInfoType.CDMA: 2315 type = CellInfo.TYPE_CDMA; 2316 android.hardware.radio.V1_0.CellInfoCdma cdma = record.cdma.get(0); 2317 cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); 2318 cdmaSs = convertHalCdmaSignalStrength( 2319 cdma.signalStrengthCdma, cdma.signalStrengthEvdo); 2320 break; 2321 case android.hardware.radio.V1_0.CellInfoType.LTE: 2322 type = CellInfo.TYPE_LTE; 2323 android.hardware.radio.V1_0.CellInfoLte lte = record.lte.get(0); 2324 lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); 2325 lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); 2326 lteCc = new CellConfigLte(); 2327 break; 2328 case android.hardware.radio.V1_0.CellInfoType.WCDMA: 2329 type = CellInfo.TYPE_WCDMA; 2330 android.hardware.radio.V1_0.CellInfoWcdma wcdma = record.wcdma.get(0); 2331 wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); 2332 wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); 2333 break; 2334 case android.hardware.radio.V1_0.CellInfoType.TD_SCDMA: 2335 type = CellInfo.TYPE_TDSCDMA; 2336 android.hardware.radio.V1_0.CellInfoTdscdma tdscdma = record.tdscdma.get(0); 2337 tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); 2338 tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); 2339 break; 2340 default: return null; 2341 } 2342 } else if (cellInfo instanceof android.hardware.radio.V1_2.CellInfo) { 2343 final android.hardware.radio.V1_2.CellInfo record = 2344 (android.hardware.radio.V1_2.CellInfo) cellInfo; 2345 connectionStatus = record.connectionStatus; 2346 registered = record.registered; 2347 switch(record.cellInfoType) { 2348 case android.hardware.radio.V1_0.CellInfoType.GSM: 2349 type = CellInfo.TYPE_GSM; 2350 android.hardware.radio.V1_2.CellInfoGsm gsm = record.gsm.get(0); 2351 gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); 2352 gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); 2353 break; 2354 case android.hardware.radio.V1_0.CellInfoType.CDMA: 2355 type = CellInfo.TYPE_CDMA; 2356 android.hardware.radio.V1_2.CellInfoCdma cdma = record.cdma.get(0); 2357 cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); 2358 cdmaSs = convertHalCdmaSignalStrength( 2359 cdma.signalStrengthCdma, cdma.signalStrengthEvdo); 2360 break; 2361 case android.hardware.radio.V1_0.CellInfoType.LTE: 2362 type = CellInfo.TYPE_LTE; 2363 android.hardware.radio.V1_2.CellInfoLte lte = record.lte.get(0); 2364 lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); 2365 lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); 2366 lteCc = new CellConfigLte(); 2367 break; 2368 case android.hardware.radio.V1_0.CellInfoType.WCDMA: 2369 type = CellInfo.TYPE_WCDMA; 2370 android.hardware.radio.V1_2.CellInfoWcdma wcdma = record.wcdma.get(0); 2371 wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); 2372 wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); 2373 break; 2374 case android.hardware.radio.V1_0.CellInfoType.TD_SCDMA: 2375 type = CellInfo.TYPE_TDSCDMA; 2376 android.hardware.radio.V1_2.CellInfoTdscdma tdscdma = record.tdscdma.get(0); 2377 tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); 2378 tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); 2379 break; 2380 default: return null; 2381 } 2382 } else if (cellInfo instanceof android.hardware.radio.V1_4.CellInfo) { 2383 final android.hardware.radio.V1_4.CellInfo record = 2384 (android.hardware.radio.V1_4.CellInfo) cellInfo; 2385 connectionStatus = record.connectionStatus; 2386 registered = record.isRegistered; 2387 switch (record.info.getDiscriminator()) { 2388 case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.gsm: 2389 type = CellInfo.TYPE_GSM; 2390 android.hardware.radio.V1_2.CellInfoGsm gsm = record.info.gsm(); 2391 gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); 2392 gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); 2393 break; 2394 case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.cdma: 2395 type = CellInfo.TYPE_CDMA; 2396 android.hardware.radio.V1_2.CellInfoCdma cdma = record.info.cdma(); 2397 cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); 2398 cdmaSs = convertHalCdmaSignalStrength( 2399 cdma.signalStrengthCdma, cdma.signalStrengthEvdo); 2400 break; 2401 case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.lte: 2402 type = CellInfo.TYPE_LTE; 2403 android.hardware.radio.V1_4.CellInfoLte lte = record.info.lte(); 2404 lteCi = convertHalCellIdentityLte(lte.base.cellIdentityLte); 2405 lteSs = convertHalLteSignalStrength(lte.base.signalStrengthLte); 2406 lteCc = new CellConfigLte(lte.cellConfig.isEndcAvailable); 2407 break; 2408 case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.wcdma: 2409 type = CellInfo.TYPE_WCDMA; 2410 android.hardware.radio.V1_2.CellInfoWcdma wcdma = record.info.wcdma(); 2411 wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); 2412 wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); 2413 break; 2414 case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.tdscdma: 2415 type = CellInfo.TYPE_TDSCDMA; 2416 android.hardware.radio.V1_2.CellInfoTdscdma tdscdma = record.info.tdscdma(); 2417 tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); 2418 tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); 2419 break; 2420 case android.hardware.radio.V1_4.CellInfo.Info.hidl_discriminator.nr: 2421 type = CellInfo.TYPE_NR; 2422 android.hardware.radio.V1_4.CellInfoNr nr = record.info.nr(); 2423 nrCi = convertHalCellIdentityNr(nr.cellidentity); 2424 nrSs = convertHalNrSignalStrength(nr.signalStrength); 2425 break; 2426 default: return null; 2427 } 2428 } else if (cellInfo instanceof android.hardware.radio.V1_5.CellInfo) { 2429 final android.hardware.radio.V1_5.CellInfo record = 2430 (android.hardware.radio.V1_5.CellInfo) cellInfo; 2431 connectionStatus = record.connectionStatus; 2432 registered = record.registered; 2433 switch (record.ratSpecificInfo.getDiscriminator()) { 2434 case android.hardware.radio.V1_5.CellInfo 2435 .CellInfoRatSpecificInfo.hidl_discriminator.gsm: 2436 type = CellInfo.TYPE_GSM; 2437 android.hardware.radio.V1_5.CellInfoGsm gsm = record.ratSpecificInfo.gsm(); 2438 gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); 2439 gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); 2440 break; 2441 case android.hardware.radio.V1_5.CellInfo 2442 .CellInfoRatSpecificInfo.hidl_discriminator.cdma: 2443 type = CellInfo.TYPE_CDMA; 2444 android.hardware.radio.V1_2.CellInfoCdma cdma = record.ratSpecificInfo.cdma(); 2445 cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); 2446 cdmaSs = convertHalCdmaSignalStrength( 2447 cdma.signalStrengthCdma, cdma.signalStrengthEvdo); 2448 break; 2449 case android.hardware.radio.V1_5.CellInfo 2450 .CellInfoRatSpecificInfo.hidl_discriminator.lte: 2451 type = CellInfo.TYPE_LTE; 2452 android.hardware.radio.V1_5.CellInfoLte lte = record.ratSpecificInfo.lte(); 2453 lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); 2454 lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); 2455 lteCc = new CellConfigLte(); 2456 break; 2457 case android.hardware.radio.V1_5.CellInfo 2458 .CellInfoRatSpecificInfo.hidl_discriminator.wcdma: 2459 type = CellInfo.TYPE_WCDMA; 2460 android.hardware.radio.V1_5.CellInfoWcdma wcdma = 2461 record.ratSpecificInfo.wcdma(); 2462 wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); 2463 wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); 2464 break; 2465 case android.hardware.radio.V1_5.CellInfo 2466 .CellInfoRatSpecificInfo.hidl_discriminator.tdscdma: 2467 type = CellInfo.TYPE_TDSCDMA; 2468 android.hardware.radio.V1_5.CellInfoTdscdma tdscdma = 2469 record.ratSpecificInfo.tdscdma(); 2470 tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); 2471 tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); 2472 break; 2473 case android.hardware.radio.V1_5.CellInfo 2474 .CellInfoRatSpecificInfo.hidl_discriminator.nr: 2475 type = CellInfo.TYPE_NR; 2476 android.hardware.radio.V1_5.CellInfoNr nr = record.ratSpecificInfo.nr(); 2477 nrCi = convertHalCellIdentityNr(nr.cellIdentityNr); 2478 nrSs = convertHalNrSignalStrength(nr.signalStrengthNr); 2479 break; 2480 default: return null; 2481 } 2482 } else if (cellInfo instanceof android.hardware.radio.V1_6.CellInfo) { 2483 final android.hardware.radio.V1_6.CellInfo record = 2484 (android.hardware.radio.V1_6.CellInfo) cellInfo; 2485 connectionStatus = record.connectionStatus; 2486 registered = record.registered; 2487 switch (record.ratSpecificInfo.getDiscriminator()) { 2488 case android.hardware.radio.V1_6.CellInfo 2489 .CellInfoRatSpecificInfo.hidl_discriminator.gsm: 2490 type = CellInfo.TYPE_GSM; 2491 android.hardware.radio.V1_5.CellInfoGsm gsm = record.ratSpecificInfo.gsm(); 2492 gsmCi = convertHalCellIdentityGsm(gsm.cellIdentityGsm); 2493 gsmSs = convertHalGsmSignalStrength(gsm.signalStrengthGsm); 2494 break; 2495 case android.hardware.radio.V1_6.CellInfo 2496 .CellInfoRatSpecificInfo.hidl_discriminator.cdma: 2497 type = CellInfo.TYPE_CDMA; 2498 android.hardware.radio.V1_2.CellInfoCdma cdma = record.ratSpecificInfo.cdma(); 2499 cdmaCi = convertHalCellIdentityCdma(cdma.cellIdentityCdma); 2500 cdmaSs = convertHalCdmaSignalStrength( 2501 cdma.signalStrengthCdma, cdma.signalStrengthEvdo); 2502 break; 2503 case android.hardware.radio.V1_6.CellInfo 2504 .CellInfoRatSpecificInfo.hidl_discriminator.lte: 2505 type = CellInfo.TYPE_LTE; 2506 android.hardware.radio.V1_6.CellInfoLte lte = record.ratSpecificInfo.lte(); 2507 lteCi = convertHalCellIdentityLte(lte.cellIdentityLte); 2508 lteSs = convertHalLteSignalStrength(lte.signalStrengthLte); 2509 lteCc = new CellConfigLte(); 2510 break; 2511 case android.hardware.radio.V1_6.CellInfo 2512 .CellInfoRatSpecificInfo.hidl_discriminator.wcdma: 2513 type = CellInfo.TYPE_WCDMA; 2514 android.hardware.radio.V1_5.CellInfoWcdma wcdma = 2515 record.ratSpecificInfo.wcdma(); 2516 wcdmaCi = convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma); 2517 wcdmaSs = convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma); 2518 break; 2519 case android.hardware.radio.V1_6.CellInfo 2520 .CellInfoRatSpecificInfo.hidl_discriminator.tdscdma: 2521 type = CellInfo.TYPE_TDSCDMA; 2522 android.hardware.radio.V1_5.CellInfoTdscdma tdscdma = 2523 record.ratSpecificInfo.tdscdma(); 2524 tdscdmaCi = convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma); 2525 tdscdmaSs = convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma); 2526 break; 2527 case android.hardware.radio.V1_6.CellInfo 2528 .CellInfoRatSpecificInfo.hidl_discriminator.nr: 2529 type = CellInfo.TYPE_NR; 2530 android.hardware.radio.V1_6.CellInfoNr nr = record.ratSpecificInfo.nr(); 2531 nrCi = convertHalCellIdentityNr(nr.cellIdentityNr); 2532 nrSs = convertHalNrSignalStrength(nr.signalStrengthNr); 2533 break; 2534 default: return null; 2535 } 2536 } else { 2537 return null; 2538 } 2539 2540 switch (type) { 2541 case CellInfo.TYPE_GSM: 2542 return new CellInfoGsm(connectionStatus, registered, nanotime, gsmCi, gsmSs); 2543 case CellInfo.TYPE_CDMA: 2544 return new CellInfoCdma(connectionStatus, registered, nanotime, cdmaCi, cdmaSs); 2545 case CellInfo.TYPE_LTE: 2546 return new CellInfoLte(connectionStatus, registered, nanotime, lteCi, lteSs, lteCc); 2547 case CellInfo.TYPE_WCDMA: 2548 return new CellInfoWcdma(connectionStatus, registered, nanotime, wcdmaCi, wcdmaSs); 2549 case CellInfo.TYPE_TDSCDMA: 2550 return new CellInfoTdscdma(connectionStatus, registered, nanotime, tdscdmaCi, 2551 tdscdmaSs); 2552 case CellInfo.TYPE_NR: 2553 return new CellInfoNr(connectionStatus, registered, nanotime, nrCi, nrSs); 2554 case CellInfo.TYPE_UNKNOWN: 2555 default: 2556 return null; 2557 } 2558 } 2559 2560 /** 2561 * Convert a CellInfo defined in CellInfo.aidl to CellInfo 2562 * @param cellInfo CellInfo defined in CellInfo.aidl 2563 * @param nanotime time the CellInfo was created 2564 * @return The converted CellInfo 2565 */ convertHalCellInfo(android.hardware.radio.network.CellInfo cellInfo, long nanotime)2566 private static CellInfo convertHalCellInfo(android.hardware.radio.network.CellInfo cellInfo, 2567 long nanotime) { 2568 if (cellInfo == null) return null; 2569 int connectionStatus = cellInfo.connectionStatus; 2570 boolean registered = cellInfo.registered; 2571 switch (cellInfo.ratSpecificInfo.getTag()) { 2572 case android.hardware.radio.network.CellInfoRatSpecificInfo.gsm: 2573 android.hardware.radio.network.CellInfoGsm gsm = cellInfo.ratSpecificInfo.getGsm(); 2574 return new CellInfoGsm(connectionStatus, registered, nanotime, 2575 convertHalCellIdentityGsm(gsm.cellIdentityGsm), 2576 convertHalGsmSignalStrength(gsm.signalStrengthGsm)); 2577 case android.hardware.radio.network.CellInfoRatSpecificInfo.cdma: 2578 android.hardware.radio.network.CellInfoCdma cdma = 2579 cellInfo.ratSpecificInfo.getCdma(); 2580 return new CellInfoCdma(connectionStatus, registered, nanotime, 2581 convertHalCellIdentityCdma(cdma.cellIdentityCdma), 2582 convertHalCdmaSignalStrength(cdma.signalStrengthCdma, 2583 cdma.signalStrengthEvdo)); 2584 case android.hardware.radio.network.CellInfoRatSpecificInfo.lte: 2585 android.hardware.radio.network.CellInfoLte lte = cellInfo.ratSpecificInfo.getLte(); 2586 return new CellInfoLte(connectionStatus, registered, nanotime, 2587 convertHalCellIdentityLte(lte.cellIdentityLte), 2588 convertHalLteSignalStrength(lte.signalStrengthLte), new CellConfigLte()); 2589 case android.hardware.radio.network.CellInfoRatSpecificInfo.wcdma: 2590 android.hardware.radio.network.CellInfoWcdma wcdma = 2591 cellInfo.ratSpecificInfo.getWcdma(); 2592 return new CellInfoWcdma(connectionStatus, registered, nanotime, 2593 convertHalCellIdentityWcdma(wcdma.cellIdentityWcdma), 2594 convertHalWcdmaSignalStrength(wcdma.signalStrengthWcdma)); 2595 case android.hardware.radio.network.CellInfoRatSpecificInfo.tdscdma: 2596 android.hardware.radio.network.CellInfoTdscdma tdscdma = 2597 cellInfo.ratSpecificInfo.getTdscdma(); 2598 return new CellInfoTdscdma(connectionStatus, registered, nanotime, 2599 convertHalCellIdentityTdscdma(tdscdma.cellIdentityTdscdma), 2600 convertHalTdscdmaSignalStrength(tdscdma.signalStrengthTdscdma)); 2601 case android.hardware.radio.network.CellInfoRatSpecificInfo.nr: 2602 android.hardware.radio.network.CellInfoNr nr = cellInfo.ratSpecificInfo.getNr(); 2603 return new CellInfoNr(connectionStatus, registered, nanotime, 2604 convertHalCellIdentityNr(nr.cellIdentityNr), 2605 convertHalNrSignalStrength(nr.signalStrengthNr)); 2606 default: 2607 return null; 2608 } 2609 } 2610 2611 /** 2612 * Convert a CellIdentity defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentity 2613 * @param halCi CellIdentity defined in radio/1.0, 1.2, 1.5/types.hal 2614 * @return The converted CellIdentity 2615 */ convertHalCellIdentity(Object halCi)2616 public static CellIdentity convertHalCellIdentity(Object halCi) { 2617 if (halCi == null) return null; 2618 if (halCi instanceof android.hardware.radio.V1_0.CellIdentity) { 2619 android.hardware.radio.V1_0.CellIdentity ci = 2620 (android.hardware.radio.V1_0.CellIdentity) halCi; 2621 switch (ci.cellInfoType) { 2622 case CellInfo.TYPE_GSM: 2623 if (ci.cellIdentityGsm.size() == 1) { 2624 return convertHalCellIdentityGsm(ci.cellIdentityGsm.get(0)); 2625 } 2626 break; 2627 case CellInfo.TYPE_CDMA: 2628 if (ci.cellIdentityCdma.size() == 1) { 2629 return convertHalCellIdentityCdma(ci.cellIdentityCdma.get(0)); 2630 } 2631 break; 2632 case CellInfo.TYPE_LTE: 2633 if (ci.cellIdentityLte.size() == 1) { 2634 return convertHalCellIdentityLte(ci.cellIdentityLte.get(0)); 2635 } 2636 break; 2637 case CellInfo.TYPE_WCDMA: 2638 if (ci.cellIdentityWcdma.size() == 1) { 2639 return convertHalCellIdentityWcdma(ci.cellIdentityWcdma.get(0)); 2640 } 2641 break; 2642 case CellInfo.TYPE_TDSCDMA: 2643 if (ci.cellIdentityTdscdma.size() == 1) { 2644 return convertHalCellIdentityTdscdma(ci.cellIdentityTdscdma.get(0)); 2645 } 2646 break; 2647 } 2648 } else if (halCi instanceof android.hardware.radio.V1_2.CellIdentity) { 2649 android.hardware.radio.V1_2.CellIdentity ci = 2650 (android.hardware.radio.V1_2.CellIdentity) halCi; 2651 switch (ci.cellInfoType) { 2652 case CellInfo.TYPE_GSM: 2653 if (ci.cellIdentityGsm.size() == 1) { 2654 return convertHalCellIdentityGsm(ci.cellIdentityGsm.get(0)); 2655 } 2656 break; 2657 case CellInfo.TYPE_CDMA: 2658 if (ci.cellIdentityCdma.size() == 1) { 2659 return convertHalCellIdentityCdma(ci.cellIdentityCdma.get(0)); 2660 } 2661 break; 2662 case CellInfo.TYPE_LTE: 2663 if (ci.cellIdentityLte.size() == 1) { 2664 return convertHalCellIdentityLte(ci.cellIdentityLte.get(0)); 2665 } 2666 break; 2667 case CellInfo.TYPE_WCDMA: 2668 if (ci.cellIdentityWcdma.size() == 1) { 2669 return convertHalCellIdentityWcdma(ci.cellIdentityWcdma.get(0)); 2670 } 2671 break; 2672 case CellInfo.TYPE_TDSCDMA: 2673 if (ci.cellIdentityTdscdma.size() == 1) { 2674 return convertHalCellIdentityTdscdma(ci.cellIdentityTdscdma.get(0)); 2675 } 2676 break; 2677 } 2678 } else if (halCi instanceof android.hardware.radio.V1_5.CellIdentity) { 2679 android.hardware.radio.V1_5.CellIdentity ci = 2680 (android.hardware.radio.V1_5.CellIdentity) halCi; 2681 switch (ci.getDiscriminator()) { 2682 case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.gsm: 2683 return convertHalCellIdentityGsm(ci.gsm()); 2684 case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.cdma: 2685 return convertHalCellIdentityCdma(ci.cdma()); 2686 case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.lte: 2687 return convertHalCellIdentityLte(ci.lte()); 2688 case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.wcdma: 2689 return convertHalCellIdentityWcdma(ci.wcdma()); 2690 case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.tdscdma: 2691 return convertHalCellIdentityTdscdma(ci.tdscdma()); 2692 case android.hardware.radio.V1_5.CellIdentity.hidl_discriminator.nr: 2693 return convertHalCellIdentityNr(ci.nr()); 2694 } 2695 } 2696 return null; 2697 } 2698 2699 /** 2700 * Convert a CellIdentity defined in CellIdentity.aidl to CellInfo 2701 * @param ci CellIdentity defined in CellIdentity.aidl 2702 * @return The converted CellIdentity 2703 */ convertHalCellIdentity( android.hardware.radio.network.CellIdentity ci)2704 public static CellIdentity convertHalCellIdentity( 2705 android.hardware.radio.network.CellIdentity ci) { 2706 if (ci == null) return null; 2707 switch (ci.getTag()) { 2708 case android.hardware.radio.network.CellIdentity.gsm: 2709 return convertHalCellIdentityGsm(ci.getGsm()); 2710 case android.hardware.radio.network.CellIdentity.cdma: 2711 return convertHalCellIdentityCdma(ci.getCdma()); 2712 case android.hardware.radio.network.CellIdentity.lte: 2713 return convertHalCellIdentityLte(ci.getLte()); 2714 case android.hardware.radio.network.CellIdentity.wcdma: 2715 return convertHalCellIdentityWcdma(ci.getWcdma()); 2716 case android.hardware.radio.network.CellIdentity.tdscdma: 2717 return convertHalCellIdentityTdscdma(ci.getTdscdma()); 2718 case android.hardware.radio.network.CellIdentity.nr: 2719 return convertHalCellIdentityNr(ci.getNr()); 2720 default: return null; 2721 } 2722 } 2723 2724 /** 2725 * Convert a CellIdentityGsm defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityGsm 2726 * @param gsm CellIdentityGsm defined in radio/1.0, 1.2, 1.5/types.hal 2727 * @return The converted CellIdentityGsm 2728 */ convertHalCellIdentityGsm(Object gsm)2729 public static CellIdentityGsm convertHalCellIdentityGsm(Object gsm) { 2730 if (gsm == null) return null; 2731 if (gsm instanceof android.hardware.radio.V1_0.CellIdentityGsm) { 2732 android.hardware.radio.V1_0.CellIdentityGsm ci = 2733 (android.hardware.radio.V1_0.CellIdentityGsm) gsm; 2734 return new CellIdentityGsm(ci.lac, ci.cid, ci.arfcn, 2735 ci.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE : ci.bsic, ci.mcc, ci.mnc, "", "", 2736 new ArraySet<>()); 2737 } else if (gsm instanceof android.hardware.radio.V1_2.CellIdentityGsm) { 2738 android.hardware.radio.V1_2.CellIdentityGsm ci = 2739 (android.hardware.radio.V1_2.CellIdentityGsm) gsm; 2740 return new CellIdentityGsm(ci.base.lac, ci.base.cid, ci.base.arfcn, 2741 ci.base.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE : ci.base.bsic, ci.base.mcc, 2742 ci.base.mnc, ci.operatorNames.alphaLong, ci.operatorNames.alphaShort, 2743 new ArraySet<>()); 2744 } else if (gsm instanceof android.hardware.radio.V1_5.CellIdentityGsm) { 2745 android.hardware.radio.V1_5.CellIdentityGsm ci = 2746 (android.hardware.radio.V1_5.CellIdentityGsm) gsm; 2747 return new CellIdentityGsm(ci.base.base.lac, ci.base.base.cid, ci.base.base.arfcn, 2748 ci.base.base.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE 2749 : ci.base.base.bsic, ci.base.base.mcc, ci.base.base.mnc, 2750 ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, 2751 ci.additionalPlmns); 2752 } else { 2753 return null; 2754 } 2755 } 2756 2757 /** 2758 * Convert a CellIdentityGsm defined in CellIdentityGsm.aidl to CellIdentityGsm 2759 * @param cid CellIdentityGsm defined in CellIdentityGsm.aidl 2760 * @return The converted CellIdentityGsm 2761 */ convertHalCellIdentityGsm( android.hardware.radio.network.CellIdentityGsm cid)2762 public static CellIdentityGsm convertHalCellIdentityGsm( 2763 android.hardware.radio.network.CellIdentityGsm cid) { 2764 return new CellIdentityGsm(cid.lac, cid.cid, cid.arfcn, 2765 cid.bsic == (byte) 0xFF ? CellInfo.UNAVAILABLE : cid.bsic, cid.mcc, cid.mnc, 2766 cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, new ArraySet<>()); 2767 } 2768 2769 /** 2770 * Convert a CellIdentityCdma defined in radio/1.0, 1.2/types.hal to CellIdentityCdma 2771 * @param cdma CellIdentityCdma defined in radio/1.0, 1.2/types.hal 2772 * @return The converted CellIdentityCdma 2773 */ convertHalCellIdentityCdma(Object cdma)2774 public static CellIdentityCdma convertHalCellIdentityCdma(Object cdma) { 2775 if (cdma == null) return null; 2776 if (cdma instanceof android.hardware.radio.V1_0.CellIdentityCdma) { 2777 android.hardware.radio.V1_0.CellIdentityCdma ci = 2778 (android.hardware.radio.V1_0.CellIdentityCdma) cdma; 2779 return new CellIdentityCdma(ci.networkId, ci.systemId, ci.baseStationId, ci.longitude, 2780 ci.latitude, "", ""); 2781 } else if (cdma instanceof android.hardware.radio.V1_2.CellIdentityCdma) { 2782 android.hardware.radio.V1_2.CellIdentityCdma ci = 2783 (android.hardware.radio.V1_2.CellIdentityCdma) cdma; 2784 return new CellIdentityCdma(ci.base.networkId, ci.base.systemId, ci.base.baseStationId, 2785 ci.base.longitude, ci.base.latitude, ci.operatorNames.alphaLong, 2786 ci.operatorNames.alphaShort); 2787 } else { 2788 return null; 2789 } 2790 } 2791 2792 /** 2793 * Convert a CellIdentityCdma defined in CellIdentityCdma.aidl to CellIdentityCdma 2794 * @param cid CellIdentityCdma defined in CelIdentityCdma.aidl 2795 * @return The converted CellIdentityCdma 2796 */ convertHalCellIdentityCdma( android.hardware.radio.network.CellIdentityCdma cid)2797 public static CellIdentityCdma convertHalCellIdentityCdma( 2798 android.hardware.radio.network.CellIdentityCdma cid) { 2799 return new CellIdentityCdma(cid.networkId, cid.systemId, cid.baseStationId, cid.longitude, 2800 cid.latitude, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort); 2801 } 2802 2803 /** 2804 * Convert a CellIdentityLte defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityLte 2805 * @param lte CellIdentityLte defined in radio/1.0, 1.2, 1.5/types.hal 2806 * @return The converted CellIdentityLte 2807 */ convertHalCellIdentityLte(Object lte)2808 public static CellIdentityLte convertHalCellIdentityLte(Object lte) { 2809 if (lte == null) return null; 2810 if (lte instanceof android.hardware.radio.V1_0.CellIdentityLte) { 2811 android.hardware.radio.V1_0.CellIdentityLte ci = 2812 (android.hardware.radio.V1_0.CellIdentityLte) lte; 2813 return new CellIdentityLte(ci.ci, ci.pci, ci.tac, ci.earfcn, new int[] {}, 2814 CellInfo.UNAVAILABLE, ci.mcc, ci.mnc, "", "", new ArraySet<>(), null); 2815 } else if (lte instanceof android.hardware.radio.V1_2.CellIdentityLte) { 2816 android.hardware.radio.V1_2.CellIdentityLte ci = 2817 (android.hardware.radio.V1_2.CellIdentityLte) lte; 2818 return new CellIdentityLte(ci.base.ci, ci.base.pci, ci.base.tac, ci.base.earfcn, 2819 new int[] {}, ci.bandwidth, ci.base.mcc, ci.base.mnc, 2820 ci.operatorNames.alphaLong, ci.operatorNames.alphaShort, new ArraySet<>(), 2821 null); 2822 } else if (lte instanceof android.hardware.radio.V1_5.CellIdentityLte) { 2823 android.hardware.radio.V1_5.CellIdentityLte ci = 2824 (android.hardware.radio.V1_5.CellIdentityLte) lte; 2825 return new CellIdentityLte(ci.base.base.ci, ci.base.base.pci, ci.base.base.tac, 2826 ci.base.base.earfcn, ci.bands.stream().mapToInt(Integer::intValue).toArray(), 2827 ci.base.bandwidth, ci.base.base.mcc, ci.base.base.mnc, 2828 ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, 2829 ci.additionalPlmns, convertHalClosedSubscriberGroupInfo(ci.optionalCsgInfo)); 2830 } else { 2831 return null; 2832 } 2833 } 2834 2835 /** 2836 * Convert a CellIdentityLte defined in CellIdentityLte.aidl to CellIdentityLte 2837 * @param cid CellIdentityLte defined in CellIdentityLte.aidl 2838 * @return The converted CellIdentityLte 2839 */ convertHalCellIdentityLte( android.hardware.radio.network.CellIdentityLte cid)2840 public static CellIdentityLte convertHalCellIdentityLte( 2841 android.hardware.radio.network.CellIdentityLte cid) { 2842 return new CellIdentityLte(cid.ci, cid.pci, cid.tac, cid.earfcn, cid.bands, cid.bandwidth, 2843 cid.mcc, cid.mnc, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, 2844 primitiveArrayToArrayList(cid.additionalPlmns), 2845 convertHalClosedSubscriberGroupInfo(cid.csgInfo)); 2846 } 2847 2848 /** 2849 * Convert a CellIdentityWcdma defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityWcdma 2850 * @param wcdma CellIdentityWcdma defined in radio/1.0, 1.2, 1.5/types.hal 2851 * @return The converted CellIdentityWcdma 2852 */ convertHalCellIdentityWcdma(Object wcdma)2853 public static CellIdentityWcdma convertHalCellIdentityWcdma(Object wcdma) { 2854 if (wcdma == null) return null; 2855 if (wcdma instanceof android.hardware.radio.V1_0.CellIdentityWcdma) { 2856 android.hardware.radio.V1_0.CellIdentityWcdma ci = 2857 (android.hardware.radio.V1_0.CellIdentityWcdma) wcdma; 2858 return new CellIdentityWcdma(ci.lac, ci.cid, ci.psc, ci.uarfcn, ci.mcc, ci.mnc, "", "", 2859 new ArraySet<>(), null); 2860 } else if (wcdma instanceof android.hardware.radio.V1_2.CellIdentityWcdma) { 2861 android.hardware.radio.V1_2.CellIdentityWcdma ci = 2862 (android.hardware.radio.V1_2.CellIdentityWcdma) wcdma; 2863 return new CellIdentityWcdma(ci.base.lac, ci.base.cid, ci.base.psc, ci.base.uarfcn, 2864 ci.base.mcc, ci.base.mnc, ci.operatorNames.alphaLong, 2865 ci.operatorNames.alphaShort, new ArraySet<>(), null); 2866 } else if (wcdma instanceof android.hardware.radio.V1_5.CellIdentityWcdma) { 2867 android.hardware.radio.V1_5.CellIdentityWcdma ci = 2868 (android.hardware.radio.V1_5.CellIdentityWcdma) wcdma; 2869 return new CellIdentityWcdma(ci.base.base.lac, ci.base.base.cid, ci.base.base.psc, 2870 ci.base.base.uarfcn, ci.base.base.mcc, ci.base.base.mnc, 2871 ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, 2872 ci.additionalPlmns, convertHalClosedSubscriberGroupInfo(ci.optionalCsgInfo)); 2873 } else { 2874 return null; 2875 } 2876 } 2877 2878 /** 2879 * Convert a CellIdentityWcdma defined in CellIdentityWcdma.aidl to CellIdentityWcdma 2880 * @param cid CellIdentityWcdma defined in CellIdentityWcdma.aidl 2881 * @return The converted CellIdentityWcdma 2882 */ convertHalCellIdentityWcdma( android.hardware.radio.network.CellIdentityWcdma cid)2883 public static CellIdentityWcdma convertHalCellIdentityWcdma( 2884 android.hardware.radio.network.CellIdentityWcdma cid) { 2885 return new CellIdentityWcdma(cid.lac, cid.cid, cid.psc, cid.uarfcn, cid.mcc, cid.mnc, 2886 cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, 2887 primitiveArrayToArrayList(cid.additionalPlmns), 2888 convertHalClosedSubscriberGroupInfo(cid.csgInfo)); 2889 } 2890 2891 /** 2892 * Convert a CellIdentityTdscdma defined in radio/1.0, 1.2, 1.5/types.hal to CellIdentityTdscdma 2893 * @param tdscdma CellIdentityTdscdma defined in radio/1.0, 1.2, 1.5/types.hal 2894 * @return The converted CellIdentityTdscdma 2895 */ convertHalCellIdentityTdscdma(Object tdscdma)2896 public static CellIdentityTdscdma convertHalCellIdentityTdscdma(Object tdscdma) { 2897 if (tdscdma == null) return null; 2898 if (tdscdma instanceof android.hardware.radio.V1_0.CellIdentityTdscdma) { 2899 android.hardware.radio.V1_0.CellIdentityTdscdma ci = 2900 (android.hardware.radio.V1_0.CellIdentityTdscdma) tdscdma; 2901 return new CellIdentityTdscdma(ci.mcc, ci.mnc, ci.lac, ci.cid, ci.cpid, 2902 CellInfo.UNAVAILABLE, "", "", Collections.emptyList(), null); 2903 } else if (tdscdma instanceof android.hardware.radio.V1_2.CellIdentityTdscdma) { 2904 android.hardware.radio.V1_2.CellIdentityTdscdma ci = 2905 (android.hardware.radio.V1_2.CellIdentityTdscdma) tdscdma; 2906 return new CellIdentityTdscdma(ci.base.mcc, ci.base.mnc, ci.base.lac, ci.base.cid, 2907 ci.base.cpid, ci.uarfcn, ci.operatorNames.alphaLong, 2908 ci.operatorNames.alphaShort, Collections.emptyList(), null); 2909 } else if (tdscdma instanceof android.hardware.radio.V1_5.CellIdentityTdscdma) { 2910 android.hardware.radio.V1_5.CellIdentityTdscdma ci = 2911 (android.hardware.radio.V1_5.CellIdentityTdscdma) tdscdma; 2912 return new CellIdentityTdscdma(ci.base.base.mcc, ci.base.base.mnc, ci.base.base.lac, 2913 ci.base.base.cid, ci.base.base.cpid, ci.base.uarfcn, 2914 ci.base.operatorNames.alphaLong, ci.base.operatorNames.alphaShort, 2915 ci.additionalPlmns, convertHalClosedSubscriberGroupInfo(ci.optionalCsgInfo)); 2916 } else { 2917 return null; 2918 } 2919 } 2920 2921 /** 2922 * Convert a CellIdentityTdscdma defined in CellIdentityTdscdma.aidl to CellIdentityTdscdma 2923 * @param cid CellIdentityTdscdma defined in radio/1.0, 1.2, 1.5/types.hal 2924 * @return The converted CellIdentityTdscdma 2925 */ convertHalCellIdentityTdscdma( android.hardware.radio.network.CellIdentityTdscdma cid)2926 public static CellIdentityTdscdma convertHalCellIdentityTdscdma( 2927 android.hardware.radio.network.CellIdentityTdscdma cid) { 2928 return new CellIdentityTdscdma(cid.mcc, cid.mnc, cid.lac, cid.cid, cid.cpid, cid.uarfcn, 2929 cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, 2930 primitiveArrayToArrayList(cid.additionalPlmns), 2931 convertHalClosedSubscriberGroupInfo(cid.csgInfo)); 2932 } 2933 2934 /** 2935 * Convert a CellIdentityNr defined in radio/1.4, 1.5/types.hal to CellIdentityNr 2936 * @param nr CellIdentityNr defined in radio/1.4 1.5/types.hal 2937 * @return The converted CellIdentityNr 2938 */ convertHalCellIdentityNr(Object nr)2939 public static CellIdentityNr convertHalCellIdentityNr(Object nr) { 2940 if (nr == null) return null; 2941 if (nr instanceof android.hardware.radio.V1_4.CellIdentityNr) { 2942 android.hardware.radio.V1_4.CellIdentityNr ci = 2943 (android.hardware.radio.V1_4.CellIdentityNr) nr; 2944 return new CellIdentityNr(ci.pci, ci.tac, ci.nrarfcn, new int[] {}, ci.mcc, ci.mnc, 2945 ci.nci, ci.operatorNames.alphaLong, ci.operatorNames.alphaShort, 2946 new ArraySet<>()); 2947 } else if (nr instanceof android.hardware.radio.V1_5.CellIdentityNr) { 2948 android.hardware.radio.V1_5.CellIdentityNr ci = 2949 (android.hardware.radio.V1_5.CellIdentityNr) nr; 2950 return new CellIdentityNr(ci.base.pci, ci.base.tac, ci.base.nrarfcn, 2951 ci.bands.stream().mapToInt(Integer::intValue).toArray(), ci.base.mcc, 2952 ci.base.mnc, ci.base.nci, ci.base.operatorNames.alphaLong, 2953 ci.base.operatorNames.alphaShort, ci.additionalPlmns); 2954 } else { 2955 return null; 2956 } 2957 } 2958 2959 /** 2960 * Convert a CellIdentityNr defined in CellIdentityNr.aidl to CellIdentityNr 2961 * @param cid CellIdentityNr defined in CellIdentityNr.aidl 2962 * @return The converted CellIdentityNr 2963 */ convertHalCellIdentityNr( android.hardware.radio.network.CellIdentityNr cid)2964 public static CellIdentityNr convertHalCellIdentityNr( 2965 android.hardware.radio.network.CellIdentityNr cid) { 2966 return new CellIdentityNr(cid.pci, cid.tac, cid.nrarfcn, cid.bands, cid.mcc, cid.mnc, 2967 cid.nci, cid.operatorNames.alphaLong, cid.operatorNames.alphaShort, 2968 primitiveArrayToArrayList(cid.additionalPlmns)); 2969 } 2970 2971 /** 2972 * Convert a SignalStrength defined in radio/1.0, 1.2, 1.4, 1.6/types.hal to SignalStrength 2973 * @param ss SignalStrength defined in radio/1.0, 1.2, 1.4, 1.6/types.hal 2974 * @return The converted SignalStrength 2975 */ convertHalSignalStrength(Object ss)2976 public static SignalStrength convertHalSignalStrength(Object ss) { 2977 if (ss == null) return null; 2978 if (ss instanceof android.hardware.radio.V1_0.SignalStrength) { 2979 android.hardware.radio.V1_0.SignalStrength signalStrength = 2980 (android.hardware.radio.V1_0.SignalStrength) ss; 2981 return new SignalStrength( 2982 convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), 2983 convertHalGsmSignalStrength(signalStrength.gw), new CellSignalStrengthWcdma(), 2984 convertHalTdscdmaSignalStrength(signalStrength.tdScdma), 2985 convertHalLteSignalStrength(signalStrength.lte), 2986 new CellSignalStrengthNr()); 2987 } else if (ss instanceof android.hardware.radio.V1_2.SignalStrength) { 2988 android.hardware.radio.V1_2.SignalStrength signalStrength = 2989 (android.hardware.radio.V1_2.SignalStrength) ss; 2990 return new SignalStrength( 2991 convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), 2992 convertHalGsmSignalStrength(signalStrength.gsm), 2993 convertHalWcdmaSignalStrength(signalStrength.wcdma), 2994 convertHalTdscdmaSignalStrength(signalStrength.tdScdma), 2995 convertHalLteSignalStrength(signalStrength.lte), new CellSignalStrengthNr()); 2996 } else if (ss instanceof android.hardware.radio.V1_4.SignalStrength) { 2997 android.hardware.radio.V1_4.SignalStrength signalStrength = 2998 (android.hardware.radio.V1_4.SignalStrength) ss; 2999 return new SignalStrength( 3000 convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), 3001 convertHalGsmSignalStrength(signalStrength.gsm), 3002 convertHalWcdmaSignalStrength(signalStrength.wcdma), 3003 convertHalTdscdmaSignalStrength(signalStrength.tdscdma), 3004 convertHalLteSignalStrength(signalStrength.lte), 3005 convertHalNrSignalStrength(signalStrength.nr)); 3006 } else if (ss instanceof android.hardware.radio.V1_6.SignalStrength) { 3007 android.hardware.radio.V1_6.SignalStrength signalStrength = 3008 (android.hardware.radio.V1_6.SignalStrength) ss; 3009 return new SignalStrength( 3010 convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), 3011 convertHalGsmSignalStrength(signalStrength.gsm), 3012 convertHalWcdmaSignalStrength(signalStrength.wcdma), 3013 convertHalTdscdmaSignalStrength(signalStrength.tdscdma), 3014 convertHalLteSignalStrength(signalStrength.lte), 3015 convertHalNrSignalStrength(signalStrength.nr)); 3016 } 3017 return null; 3018 } 3019 3020 /** 3021 * Convert a SignalStrength defined in SignalStrength.aidl to SignalStrength 3022 * @param signalStrength SignalStrength defined in SignalStrength.aidl 3023 * @return The converted SignalStrength 3024 */ convertHalSignalStrength( android.hardware.radio.network.SignalStrength signalStrength)3025 public static SignalStrength convertHalSignalStrength( 3026 android.hardware.radio.network.SignalStrength signalStrength) { 3027 return new SignalStrength( 3028 convertHalCdmaSignalStrength(signalStrength.cdma, signalStrength.evdo), 3029 convertHalGsmSignalStrength(signalStrength.gsm), 3030 convertHalWcdmaSignalStrength(signalStrength.wcdma), 3031 convertHalTdscdmaSignalStrength(signalStrength.tdscdma), 3032 convertHalLteSignalStrength(signalStrength.lte), 3033 convertHalNrSignalStrength(signalStrength.nr)); 3034 } 3035 3036 /** 3037 * Convert a GsmSignalStrength defined in radio/1.0/types.hal to CellSignalStrengthGsm 3038 * @param ss GsmSignalStrength defined in radio/1.0/types.hal 3039 * @return The converted CellSignalStrengthGsm 3040 */ convertHalGsmSignalStrength( android.hardware.radio.V1_0.GsmSignalStrength ss)3041 public static CellSignalStrengthGsm convertHalGsmSignalStrength( 3042 android.hardware.radio.V1_0.GsmSignalStrength ss) { 3043 CellSignalStrengthGsm ret = new CellSignalStrengthGsm( 3044 CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, 3045 ss.timingAdvance); 3046 if (ret.getRssi() == CellInfo.UNAVAILABLE) { 3047 ret.setDefaultValues(); 3048 ret.updateLevel(null, null); 3049 } 3050 return ret; 3051 } 3052 3053 /** 3054 * Convert a GsmSignalStrength defined in GsmSignalStrength.aidl to CellSignalStrengthGsm 3055 * @param ss GsmSignalStrength defined in GsmSignalStrength.aidl 3056 * @return The converted CellSignalStrengthGsm 3057 */ convertHalGsmSignalStrength( android.hardware.radio.network.GsmSignalStrength ss)3058 public static CellSignalStrengthGsm convertHalGsmSignalStrength( 3059 android.hardware.radio.network.GsmSignalStrength ss) { 3060 CellSignalStrengthGsm ret = new CellSignalStrengthGsm( 3061 CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, 3062 ss.timingAdvance); 3063 if (ret.getRssi() == CellInfo.UNAVAILABLE) { 3064 ret.setDefaultValues(); 3065 ret.updateLevel(null, null); 3066 } 3067 return ret; 3068 } 3069 3070 /** 3071 * Convert a CdmaSignalStrength and EvdoSignalStrength defined in radio/1.0/types.hal to 3072 * CellSignalStrengthCdma 3073 * @param cdma CdmaSignalStrength defined in radio/1.0/types.hal 3074 * @param evdo EvdoSignalStrength defined in radio/1.0/types.hal 3075 * @return The converted CellSignalStrengthCdma 3076 */ convertHalCdmaSignalStrength( android.hardware.radio.V1_0.CdmaSignalStrength cdma, android.hardware.radio.V1_0.EvdoSignalStrength evdo)3077 public static CellSignalStrengthCdma convertHalCdmaSignalStrength( 3078 android.hardware.radio.V1_0.CdmaSignalStrength cdma, 3079 android.hardware.radio.V1_0.EvdoSignalStrength evdo) { 3080 return new CellSignalStrengthCdma(-cdma.dbm, -cdma.ecio, -evdo.dbm, -evdo.ecio, 3081 evdo.signalNoiseRatio); 3082 } 3083 3084 /** 3085 * Convert a CdmaSignalStrength and EvdoSignalStrength defined in radio/network to 3086 * CellSignalStrengthCdma 3087 * @param cdma CdmaSignalStrength defined in CdmaSignalStrength.aidl 3088 * @param evdo EvdoSignalStrength defined in EvdoSignalStrength.aidl 3089 * @return The converted CellSignalStrengthCdma 3090 */ convertHalCdmaSignalStrength( android.hardware.radio.network.CdmaSignalStrength cdma, android.hardware.radio.network.EvdoSignalStrength evdo)3091 public static CellSignalStrengthCdma convertHalCdmaSignalStrength( 3092 android.hardware.radio.network.CdmaSignalStrength cdma, 3093 android.hardware.radio.network.EvdoSignalStrength evdo) { 3094 return new CellSignalStrengthCdma(-cdma.dbm, -cdma.ecio, -evdo.dbm, -evdo.ecio, 3095 evdo.signalNoiseRatio); 3096 } 3097 3098 /** 3099 * Convert a LteSignalStrength defined in radio/1.0, 1.6/types.hal to CellSignalStrengthLte 3100 * @param lte LteSignalStrength defined in radio/1.0, 1.6/types.hal 3101 * @return The converted CellSignalStrengthLte 3102 */ convertHalLteSignalStrength(Object lte)3103 public static CellSignalStrengthLte convertHalLteSignalStrength(Object lte) { 3104 if (lte == null) return null; 3105 if (lte instanceof android.hardware.radio.V1_0.LteSignalStrength) { 3106 android.hardware.radio.V1_0.LteSignalStrength ss = 3107 (android.hardware.radio.V1_0.LteSignalStrength) lte; 3108 return new CellSignalStrengthLte( 3109 CellSignalStrengthLte.convertRssiAsuToDBm(ss.signalStrength), 3110 ss.rsrp != CellInfo.UNAVAILABLE ? -ss.rsrp : ss.rsrp, 3111 ss.rsrq != CellInfo.UNAVAILABLE ? -ss.rsrq : ss.rsrq, 3112 CellSignalStrengthLte.convertRssnrUnitFromTenDbToDB(ss.rssnr), ss.cqi, 3113 ss.timingAdvance); 3114 } else if (lte instanceof android.hardware.radio.V1_6.LteSignalStrength) { 3115 android.hardware.radio.V1_6.LteSignalStrength ss = 3116 (android.hardware.radio.V1_6.LteSignalStrength) lte; 3117 return new CellSignalStrengthLte( 3118 CellSignalStrengthLte.convertRssiAsuToDBm(ss.base.signalStrength), 3119 ss.base.rsrp != CellInfo.UNAVAILABLE ? -ss.base.rsrp : ss.base.rsrp, 3120 ss.base.rsrq != CellInfo.UNAVAILABLE ? -ss.base.rsrq : ss.base.rsrq, 3121 CellSignalStrengthLte.convertRssnrUnitFromTenDbToDB(ss.base.rssnr), 3122 ss.cqiTableIndex, ss.base.cqi, ss.base.timingAdvance); 3123 } else { 3124 return null; 3125 } 3126 } 3127 3128 /** 3129 * Convert a LteSignalStrength defined in LteSignalStrength.aidl to CellSignalStrengthLte 3130 * @param ss LteSignalStrength defined in LteSignalStrength.aidl 3131 * @return The converted CellSignalStrengthLte 3132 */ convertHalLteSignalStrength( android.hardware.radio.network.LteSignalStrength ss)3133 public static CellSignalStrengthLte convertHalLteSignalStrength( 3134 android.hardware.radio.network.LteSignalStrength ss) { 3135 return new CellSignalStrengthLte( 3136 CellSignalStrengthLte.convertRssiAsuToDBm(ss.signalStrength), 3137 ss.rsrp != CellInfo.UNAVAILABLE ? -ss.rsrp : ss.rsrp, 3138 ss.rsrq != CellInfo.UNAVAILABLE ? -ss.rsrq : ss.rsrq, 3139 CellSignalStrengthLte.convertRssnrUnitFromTenDbToDB(ss.rssnr), ss.cqiTableIndex, 3140 ss.cqi, ss.timingAdvance); 3141 } 3142 3143 /** 3144 * Convert a WcdmaSignalStrength defined in radio/1.0, 1.2/types.hal to CellSignalStrengthWcdma 3145 * @param wcdma WcdmaSignalStrength defined in radio/1.0, 1.2/types.hal 3146 * @return The converted CellSignalStrengthWcdma 3147 */ convertHalWcdmaSignalStrength(Object wcdma)3148 public static CellSignalStrengthWcdma convertHalWcdmaSignalStrength(Object wcdma) { 3149 if (wcdma == null) return null; 3150 CellSignalStrengthWcdma ret = null; 3151 if (wcdma instanceof android.hardware.radio.V1_0.WcdmaSignalStrength) { 3152 android.hardware.radio.V1_0.WcdmaSignalStrength ss = 3153 (android.hardware.radio.V1_0.WcdmaSignalStrength) wcdma; 3154 ret = new CellSignalStrengthWcdma( 3155 CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, 3156 CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE); 3157 } else if (wcdma instanceof android.hardware.radio.V1_2.WcdmaSignalStrength) { 3158 android.hardware.radio.V1_2.WcdmaSignalStrength ss = 3159 (android.hardware.radio.V1_2.WcdmaSignalStrength) wcdma; 3160 ret = new CellSignalStrengthWcdma( 3161 CellSignalStrength.getRssiDbmFromAsu(ss.base.signalStrength), 3162 ss.base.bitErrorRate, CellSignalStrength.getRscpDbmFromAsu(ss.rscp), 3163 CellSignalStrength.getEcNoDbFromAsu(ss.ecno)); 3164 } 3165 if (ret != null && ret.getRssi() == CellInfo.UNAVAILABLE 3166 && ret.getRscp() == CellInfo.UNAVAILABLE) { 3167 ret.setDefaultValues(); 3168 ret.updateLevel(null, null); 3169 } 3170 return ret; 3171 } 3172 3173 /** 3174 * Convert a WcdmaSignalStrength defined in WcdmaSignalStrength.aidl to CellSignalStrengthWcdma 3175 * @param ss WcdmaSignalStrength defined in WcdmaSignalStrength.aidl 3176 * @return The converted CellSignalStrengthWcdma 3177 */ convertHalWcdmaSignalStrength( android.hardware.radio.network.WcdmaSignalStrength ss)3178 public static CellSignalStrengthWcdma convertHalWcdmaSignalStrength( 3179 android.hardware.radio.network.WcdmaSignalStrength ss) { 3180 CellSignalStrengthWcdma ret = new CellSignalStrengthWcdma( 3181 CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), 3182 ss.bitErrorRate, CellSignalStrength.getRscpDbmFromAsu(ss.rscp), 3183 CellSignalStrength.getEcNoDbFromAsu(ss.ecno)); 3184 if (ret.getRssi() == CellInfo.UNAVAILABLE && ret.getRscp() == CellInfo.UNAVAILABLE) { 3185 ret.setDefaultValues(); 3186 ret.updateLevel(null, null); 3187 } 3188 return ret; 3189 } 3190 3191 /** 3192 * Convert a TdScdmaSignalStrength defined in radio/1.0/types.hal or TdscdmaSignalStrength 3193 * defined in radio/1.2/types.hal to CellSignalStrengthTdscdma 3194 * @param tdscdma TdScdmaSignalStrength defined in radio/1.0/types.hal or TdscdmaSignalStrength 3195 * defined in radio/1.2/types.hal 3196 * @return The converted CellSignalStrengthTdscdma 3197 */ convertHalTdscdmaSignalStrength(Object tdscdma)3198 public static CellSignalStrengthTdscdma convertHalTdscdmaSignalStrength(Object tdscdma) { 3199 if (tdscdma == null) return null; 3200 CellSignalStrengthTdscdma ret = null; 3201 if (tdscdma instanceof android.hardware.radio.V1_0.TdScdmaSignalStrength) { 3202 android.hardware.radio.V1_0.TdScdmaSignalStrength ss = 3203 (android.hardware.radio.V1_0.TdScdmaSignalStrength) tdscdma; 3204 ret = new CellSignalStrengthTdscdma(CellInfo.UNAVAILABLE, CellInfo.UNAVAILABLE, 3205 ss.rscp != CellInfo.UNAVAILABLE ? -ss.rscp : ss.rscp); 3206 } else if (tdscdma instanceof android.hardware.radio.V1_2.TdscdmaSignalStrength) { 3207 android.hardware.radio.V1_2.TdscdmaSignalStrength ss = 3208 (android.hardware.radio.V1_2.TdscdmaSignalStrength) tdscdma; 3209 ret = new CellSignalStrengthTdscdma( 3210 CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), ss.bitErrorRate, 3211 CellSignalStrength.getRscpDbmFromAsu(ss.rscp)); 3212 } 3213 if (ret != null && ret.getRssi() == CellInfo.UNAVAILABLE 3214 && ret.getRscp() == CellInfo.UNAVAILABLE) { 3215 ret.setDefaultValues(); 3216 ret.updateLevel(null, null); 3217 } 3218 return ret; 3219 } 3220 3221 /** 3222 * Convert a TdscdmaSignalStrength defined in TdscdmaSignalStrength.aidl to 3223 * CellSignalStrengthTdscdma 3224 * @param ss TdscdmaSignalStrength defined in TdscdmaSignalStrength.aidl 3225 * @return The converted CellSignalStrengthTdscdma 3226 */ convertHalTdscdmaSignalStrength( android.hardware.radio.network.TdscdmaSignalStrength ss)3227 public static CellSignalStrengthTdscdma convertHalTdscdmaSignalStrength( 3228 android.hardware.radio.network.TdscdmaSignalStrength ss) { 3229 CellSignalStrengthTdscdma ret = new CellSignalStrengthTdscdma( 3230 CellSignalStrength.getRssiDbmFromAsu(ss.signalStrength), 3231 ss.bitErrorRate, CellSignalStrength.getRscpDbmFromAsu(ss.rscp)); 3232 if (ret.getRssi() == CellInfo.UNAVAILABLE && ret.getRscp() == CellInfo.UNAVAILABLE) { 3233 ret.setDefaultValues(); 3234 ret.updateLevel(null, null); 3235 } 3236 return ret; 3237 } 3238 3239 /** 3240 * Convert a NrSignalStrength defined in radio/1.4, 1.6/types.hal to CellSignalStrengthNr 3241 * @param nr NrSignalStrength defined in radio/1.4, 1.6/types.hal 3242 * @return The converted CellSignalStrengthNr 3243 */ convertHalNrSignalStrength(Object nr)3244 public static CellSignalStrengthNr convertHalNrSignalStrength(Object nr) { 3245 if (nr == null) return null; 3246 if (nr instanceof android.hardware.radio.V1_4.NrSignalStrength) { 3247 android.hardware.radio.V1_4.NrSignalStrength ss = 3248 (android.hardware.radio.V1_4.NrSignalStrength) nr; 3249 return new CellSignalStrengthNr(CellSignalStrengthNr.flip(ss.csiRsrp), 3250 CellSignalStrengthNr.flip(ss.csiRsrq), ss.csiSinr, 3251 CellSignalStrengthNr.flip(ss.ssRsrp), CellSignalStrengthNr.flip(ss.ssRsrq), 3252 ss.ssSinr); 3253 } else if (nr instanceof android.hardware.radio.V1_6.NrSignalStrength) { 3254 android.hardware.radio.V1_6.NrSignalStrength ss = 3255 (android.hardware.radio.V1_6.NrSignalStrength) nr; 3256 return new CellSignalStrengthNr(CellSignalStrengthNr.flip(ss.base.csiRsrp), 3257 CellSignalStrengthNr.flip(ss.base.csiRsrq), ss.base.csiSinr, 3258 ss.csiCqiTableIndex, ss.csiCqiReport, CellSignalStrengthNr.flip(ss.base.ssRsrp), 3259 CellSignalStrengthNr.flip(ss.base.ssRsrq), ss.base.ssSinr); 3260 } 3261 return null; 3262 } 3263 3264 /** 3265 * Convert a NrSignalStrength defined in NrSignalStrength.aidl to CellSignalStrengthNr 3266 * @param ss NrSignalStrength defined in NrSignalStrength.aidl 3267 * @return The converted CellSignalStrengthNr 3268 */ convertHalNrSignalStrength( android.hardware.radio.network.NrSignalStrength ss)3269 public static CellSignalStrengthNr convertHalNrSignalStrength( 3270 android.hardware.radio.network.NrSignalStrength ss) { 3271 return new CellSignalStrengthNr(CellSignalStrengthNr.flip(ss.csiRsrp), 3272 CellSignalStrengthNr.flip(ss.csiRsrq), ss.csiSinr, ss.csiCqiTableIndex, 3273 primitiveArrayToArrayList(ss.csiCqiReport), CellSignalStrengthNr.flip(ss.ssRsrp), 3274 CellSignalStrengthNr.flip(ss.ssRsrq), ss.ssSinr); 3275 } 3276 convertHalClosedSubscriberGroupInfo( android.hardware.radio.V1_5.OptionalCsgInfo optionalCsgInfo)3277 private static ClosedSubscriberGroupInfo convertHalClosedSubscriberGroupInfo( 3278 android.hardware.radio.V1_5.OptionalCsgInfo optionalCsgInfo) { 3279 android.hardware.radio.V1_5.ClosedSubscriberGroupInfo csgInfo = 3280 optionalCsgInfo.getDiscriminator() 3281 == android.hardware.radio.V1_5.OptionalCsgInfo.hidl_discriminator.csgInfo 3282 ? optionalCsgInfo.csgInfo() : null; 3283 if (csgInfo == null) return null; 3284 return new ClosedSubscriberGroupInfo(csgInfo.csgIndication, csgInfo.homeNodebName, 3285 csgInfo.csgIdentity); 3286 } 3287 convertHalClosedSubscriberGroupInfo( android.hardware.radio.network.ClosedSubscriberGroupInfo csgInfo)3288 private static ClosedSubscriberGroupInfo convertHalClosedSubscriberGroupInfo( 3289 android.hardware.radio.network.ClosedSubscriberGroupInfo csgInfo) { 3290 if (csgInfo == null) return null; 3291 return new ClosedSubscriberGroupInfo(csgInfo.csgIndication, csgInfo.homeNodebName, 3292 csgInfo.csgIdentity); 3293 } 3294 3295 /** 3296 * Convert a list of BarringInfo defined in radio/1.5/types.hal to a sparse array of 3297 * BarringServiceInfos 3298 * @param halBarringInfos List of BarringInfos defined in radio/1.5/types.hal 3299 * @return The converted sparse array of BarringServiceInfos 3300 */ convertHalBarringInfoList( List<android.hardware.radio.V1_5.BarringInfo> halBarringInfos)3301 public static SparseArray<BarringInfo.BarringServiceInfo> convertHalBarringInfoList( 3302 List<android.hardware.radio.V1_5.BarringInfo> halBarringInfos) { 3303 SparseArray<BarringInfo.BarringServiceInfo> serviceInfos = new SparseArray<>(); 3304 for (android.hardware.radio.V1_5.BarringInfo halBarringInfo : halBarringInfos) { 3305 if (halBarringInfo.barringType 3306 == android.hardware.radio.V1_5.BarringInfo.BarringType.CONDITIONAL) { 3307 if (halBarringInfo.barringTypeSpecificInfo.getDiscriminator() 3308 != android.hardware.radio.V1_5.BarringInfo.BarringTypeSpecificInfo 3309 .hidl_discriminator.conditional) { 3310 // this is an error case where the barring info is conditional but the 3311 // conditional barring fields weren't included 3312 continue; 3313 } 3314 android.hardware.radio.V1_5.BarringInfo.BarringTypeSpecificInfo 3315 .Conditional conditionalInfo = 3316 halBarringInfo.barringTypeSpecificInfo.conditional(); 3317 serviceInfos.put( 3318 halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( 3319 halBarringInfo.barringType, // will always be CONDITIONAL here 3320 conditionalInfo.isBarred, 3321 conditionalInfo.factor, 3322 conditionalInfo.timeSeconds)); 3323 } else { 3324 // Barring type is either NONE or UNCONDITIONAL 3325 serviceInfos.put( 3326 halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( 3327 halBarringInfo.barringType, false, 0, 0)); 3328 } 3329 } 3330 return serviceInfos; 3331 } 3332 3333 /** 3334 * Convert a list of BarringInfo defined in BarringInfo.aidl to a sparse array of 3335 * BarringServiceInfos 3336 * @param halBarringInfos List of BarringInfos defined in BarringInfo.aidl 3337 * @return The converted sparse array of BarringServiceInfos 3338 */ convertHalBarringInfoList( android.hardware.radio.network.BarringInfo[] halBarringInfos)3339 public static SparseArray<BarringInfo.BarringServiceInfo> convertHalBarringInfoList( 3340 android.hardware.radio.network.BarringInfo[] halBarringInfos) { 3341 SparseArray<BarringInfo.BarringServiceInfo> serviceInfos = new SparseArray<>(); 3342 for (android.hardware.radio.network.BarringInfo halBarringInfo : halBarringInfos) { 3343 if (halBarringInfo.barringType 3344 == android.hardware.radio.network.BarringInfo.BARRING_TYPE_CONDITIONAL) { 3345 if (halBarringInfo.barringTypeSpecificInfo == null) { 3346 // this is an error case where the barring info is conditional but the 3347 // conditional barring fields weren't included 3348 continue; 3349 } 3350 serviceInfos.put( 3351 halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( 3352 halBarringInfo.barringType, // will always be CONDITIONAL here 3353 halBarringInfo.barringTypeSpecificInfo.isBarred, 3354 halBarringInfo.barringTypeSpecificInfo.factor, 3355 halBarringInfo.barringTypeSpecificInfo.timeSeconds)); 3356 } else { 3357 // Barring type is either NONE or UNCONDITIONAL 3358 serviceInfos.put(halBarringInfo.serviceType, new BarringInfo.BarringServiceInfo( 3359 halBarringInfo.barringType, false, 0, 0)); 3360 } 3361 } 3362 return serviceInfos; 3363 } 3364 convertToLinkAddress(String addressString)3365 private static LinkAddress convertToLinkAddress(String addressString) { 3366 return convertToLinkAddress(addressString, 0, LinkAddress.LIFETIME_UNKNOWN, 3367 LinkAddress.LIFETIME_UNKNOWN); 3368 } 3369 convertToLinkAddress(String addressString, int properties, long deprecationTime, long expirationTime)3370 private static LinkAddress convertToLinkAddress(String addressString, int properties, 3371 long deprecationTime, long expirationTime) { 3372 addressString = addressString.trim(); 3373 InetAddress address = null; 3374 int prefixLength = -1; 3375 try { 3376 String[] pieces = addressString.split("/", 2); 3377 address = InetAddresses.parseNumericAddress(pieces[0]); 3378 if (pieces.length == 1) { 3379 prefixLength = (address instanceof Inet4Address) ? 32 : 128; 3380 } else if (pieces.length == 2) { 3381 prefixLength = Integer.parseInt(pieces[1]); 3382 } 3383 } catch (NullPointerException e) { // Null string. 3384 } catch (ArrayIndexOutOfBoundsException e) { // No prefix length. 3385 } catch (NumberFormatException e) { // Non-numeric prefix. 3386 } catch (IllegalArgumentException e) { // Invalid IP address. 3387 } 3388 3389 if (address == null || prefixLength == -1) { 3390 throw new IllegalArgumentException("Invalid link address " + addressString); 3391 } 3392 3393 return new LinkAddress(address, prefixLength, properties, 0, deprecationTime, 3394 expirationTime); 3395 } 3396 3397 /** 3398 * Convert SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal into 3399 * DataCallResponse 3400 * @param dcResult SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal 3401 * @return The converted DataCallResponse 3402 */ 3403 @VisibleForTesting convertHalDataCallResult(Object dcResult)3404 public static DataCallResponse convertHalDataCallResult(Object dcResult) { 3405 if (dcResult == null) return null; 3406 3407 int cause, cid, active, mtu, mtuV4, mtuV6; 3408 long suggestedRetryTime; 3409 String ifname; 3410 int protocolType; 3411 String[] addresses = null; 3412 String[] dnses = null; 3413 String[] gateways = null; 3414 String[] pcscfs = null; 3415 Qos defaultQos = null; 3416 @DataCallResponse.HandoverFailureMode 3417 int handoverFailureMode = DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY; 3418 int pduSessionId = DataCallResponse.PDU_SESSION_ID_NOT_SET; 3419 List<LinkAddress> laList = new ArrayList<>(); 3420 List<QosBearerSession> qosSessions = new ArrayList<>(); 3421 NetworkSliceInfo sliceInfo = null; 3422 List<TrafficDescriptor> trafficDescriptors = new ArrayList<>(); 3423 3424 if (dcResult instanceof android.hardware.radio.V1_0.SetupDataCallResult) { 3425 final android.hardware.radio.V1_0.SetupDataCallResult result = 3426 (android.hardware.radio.V1_0.SetupDataCallResult) dcResult; 3427 cause = result.status; 3428 suggestedRetryTime = result.suggestedRetryTime; 3429 cid = result.cid; 3430 active = result.active; 3431 protocolType = ApnSetting.getProtocolIntFromString(result.type); 3432 ifname = result.ifname; 3433 if (!TextUtils.isEmpty(result.addresses)) { 3434 addresses = result.addresses.split("\\s+"); 3435 } 3436 if (!TextUtils.isEmpty(result.dnses)) { 3437 dnses = result.dnses.split("\\s+"); 3438 } 3439 if (!TextUtils.isEmpty(result.gateways)) { 3440 gateways = result.gateways.split("\\s+"); 3441 } 3442 if (!TextUtils.isEmpty(result.pcscf)) { 3443 pcscfs = result.pcscf.split("\\s+"); 3444 } 3445 mtu = mtuV4 = mtuV6 = result.mtu; 3446 if (addresses != null) { 3447 for (String address : addresses) { 3448 laList.add(convertToLinkAddress(address)); 3449 } 3450 } 3451 } else if (dcResult instanceof android.hardware.radio.V1_4.SetupDataCallResult) { 3452 final android.hardware.radio.V1_4.SetupDataCallResult result = 3453 (android.hardware.radio.V1_4.SetupDataCallResult) dcResult; 3454 cause = result.cause; 3455 suggestedRetryTime = result.suggestedRetryTime; 3456 cid = result.cid; 3457 active = result.active; 3458 protocolType = result.type; 3459 ifname = result.ifname; 3460 addresses = result.addresses.toArray(new String[0]); 3461 dnses = result.dnses.toArray(new String[0]); 3462 gateways = result.gateways.toArray(new String[0]); 3463 pcscfs = result.pcscf.toArray(new String[0]); 3464 mtu = mtuV4 = mtuV6 = result.mtu; 3465 if (addresses != null) { 3466 for (String address : addresses) { 3467 laList.add(convertToLinkAddress(address)); 3468 } 3469 } 3470 } else if (dcResult instanceof android.hardware.radio.V1_5.SetupDataCallResult) { 3471 final android.hardware.radio.V1_5.SetupDataCallResult result = 3472 (android.hardware.radio.V1_5.SetupDataCallResult) dcResult; 3473 cause = result.cause; 3474 suggestedRetryTime = result.suggestedRetryTime; 3475 cid = result.cid; 3476 active = result.active; 3477 protocolType = result.type; 3478 ifname = result.ifname; 3479 laList = result.addresses.stream().map(la -> convertToLinkAddress( 3480 la.address, la.properties, la.deprecationTime, la.expirationTime)) 3481 .collect(Collectors.toList()); 3482 dnses = result.dnses.toArray(new String[0]); 3483 gateways = result.gateways.toArray(new String[0]); 3484 pcscfs = result.pcscf.toArray(new String[0]); 3485 mtu = Math.max(result.mtuV4, result.mtuV6); 3486 mtuV4 = result.mtuV4; 3487 mtuV6 = result.mtuV6; 3488 } else if (dcResult instanceof android.hardware.radio.V1_6.SetupDataCallResult) { 3489 final android.hardware.radio.V1_6.SetupDataCallResult result = 3490 (android.hardware.radio.V1_6.SetupDataCallResult) dcResult; 3491 cause = result.cause; 3492 suggestedRetryTime = result.suggestedRetryTime; 3493 cid = result.cid; 3494 active = result.active; 3495 protocolType = result.type; 3496 ifname = result.ifname; 3497 laList = result.addresses.stream().map(la -> convertToLinkAddress( 3498 la.address, la.properties, la.deprecationTime, la.expirationTime)) 3499 .collect(Collectors.toList()); 3500 dnses = result.dnses.toArray(new String[0]); 3501 gateways = result.gateways.toArray(new String[0]); 3502 pcscfs = result.pcscf.toArray(new String[0]); 3503 mtu = Math.max(result.mtuV4, result.mtuV6); 3504 mtuV4 = result.mtuV4; 3505 mtuV6 = result.mtuV6; 3506 handoverFailureMode = result.handoverFailureMode; 3507 pduSessionId = result.pduSessionId; 3508 defaultQos = convertHalQos(result.defaultQos); 3509 qosSessions = result.qosSessions.stream().map(RILUtils::convertHalQosBearerSession) 3510 .collect(Collectors.toList()); 3511 sliceInfo = result.sliceInfo.getDiscriminator() 3512 == android.hardware.radio.V1_6.OptionalSliceInfo.hidl_discriminator.noinit 3513 ? null : convertHalSliceInfo(result.sliceInfo.value()); 3514 for (android.hardware.radio.V1_6.TrafficDescriptor td : result.trafficDescriptors) { 3515 try { 3516 trafficDescriptors.add(RILUtils.convertHalTrafficDescriptor(td)); 3517 } catch (IllegalArgumentException e) { 3518 loge("convertHalDataCallResult: Failed to convert traffic descriptor. e=" + e); 3519 } 3520 } 3521 } else { 3522 loge("Unsupported SetupDataCallResult " + dcResult); 3523 return null; 3524 } 3525 3526 // Process dns 3527 List<InetAddress> dnsList = new ArrayList<>(); 3528 if (dnses != null) { 3529 for (String dns : dnses) { 3530 dns = dns.trim(); 3531 InetAddress ia; 3532 try { 3533 ia = InetAddresses.parseNumericAddress(dns); 3534 dnsList.add(ia); 3535 } catch (IllegalArgumentException e) { 3536 Rlog.e(TAG, "Unknown dns: " + dns, e); 3537 } 3538 } 3539 } 3540 3541 // Process gateway 3542 List<InetAddress> gatewayList = new ArrayList<>(); 3543 if (gateways != null) { 3544 for (String gateway : gateways) { 3545 gateway = gateway.trim(); 3546 InetAddress ia; 3547 try { 3548 ia = InetAddresses.parseNumericAddress(gateway); 3549 gatewayList.add(ia); 3550 } catch (IllegalArgumentException e) { 3551 Rlog.e(TAG, "Unknown gateway: " + gateway, e); 3552 } 3553 } 3554 } 3555 3556 // Process gateway 3557 List<InetAddress> pcscfList = new ArrayList<>(); 3558 if (pcscfs != null) { 3559 for (String pcscf : pcscfs) { 3560 pcscf = pcscf.trim(); 3561 InetAddress ia; 3562 try { 3563 ia = InetAddresses.parseNumericAddress(pcscf); 3564 pcscfList.add(ia); 3565 } catch (IllegalArgumentException e) { 3566 Rlog.e(TAG, "Unknown pcscf: " + pcscf, e); 3567 } 3568 } 3569 } 3570 3571 return new DataCallResponse.Builder() 3572 .setCause(cause) 3573 .setRetryDurationMillis(suggestedRetryTime) 3574 .setId(cid) 3575 .setLinkStatus(active) 3576 .setProtocolType(protocolType) 3577 .setInterfaceName(ifname) 3578 .setAddresses(laList) 3579 .setDnsAddresses(dnsList) 3580 .setGatewayAddresses(gatewayList) 3581 .setPcscfAddresses(pcscfList) 3582 .setMtu(mtu) 3583 .setMtuV4(mtuV4) 3584 .setMtuV6(mtuV6) 3585 .setHandoverFailureMode(handoverFailureMode) 3586 .setPduSessionId(pduSessionId) 3587 .setDefaultQos(defaultQos) 3588 .setQosBearerSessions(qosSessions) 3589 .setSliceInfo(sliceInfo) 3590 .setTrafficDescriptors(trafficDescriptors) 3591 .build(); 3592 } 3593 3594 /** 3595 * Convert SetupDataCallResult defined in SetupDataCallResult.aidl into DataCallResponse 3596 * @param result SetupDataCallResult defined in SetupDataCallResult.aidl 3597 * @return The converted DataCallResponse 3598 */ 3599 @VisibleForTesting convertHalDataCallResult( android.hardware.radio.data.SetupDataCallResult result)3600 public static DataCallResponse convertHalDataCallResult( 3601 android.hardware.radio.data.SetupDataCallResult result) { 3602 if (result == null) return null; 3603 List<LinkAddress> laList = new ArrayList<>(); 3604 for (android.hardware.radio.data.LinkAddress la : result.addresses) { 3605 laList.add(convertToLinkAddress(la.address, la.addressProperties, 3606 la.deprecationTime, la.expirationTime)); 3607 } 3608 List<InetAddress> dnsList = new ArrayList<>(); 3609 if (result.dnses != null) { 3610 for (String dns : result.dnses) { 3611 dns = dns.trim(); 3612 InetAddress ia; 3613 try { 3614 ia = InetAddresses.parseNumericAddress(dns); 3615 dnsList.add(ia); 3616 } catch (IllegalArgumentException e) { 3617 Rlog.e(TAG, "Unknown dns: " + dns, e); 3618 } 3619 } 3620 } 3621 List<InetAddress> gatewayList = new ArrayList<>(); 3622 if (result.gateways != null) { 3623 for (String gateway : result.gateways) { 3624 gateway = gateway.trim(); 3625 InetAddress ia; 3626 try { 3627 ia = InetAddresses.parseNumericAddress(gateway); 3628 gatewayList.add(ia); 3629 } catch (IllegalArgumentException e) { 3630 Rlog.e(TAG, "Unknown gateway: " + gateway, e); 3631 } 3632 } 3633 } 3634 List<InetAddress> pcscfList = new ArrayList<>(); 3635 if (result.pcscf != null) { 3636 for (String pcscf : result.pcscf) { 3637 pcscf = pcscf.trim(); 3638 InetAddress ia; 3639 try { 3640 ia = InetAddresses.parseNumericAddress(pcscf); 3641 pcscfList.add(ia); 3642 } catch (IllegalArgumentException e) { 3643 Rlog.e(TAG, "Unknown pcscf: " + pcscf, e); 3644 } 3645 } 3646 } 3647 List<QosBearerSession> qosSessions = new ArrayList<>(); 3648 for (android.hardware.radio.data.QosSession session : result.qosSessions) { 3649 qosSessions.add(convertHalQosBearerSession(session)); 3650 } 3651 List<TrafficDescriptor> trafficDescriptors = new ArrayList<>(); 3652 for (android.hardware.radio.data.TrafficDescriptor td : result.trafficDescriptors) { 3653 try { 3654 trafficDescriptors.add(convertHalTrafficDescriptor(td)); 3655 } catch (IllegalArgumentException e) { 3656 loge("convertHalDataCallResult: Failed to convert traffic descriptor. e=" + e); 3657 } 3658 } 3659 3660 return new DataCallResponse.Builder() 3661 .setCause(result.cause) 3662 .setRetryDurationMillis(result.suggestedRetryTime) 3663 .setId(result.cid) 3664 .setLinkStatus(result.active) 3665 .setProtocolType(result.type) 3666 .setInterfaceName(result.ifname) 3667 .setAddresses(laList) 3668 .setDnsAddresses(dnsList) 3669 .setGatewayAddresses(gatewayList) 3670 .setPcscfAddresses(pcscfList) 3671 .setMtu(Math.max(result.mtuV4, result.mtuV6)) 3672 .setMtuV4(result.mtuV4) 3673 .setMtuV6(result.mtuV6) 3674 .setHandoverFailureMode(result.handoverFailureMode) 3675 .setPduSessionId(result.pduSessionId) 3676 .setDefaultQos(convertHalQos(result.defaultQos)) 3677 .setQosBearerSessions(qosSessions) 3678 .setSliceInfo(result.sliceInfo == null ? null 3679 : convertHalSliceInfo(result.sliceInfo)) 3680 .setTrafficDescriptors(trafficDescriptors) 3681 .build(); 3682 } 3683 convertHalSliceInfo(android.hardware.radio.V1_6.SliceInfo si)3684 private static NetworkSliceInfo convertHalSliceInfo(android.hardware.radio.V1_6.SliceInfo si) { 3685 NetworkSliceInfo.Builder builder = new NetworkSliceInfo.Builder() 3686 .setSliceServiceType(si.sst) 3687 .setMappedHplmnSliceServiceType(si.mappedHplmnSst); 3688 if (si.sliceDifferentiator != NetworkSliceInfo.SLICE_DIFFERENTIATOR_NO_SLICE) { 3689 builder.setSliceDifferentiator(si.sliceDifferentiator) 3690 .setMappedHplmnSliceDifferentiator(si.mappedHplmnSD); 3691 } 3692 return builder.build(); 3693 } 3694 convertHalSliceInfo(android.hardware.radio.data.SliceInfo si)3695 private static NetworkSliceInfo convertHalSliceInfo(android.hardware.radio.data.SliceInfo si) { 3696 NetworkSliceInfo.Builder builder = new NetworkSliceInfo.Builder() 3697 .setSliceServiceType(si.sliceServiceType) 3698 .setMappedHplmnSliceServiceType(si.mappedHplmnSst); 3699 if (si.sliceDifferentiator != NetworkSliceInfo.SLICE_DIFFERENTIATOR_NO_SLICE) { 3700 builder.setSliceDifferentiator(si.sliceDifferentiator) 3701 .setMappedHplmnSliceDifferentiator(si.mappedHplmnSd); 3702 } 3703 return builder.build(); 3704 } 3705 convertHalTrafficDescriptor( android.hardware.radio.V1_6.TrafficDescriptor td)3706 private static TrafficDescriptor convertHalTrafficDescriptor( 3707 android.hardware.radio.V1_6.TrafficDescriptor td) throws IllegalArgumentException { 3708 String dnn = td.dnn.getDiscriminator() 3709 == android.hardware.radio.V1_6.OptionalDnn.hidl_discriminator.noinit 3710 ? null : td.dnn.value(); 3711 byte[] osAppId = td.osAppId.getDiscriminator() 3712 == android.hardware.radio.V1_6.OptionalOsAppId.hidl_discriminator.noinit 3713 ? null : arrayListToPrimitiveArray(td.osAppId.value().osAppId); 3714 3715 TrafficDescriptor.Builder builder = new TrafficDescriptor.Builder(); 3716 if (dnn != null) { 3717 builder.setDataNetworkName(dnn); 3718 } 3719 if (osAppId != null) { 3720 builder.setOsAppId(osAppId); 3721 } 3722 return builder.build(); 3723 } 3724 convertHalTrafficDescriptor( android.hardware.radio.data.TrafficDescriptor td)3725 private static TrafficDescriptor convertHalTrafficDescriptor( 3726 android.hardware.radio.data.TrafficDescriptor td) throws IllegalArgumentException { 3727 String dnn = td.dnn; 3728 byte[] osAppId = td.osAppId == null ? null : td.osAppId.osAppId; 3729 TrafficDescriptor.Builder builder = new TrafficDescriptor.Builder(); 3730 if (dnn != null) { 3731 builder.setDataNetworkName(dnn); 3732 } 3733 if (osAppId != null) { 3734 builder.setOsAppId(osAppId); 3735 } 3736 return builder.build(); 3737 } 3738 3739 /** 3740 * Convert SlicingConfig defined in radio/1.6/types.hal to NetworkSlicingConfig 3741 * @param sc SlicingConfig defined in radio/1.6/types.hal 3742 * @return The converted NetworkSlicingConfig 3743 */ convertHalSlicingConfig( android.hardware.radio.V1_6.SlicingConfig sc)3744 public static NetworkSlicingConfig convertHalSlicingConfig( 3745 android.hardware.radio.V1_6.SlicingConfig sc) { 3746 List<UrspRule> urspRules = sc.urspRules.stream().map(ur -> new UrspRule(ur.precedence, 3747 ur.trafficDescriptors.stream() 3748 .map(td -> { 3749 try { 3750 return convertHalTrafficDescriptor(td); 3751 } catch (IllegalArgumentException e) { 3752 loge("convertHalSlicingConfig: Failed to convert traffic descriptor" 3753 + ". e=" + e); 3754 return null; 3755 } 3756 }) 3757 .filter(Objects::nonNull) 3758 .collect(Collectors.toList()), 3759 ur.routeSelectionDescriptor.stream().map(rsd -> new RouteSelectionDescriptor( 3760 rsd.precedence, rsd.sessionType.value(), rsd.sscMode.value(), 3761 rsd.sliceInfo.stream().map(RILUtils::convertHalSliceInfo) 3762 .collect(Collectors.toList()), 3763 rsd.dnn)).collect(Collectors.toList()))) 3764 .collect(Collectors.toList()); 3765 return new NetworkSlicingConfig(urspRules, sc.sliceInfo.stream() 3766 .map(RILUtils::convertHalSliceInfo).collect(Collectors.toList())); 3767 } 3768 3769 /** 3770 * Convert SlicingConfig defined in SlicingConfig.aidl to NetworkSlicingConfig 3771 * @param sc SlicingConfig defined in SlicingConfig.aidl 3772 * @return The converted NetworkSlicingConfig 3773 */ convertHalSlicingConfig( android.hardware.radio.data.SlicingConfig sc)3774 public static NetworkSlicingConfig convertHalSlicingConfig( 3775 android.hardware.radio.data.SlicingConfig sc) { 3776 List<UrspRule> urspRules = new ArrayList<>(); 3777 for (android.hardware.radio.data.UrspRule ur : sc.urspRules) { 3778 List<TrafficDescriptor> tds = new ArrayList<>(); 3779 for (android.hardware.radio.data.TrafficDescriptor td : ur.trafficDescriptors) { 3780 try { 3781 tds.add(convertHalTrafficDescriptor(td)); 3782 } catch (IllegalArgumentException e) { 3783 loge("convertHalTrafficDescriptor: " + e); 3784 } 3785 } 3786 List<RouteSelectionDescriptor> rsds = new ArrayList<>(); 3787 for (android.hardware.radio.data.RouteSelectionDescriptor rsd 3788 : ur.routeSelectionDescriptor) { 3789 List<NetworkSliceInfo> sliceInfo = new ArrayList<>(); 3790 for (android.hardware.radio.data.SliceInfo si : rsd.sliceInfo) { 3791 sliceInfo.add(convertHalSliceInfo(si)); 3792 } 3793 rsds.add(new RouteSelectionDescriptor(rsd.precedence, rsd.sessionType, rsd.sscMode, 3794 sliceInfo, primitiveArrayToArrayList(rsd.dnn))); 3795 } 3796 urspRules.add(new UrspRule(ur.precedence, tds, rsds)); 3797 } 3798 List<NetworkSliceInfo> sliceInfo = new ArrayList<>(); 3799 for (android.hardware.radio.data.SliceInfo si : sc.sliceInfo) { 3800 sliceInfo.add(convertHalSliceInfo(si)); 3801 } 3802 return new NetworkSlicingConfig(urspRules, sliceInfo); 3803 } 3804 convertHalQosBandwidth( android.hardware.radio.V1_6.QosBandwidth bandwidth)3805 private static Qos.QosBandwidth convertHalQosBandwidth( 3806 android.hardware.radio.V1_6.QosBandwidth bandwidth) { 3807 return new Qos.QosBandwidth(bandwidth.maxBitrateKbps, bandwidth.guaranteedBitrateKbps); 3808 } 3809 convertHalQosBandwidth( android.hardware.radio.data.QosBandwidth bandwidth)3810 private static Qos.QosBandwidth convertHalQosBandwidth( 3811 android.hardware.radio.data.QosBandwidth bandwidth) { 3812 return new Qos.QosBandwidth(bandwidth.maxBitrateKbps, bandwidth.guaranteedBitrateKbps); 3813 } 3814 convertHalQos(android.hardware.radio.V1_6.Qos qos)3815 private static Qos convertHalQos(android.hardware.radio.V1_6.Qos qos) { 3816 switch (qos.getDiscriminator()) { 3817 case android.hardware.radio.V1_6.Qos.hidl_discriminator.eps: 3818 android.hardware.radio.V1_6.EpsQos eps = qos.eps(); 3819 return new EpsQos(convertHalQosBandwidth(eps.downlink), 3820 convertHalQosBandwidth(eps.uplink), eps.qci); 3821 case android.hardware.radio.V1_6.Qos.hidl_discriminator.nr: 3822 android.hardware.radio.V1_6.NrQos nr = qos.nr(); 3823 return new NrQos(convertHalQosBandwidth(nr.downlink), 3824 convertHalQosBandwidth(nr.uplink), nr.qfi, nr.fiveQi, nr.averagingWindowMs); 3825 default: 3826 return null; 3827 } 3828 } 3829 convertHalQos(android.hardware.radio.data.Qos qos)3830 private static Qos convertHalQos(android.hardware.radio.data.Qos qos) { 3831 switch (qos.getTag()) { 3832 case android.hardware.radio.data.Qos.eps: 3833 android.hardware.radio.data.EpsQos eps = qos.getEps(); 3834 return new EpsQos(convertHalQosBandwidth(eps.downlink), 3835 convertHalQosBandwidth(eps.uplink), eps.qci); 3836 case android.hardware.radio.data.Qos.nr: 3837 android.hardware.radio.data.NrQos nr = qos.getNr(); 3838 return new NrQos(convertHalQosBandwidth(nr.downlink), 3839 convertHalQosBandwidth(nr.uplink), nr.qfi, nr.fiveQi, 3840 nr.averagingWindowMs); 3841 default: 3842 return null; 3843 } 3844 } 3845 convertHalQosBearerFilter( android.hardware.radio.V1_6.QosFilter qosFilter)3846 private static QosBearerFilter convertHalQosBearerFilter( 3847 android.hardware.radio.V1_6.QosFilter qosFilter) { 3848 List<LinkAddress> localAddressList = new ArrayList<>(); 3849 String[] localAddresses = qosFilter.localAddresses.toArray(new String[0]); 3850 if (localAddresses != null) { 3851 for (String address : localAddresses) { 3852 localAddressList.add(convertToLinkAddress(address)); 3853 } 3854 } 3855 List<LinkAddress> remoteAddressList = new ArrayList<>(); 3856 String[] remoteAddresses = qosFilter.remoteAddresses.toArray(new String[0]); 3857 if (remoteAddresses != null) { 3858 for (String address : remoteAddresses) { 3859 remoteAddressList.add(convertToLinkAddress(address)); 3860 } 3861 } 3862 QosBearerFilter.PortRange localPort = null; 3863 if (qosFilter.localPort != null) { 3864 if (qosFilter.localPort.getDiscriminator() 3865 == android.hardware.radio.V1_6.MaybePort.hidl_discriminator.range) { 3866 final android.hardware.radio.V1_6.PortRange portRange = qosFilter.localPort.range(); 3867 localPort = new QosBearerFilter.PortRange(portRange.start, portRange.end); 3868 } 3869 } 3870 QosBearerFilter.PortRange remotePort = null; 3871 if (qosFilter.remotePort != null) { 3872 if (qosFilter.remotePort.getDiscriminator() 3873 == android.hardware.radio.V1_6.MaybePort.hidl_discriminator.range) { 3874 final android.hardware.radio.V1_6.PortRange portRange = 3875 qosFilter.remotePort.range(); 3876 remotePort = new QosBearerFilter.PortRange(portRange.start, portRange.end); 3877 } 3878 } 3879 int tos = -1; 3880 if (qosFilter.tos != null) { 3881 if (qosFilter.tos.getDiscriminator() == android.hardware.radio.V1_6.QosFilter 3882 .TypeOfService.hidl_discriminator.value) { 3883 tos = qosFilter.tos.value(); 3884 } 3885 } 3886 long flowLabel = -1; 3887 if (qosFilter.flowLabel != null) { 3888 if (qosFilter.flowLabel.getDiscriminator() == android.hardware.radio.V1_6.QosFilter 3889 .Ipv6FlowLabel.hidl_discriminator.value) { 3890 flowLabel = qosFilter.flowLabel.value(); 3891 } 3892 } 3893 long spi = -1; 3894 if (qosFilter.spi != null) { 3895 if (qosFilter.spi.getDiscriminator() 3896 == android.hardware.radio.V1_6.QosFilter.IpsecSpi.hidl_discriminator.value) { 3897 spi = qosFilter.spi.value(); 3898 } 3899 } 3900 return new QosBearerFilter(localAddressList, remoteAddressList, localPort, remotePort, 3901 qosFilter.protocol, tos, flowLabel, spi, qosFilter.direction, qosFilter.precedence); 3902 } 3903 convertHalQosBearerFilter( android.hardware.radio.data.QosFilter qosFilter)3904 private static QosBearerFilter convertHalQosBearerFilter( 3905 android.hardware.radio.data.QosFilter qosFilter) { 3906 List<LinkAddress> localAddressList = new ArrayList<>(); 3907 String[] localAddresses = qosFilter.localAddresses; 3908 if (localAddresses != null) { 3909 for (String address : localAddresses) { 3910 localAddressList.add(convertToLinkAddress(address)); 3911 } 3912 } 3913 List<LinkAddress> remoteAddressList = new ArrayList<>(); 3914 String[] remoteAddresses = qosFilter.remoteAddresses; 3915 if (remoteAddresses != null) { 3916 for (String address : remoteAddresses) { 3917 remoteAddressList.add(convertToLinkAddress(address)); 3918 } 3919 } 3920 QosBearerFilter.PortRange localPort = null; 3921 if (qosFilter.localPort != null) { 3922 localPort = new QosBearerFilter.PortRange( 3923 qosFilter.localPort.start, qosFilter.localPort.end); 3924 } 3925 QosBearerFilter.PortRange remotePort = null; 3926 if (qosFilter.remotePort != null) { 3927 remotePort = new QosBearerFilter.PortRange( 3928 qosFilter.remotePort.start, qosFilter.remotePort.end); 3929 } 3930 int tos = -1; 3931 if (qosFilter.tos != null) { 3932 if (qosFilter.tos.getTag() 3933 == android.hardware.radio.data.QosFilterTypeOfService.value) { 3934 tos = qosFilter.tos.value; 3935 } 3936 } 3937 long flowLabel = -1; 3938 if (qosFilter.flowLabel != null) { 3939 if (qosFilter.flowLabel.getTag() 3940 == android.hardware.radio.data.QosFilterIpv6FlowLabel.value) { 3941 flowLabel = qosFilter.flowLabel.value; 3942 } 3943 } 3944 long spi = -1; 3945 if (qosFilter.spi != null) { 3946 if (qosFilter.spi.getTag() 3947 == android.hardware.radio.data.QosFilterIpsecSpi.value) { 3948 spi = qosFilter.spi.value; 3949 } 3950 } 3951 return new QosBearerFilter(localAddressList, remoteAddressList, localPort, remotePort, 3952 qosFilter.protocol, tos, flowLabel, spi, qosFilter.direction, qosFilter.precedence); 3953 } 3954 convertHalQosBearerSession( android.hardware.radio.V1_6.QosSession qosSession)3955 private static QosBearerSession convertHalQosBearerSession( 3956 android.hardware.radio.V1_6.QosSession qosSession) { 3957 List<QosBearerFilter> qosBearerFilters = new ArrayList<>(); 3958 if (qosSession.qosFilters != null) { 3959 for (android.hardware.radio.V1_6.QosFilter filter : qosSession.qosFilters) { 3960 qosBearerFilters.add(convertHalQosBearerFilter(filter)); 3961 } 3962 } 3963 return new QosBearerSession(qosSession.qosSessionId, convertHalQos(qosSession.qos), 3964 qosBearerFilters); 3965 } 3966 convertHalQosBearerSession( android.hardware.radio.data.QosSession qosSession)3967 private static QosBearerSession convertHalQosBearerSession( 3968 android.hardware.radio.data.QosSession qosSession) { 3969 List<QosBearerFilter> qosBearerFilters = new ArrayList<>(); 3970 if (qosSession.qosFilters != null) { 3971 for (android.hardware.radio.data.QosFilter filter : qosSession.qosFilters) { 3972 qosBearerFilters.add(convertHalQosBearerFilter(filter)); 3973 } 3974 } 3975 return new QosBearerSession(qosSession.qosSessionId, convertHalQos(qosSession.qos), 3976 qosBearerFilters); 3977 } 3978 3979 /** 3980 * Convert a list of SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal into 3981 * a list of DataCallResponse 3982 * @param dataCallResultList List of SetupDataCallResult defined in 3983 * radio/1.0, 1.4, 1.5, 1.6/types.hal 3984 * @return The converted list of DataCallResponses 3985 */ 3986 @VisibleForTesting convertHalDataCallResultList( List<? extends Object> dataCallResultList)3987 public static ArrayList<DataCallResponse> convertHalDataCallResultList( 3988 List<? extends Object> dataCallResultList) { 3989 ArrayList<DataCallResponse> response = new ArrayList<>(dataCallResultList.size()); 3990 3991 for (Object obj : dataCallResultList) { 3992 response.add(convertHalDataCallResult(obj)); 3993 } 3994 return response; 3995 } 3996 3997 /** 3998 * Convert a list of SetupDataCallResult defined in SetupDataCallResult.aidl into a list of 3999 * DataCallResponse 4000 * @param dataCallResultList Array of SetupDataCallResult defined in SetupDataCallResult.aidl 4001 * @return The converted list of DataCallResponses 4002 */ 4003 @VisibleForTesting convertHalDataCallResultList( android.hardware.radio.data.SetupDataCallResult[] dataCallResultList)4004 public static ArrayList<DataCallResponse> convertHalDataCallResultList( 4005 android.hardware.radio.data.SetupDataCallResult[] dataCallResultList) { 4006 ArrayList<DataCallResponse> response = new ArrayList<>(dataCallResultList.length); 4007 4008 for (android.hardware.radio.data.SetupDataCallResult result : dataCallResultList) { 4009 response.add(convertHalDataCallResult(result)); 4010 } 4011 return response; 4012 } 4013 4014 /** 4015 * Convert KeepaliveStatusCode defined in radio/1.1/types.hal and KeepaliveStatus.aidl 4016 * to KeepaliveStatus 4017 * @param halCode KeepaliveStatus code defined in radio/1.1/types.hal or KeepaliveStatus.aidl 4018 * @return The converted KeepaliveStatus 4019 */ convertHalKeepaliveStatusCode(int halCode)4020 public static @KeepaliveStatusCode int convertHalKeepaliveStatusCode(int halCode) { 4021 switch (halCode) { 4022 case android.hardware.radio.V1_1.KeepaliveStatusCode.ACTIVE: 4023 return KeepaliveStatus.STATUS_ACTIVE; 4024 case android.hardware.radio.V1_1.KeepaliveStatusCode.INACTIVE: 4025 return KeepaliveStatus.STATUS_INACTIVE; 4026 case android.hardware.radio.V1_1.KeepaliveStatusCode.PENDING: 4027 return KeepaliveStatus.STATUS_PENDING; 4028 default: 4029 return -1; 4030 } 4031 } 4032 4033 /** 4034 * Convert RadioState defined in radio/1.0/types.hal and RadioState.aidl to RadioPowerState 4035 * @param stateInt Radio state defined in radio/1.0/types.hal or RadioState.aidl 4036 * @return The converted {@link Annotation.RadioPowerState RadioPowerState} 4037 */ convertHalRadioState(int stateInt)4038 public static @Annotation.RadioPowerState int convertHalRadioState(int stateInt) { 4039 int state; 4040 switch(stateInt) { 4041 case android.hardware.radio.V1_0.RadioState.OFF: 4042 state = TelephonyManager.RADIO_POWER_OFF; 4043 break; 4044 case android.hardware.radio.V1_0.RadioState.UNAVAILABLE: 4045 state = TelephonyManager.RADIO_POWER_UNAVAILABLE; 4046 break; 4047 case android.hardware.radio.V1_0.RadioState.ON: 4048 state = TelephonyManager.RADIO_POWER_ON; 4049 break; 4050 default: 4051 throw new RuntimeException("Unrecognized RadioState: " + stateInt); 4052 } 4053 return state; 4054 } 4055 4056 /** 4057 * Convert CellConnectionStatus defined in radio/1.2/types.hal to ConnectionStatus 4058 * @param status Cell connection status defined in radio/1.2/types.hal 4059 * @return The converted ConnectionStatus 4060 */ convertHalCellConnectionStatus(int status)4061 public static int convertHalCellConnectionStatus(int status) { 4062 switch (status) { 4063 case android.hardware.radio.V1_2.CellConnectionStatus.PRIMARY_SERVING: 4064 return PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING; 4065 case android.hardware.radio.V1_2.CellConnectionStatus.SECONDARY_SERVING: 4066 return PhysicalChannelConfig.CONNECTION_SECONDARY_SERVING; 4067 default: 4068 return PhysicalChannelConfig.CONNECTION_UNKNOWN; 4069 } 4070 } 4071 4072 /** 4073 * Convert Call defined in radio/1.0, 1.2, 1.6/types.hal to DriverCall 4074 * @param halCall Call defined in radio/1.0, 1.2, 1.6/types.hal 4075 * @return The converted DriverCall 4076 */ convertToDriverCall(Object halCall)4077 public static DriverCall convertToDriverCall(Object halCall) { 4078 DriverCall dc = new DriverCall(); 4079 final android.hardware.radio.V1_6.Call call16; 4080 final android.hardware.radio.V1_2.Call call12; 4081 final android.hardware.radio.V1_0.Call call10; 4082 if (halCall instanceof android.hardware.radio.V1_6.Call) { 4083 call16 = (android.hardware.radio.V1_6.Call) halCall; 4084 call12 = call16.base; 4085 call10 = call12.base; 4086 } else if (halCall instanceof android.hardware.radio.V1_2.Call) { 4087 call16 = null; 4088 call12 = (android.hardware.radio.V1_2.Call) halCall; 4089 call10 = call12.base; 4090 } else if (halCall instanceof android.hardware.radio.V1_0.Call) { 4091 call16 = null; 4092 call12 = null; 4093 call10 = (android.hardware.radio.V1_0.Call) halCall; 4094 } else { 4095 call16 = null; 4096 call12 = null; 4097 call10 = null; 4098 } 4099 if (call10 != null) { 4100 dc.state = DriverCall.stateFromCLCC((int) (call10.state)); 4101 dc.index = call10.index; 4102 dc.TOA = call10.toa; 4103 dc.isMpty = call10.isMpty; 4104 dc.isMT = call10.isMT; 4105 dc.als = call10.als; 4106 dc.isVoice = call10.isVoice; 4107 dc.isVoicePrivacy = call10.isVoicePrivacy; 4108 dc.number = call10.number; 4109 dc.numberPresentation = DriverCall.presentationFromCLIP( 4110 (int) (call10.numberPresentation)); 4111 dc.name = call10.name; 4112 dc.namePresentation = DriverCall.presentationFromCLIP((int) (call10.namePresentation)); 4113 if (call10.uusInfo.size() == 1) { 4114 dc.uusInfo = new UUSInfo(); 4115 dc.uusInfo.setType(call10.uusInfo.get(0).uusType); 4116 dc.uusInfo.setDcs(call10.uusInfo.get(0).uusDcs); 4117 if (!TextUtils.isEmpty(call10.uusInfo.get(0).uusData)) { 4118 byte[] userData = call10.uusInfo.get(0).uusData.getBytes(); 4119 dc.uusInfo.setUserData(userData); 4120 } 4121 } 4122 // Make sure there's a leading + on addresses with a TOA of 145 4123 dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); 4124 } 4125 if (call12 != null) { 4126 dc.audioQuality = (int) (call12.audioQuality); 4127 } 4128 if (call16 != null) { 4129 dc.forwardedNumber = call16.forwardedNumber; 4130 } 4131 return dc; 4132 } 4133 4134 /** 4135 * Convert Call defined in Call.aidl to DriverCall 4136 * @param halCall Call defined in Call.aidl 4137 * @return The converted DriverCall 4138 */ convertToDriverCall(android.hardware.radio.voice.Call halCall)4139 public static DriverCall convertToDriverCall(android.hardware.radio.voice.Call halCall) { 4140 DriverCall dc = new DriverCall(); 4141 dc.state = DriverCall.stateFromCLCC((int) halCall.state); 4142 dc.index = halCall.index; 4143 dc.TOA = halCall.toa; 4144 dc.isMpty = halCall.isMpty; 4145 dc.isMT = halCall.isMT; 4146 dc.als = halCall.als; 4147 dc.isVoice = halCall.isVoice; 4148 dc.isVoicePrivacy = halCall.isVoicePrivacy; 4149 dc.number = halCall.number; 4150 dc.numberPresentation = DriverCall.presentationFromCLIP((int) halCall.numberPresentation); 4151 dc.name = halCall.name; 4152 dc.namePresentation = DriverCall.presentationFromCLIP((int) halCall.namePresentation); 4153 if (halCall.uusInfo.length == 1) { 4154 dc.uusInfo = new UUSInfo(); 4155 dc.uusInfo.setType(halCall.uusInfo[0].uusType); 4156 dc.uusInfo.setDcs(halCall.uusInfo[0].uusDcs); 4157 if (!TextUtils.isEmpty(halCall.uusInfo[0].uusData)) { 4158 dc.uusInfo.setUserData(halCall.uusInfo[0].uusData.getBytes()); 4159 } 4160 } 4161 // Make sure there's a leading + on addresses with a TOA of 145 4162 dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); 4163 dc.audioQuality = (int) halCall.audioQuality; 4164 dc.forwardedNumber = halCall.forwardedNumber; 4165 return dc; 4166 } 4167 4168 /** 4169 * Convert OperatorStatus defined in radio/1.0/types.hal to OperatorInfo.State 4170 * @param status Operator status defined in radio/1.0/types.hal 4171 * @return The converted OperatorStatus as a String 4172 */ convertHalOperatorStatus(int status)4173 public static String convertHalOperatorStatus(int status) { 4174 if (status == android.hardware.radio.V1_0.OperatorStatus.UNKNOWN) { 4175 return "unknown"; 4176 } else if (status == android.hardware.radio.V1_0.OperatorStatus.AVAILABLE) { 4177 return "available"; 4178 } else if (status == android.hardware.radio.V1_0.OperatorStatus.CURRENT) { 4179 return "current"; 4180 } else if (status == android.hardware.radio.V1_0.OperatorStatus.FORBIDDEN) { 4181 return "forbidden"; 4182 } else { 4183 return ""; 4184 } 4185 } 4186 4187 /** 4188 * Convert a list of Carriers defined in radio/1.0/types.hal to a list of CarrierIdentifiers 4189 * @param carrierList List of Carriers defined in radio/1.0/types.hal 4190 * @return The converted list of CarrierIdentifiers 4191 */ convertHalCarrierList( List<android.hardware.radio.V1_0.Carrier> carrierList)4192 public static List<CarrierIdentifier> convertHalCarrierList( 4193 List<android.hardware.radio.V1_0.Carrier> carrierList) { 4194 List<CarrierIdentifier> ret = new ArrayList<>(); 4195 for (int i = 0; i < carrierList.size(); i++) { 4196 String mcc = carrierList.get(i).mcc; 4197 String mnc = carrierList.get(i).mnc; 4198 String spn = null, imsi = null, gid1 = null, gid2 = null; 4199 int matchType = carrierList.get(i).matchType; 4200 String matchData = carrierList.get(i).matchData; 4201 if (matchType == CarrierIdentifier.MatchType.SPN) { 4202 spn = matchData; 4203 } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) { 4204 imsi = matchData; 4205 } else if (matchType == CarrierIdentifier.MatchType.GID1) { 4206 gid1 = matchData; 4207 } else if (matchType == CarrierIdentifier.MatchType.GID2) { 4208 gid2 = matchData; 4209 } 4210 ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2)); 4211 } 4212 return ret; 4213 } 4214 4215 /** 4216 * Convert a list of Carriers defined in radio/1.0/types.hal to a list of CarrierIdentifiers 4217 * @param carrierList List of Carriers defined in radio/1.0/types.hal 4218 * @return The converted list of CarrierIdentifiers 4219 */ convertHalCarrierList( android.hardware.radio.sim.Carrier[] carrierList)4220 public static List<CarrierIdentifier> convertHalCarrierList( 4221 android.hardware.radio.sim.Carrier[] carrierList) { 4222 List<CarrierIdentifier> ret = new ArrayList<>(); 4223 for (int i = 0; i < carrierList.length; i++) { 4224 String mcc = carrierList[i].mcc; 4225 String mnc = carrierList[i].mnc; 4226 String spn = null, imsi = null, gid1 = null, gid2 = null; 4227 int matchType = carrierList[i].matchType; 4228 String matchData = carrierList[i].matchData; 4229 if (matchType == CarrierIdentifier.MatchType.SPN) { 4230 spn = matchData; 4231 } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) { 4232 imsi = matchData; 4233 } else if (matchType == CarrierIdentifier.MatchType.GID1) { 4234 gid1 = matchData; 4235 } else if (matchType == CarrierIdentifier.MatchType.GID2) { 4236 gid2 = matchData; 4237 } 4238 ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2)); 4239 } 4240 return ret; 4241 } 4242 4243 /** 4244 * Convert CardStatus defined in radio/1.0, 1.5/types.hal to IccCardStatus 4245 * @param cardStatus CardStatus defined in radio/1.0, 1.5/types.hal 4246 * @return The converted IccCardStatus 4247 */ convertHalCardStatus(Object cardStatus)4248 public static IccCardStatus convertHalCardStatus(Object cardStatus) { 4249 final android.hardware.radio.V1_0.CardStatus cardStatus10; 4250 final android.hardware.radio.V1_5.CardStatus cardStatus15; 4251 if (cardStatus instanceof android.hardware.radio.V1_5.CardStatus) { 4252 cardStatus15 = (android.hardware.radio.V1_5.CardStatus) cardStatus; 4253 cardStatus10 = cardStatus15.base.base.base; 4254 } else if (cardStatus instanceof android.hardware.radio.V1_0.CardStatus) { 4255 cardStatus15 = null; 4256 cardStatus10 = (android.hardware.radio.V1_0.CardStatus) cardStatus; 4257 } else { 4258 cardStatus15 = null; 4259 cardStatus10 = null; 4260 } 4261 4262 IccCardStatus iccCardStatus = new IccCardStatus(); 4263 if (cardStatus10 != null) { 4264 iccCardStatus.setCardState(cardStatus10.cardState); 4265 iccCardStatus.setUniversalPinState(cardStatus10.universalPinState); 4266 iccCardStatus.mGsmUmtsSubscriptionAppIndex = cardStatus10.gsmUmtsSubscriptionAppIndex; 4267 iccCardStatus.mCdmaSubscriptionAppIndex = cardStatus10.cdmaSubscriptionAppIndex; 4268 iccCardStatus.mImsSubscriptionAppIndex = cardStatus10.imsSubscriptionAppIndex; 4269 int numApplications = cardStatus10.applications.size(); 4270 4271 // limit to maximum allowed applications 4272 if (numApplications > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) { 4273 numApplications = com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS; 4274 } 4275 iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications]; 4276 for (int i = 0; i < numApplications; i++) { 4277 android.hardware.radio.V1_0.AppStatus rilAppStatus = 4278 cardStatus10.applications.get(i); 4279 IccCardApplicationStatus appStatus = new IccCardApplicationStatus(); 4280 appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.appType); 4281 appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.appState); 4282 appStatus.perso_substate = appStatus.PersoSubstateFromRILInt( 4283 rilAppStatus.persoSubstate); 4284 appStatus.aid = rilAppStatus.aidPtr; 4285 appStatus.app_label = rilAppStatus.appLabelPtr; 4286 appStatus.pin1_replaced = rilAppStatus.pin1Replaced != 0; 4287 appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.pin1); 4288 appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.pin2); 4289 iccCardStatus.mApplications[i] = appStatus; 4290 } 4291 } 4292 if (cardStatus15 != null) { 4293 IccSlotPortMapping slotPortMapping = new IccSlotPortMapping(); 4294 slotPortMapping.mPhysicalSlotIndex = cardStatus15.base.base.physicalSlotId; 4295 iccCardStatus.mSlotPortMapping = slotPortMapping; 4296 iccCardStatus.atr = cardStatus15.base.base.atr; 4297 iccCardStatus.iccid = cardStatus15.base.base.iccid; 4298 iccCardStatus.eid = cardStatus15.base.eid; 4299 int numApplications = cardStatus15.applications.size(); 4300 4301 // limit to maximum allowed applications 4302 if (numApplications > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) { 4303 numApplications = com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS; 4304 } 4305 iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications]; 4306 for (int i = 0; i < numApplications; i++) { 4307 android.hardware.radio.V1_5.AppStatus rilAppStatus = 4308 cardStatus15.applications.get(i); 4309 IccCardApplicationStatus appStatus = new IccCardApplicationStatus(); 4310 appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.base.appType); 4311 appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.base.appState); 4312 appStatus.perso_substate = appStatus.PersoSubstateFromRILInt( 4313 rilAppStatus.persoSubstate); 4314 appStatus.aid = rilAppStatus.base.aidPtr; 4315 appStatus.app_label = rilAppStatus.base.appLabelPtr; 4316 appStatus.pin1_replaced = rilAppStatus.base.pin1Replaced != 0; 4317 appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.base.pin1); 4318 appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.base.pin2); 4319 iccCardStatus.mApplications[i] = appStatus; 4320 } 4321 } 4322 return iccCardStatus; 4323 } 4324 4325 /** 4326 * Convert CardStatus defined in CardStatus.aidl to IccCardStatus 4327 * @param cardStatus CardStatus defined in CardStatus.aidl 4328 * @return The converted IccCardStatus 4329 */ convertHalCardStatus( android.hardware.radio.sim.CardStatus cardStatus)4330 public static IccCardStatus convertHalCardStatus( 4331 android.hardware.radio.sim.CardStatus cardStatus) { 4332 IccCardStatus iccCardStatus = new IccCardStatus(); 4333 iccCardStatus.setCardState(cardStatus.cardState); 4334 iccCardStatus.setUniversalPinState(cardStatus.universalPinState); 4335 iccCardStatus.mGsmUmtsSubscriptionAppIndex = cardStatus.gsmUmtsSubscriptionAppIndex; 4336 iccCardStatus.mCdmaSubscriptionAppIndex = cardStatus.cdmaSubscriptionAppIndex; 4337 iccCardStatus.mImsSubscriptionAppIndex = cardStatus.imsSubscriptionAppIndex; 4338 iccCardStatus.atr = cardStatus.atr; 4339 iccCardStatus.iccid = cardStatus.iccid; 4340 iccCardStatus.eid = cardStatus.eid; 4341 4342 int numApplications = Math.min(cardStatus.applications.length, 4343 com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS); 4344 iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications]; 4345 for (int i = 0; i < numApplications; i++) { 4346 android.hardware.radio.sim.AppStatus rilAppStatus = cardStatus.applications[i]; 4347 IccCardApplicationStatus appStatus = new IccCardApplicationStatus(); 4348 appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.appType); 4349 appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.appState); 4350 appStatus.perso_substate = appStatus.PersoSubstateFromRILInt( 4351 rilAppStatus.persoSubstate); 4352 appStatus.aid = rilAppStatus.aidPtr; 4353 appStatus.app_label = rilAppStatus.appLabelPtr; 4354 appStatus.pin1_replaced = rilAppStatus.pin1Replaced; 4355 appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.pin1); 4356 appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.pin2); 4357 iccCardStatus.mApplications[i] = appStatus; 4358 } 4359 IccSlotPortMapping slotPortMapping = new IccSlotPortMapping(); 4360 slotPortMapping.mPhysicalSlotIndex = cardStatus.slotMap.physicalSlotId; 4361 slotPortMapping.mPortIndex = cardStatus.slotMap.portId; 4362 iccCardStatus.mSlotPortMapping = slotPortMapping; 4363 return iccCardStatus; 4364 } 4365 4366 /** 4367 * Convert PhonebookCapacity defined in radio/1.6/types.hal to AdnCapacity 4368 * @param pbCap PhonebookCapacity defined in radio/1.6/types.hal 4369 * @return The converted AdnCapacity 4370 */ convertHalPhonebookCapacity( android.hardware.radio.V1_6.PhonebookCapacity pbCap)4371 public static AdnCapacity convertHalPhonebookCapacity( 4372 android.hardware.radio.V1_6.PhonebookCapacity pbCap) { 4373 if (pbCap != null) { 4374 return new AdnCapacity(pbCap.maxAdnRecords, pbCap.usedAdnRecords, pbCap.maxEmailRecords, 4375 pbCap.usedEmailRecords, pbCap.maxAdditionalNumberRecords, 4376 pbCap.usedAdditionalNumberRecords, pbCap.maxNameLen, pbCap.maxNumberLen, 4377 pbCap.maxEmailLen, pbCap.maxAdditionalNumberLen); 4378 } 4379 return null; 4380 } 4381 4382 /** 4383 * Convert PhonebookCapacity defined in PhonebookCapacity.aidl to AdnCapacity 4384 * @param pbCap PhonebookCapacity defined in PhonebookCapacity.aidl 4385 * @return The converted AdnCapacity 4386 */ convertHalPhonebookCapacity( android.hardware.radio.sim.PhonebookCapacity pbCap)4387 public static AdnCapacity convertHalPhonebookCapacity( 4388 android.hardware.radio.sim.PhonebookCapacity pbCap) { 4389 if (pbCap != null) { 4390 return new AdnCapacity(pbCap.maxAdnRecords, pbCap.usedAdnRecords, pbCap.maxEmailRecords, 4391 pbCap.usedEmailRecords, pbCap.maxAdditionalNumberRecords, 4392 pbCap.usedAdditionalNumberRecords, pbCap.maxNameLen, pbCap.maxNumberLen, 4393 pbCap.maxEmailLen, pbCap.maxAdditionalNumberLen); 4394 } 4395 return null; 4396 } 4397 4398 /** 4399 * Convert PhonebookRecordInfo defined in radio/1.6/types.hal to SimPhonebookRecord 4400 * @param recInfo PhonebookRecordInfo defined in radio/1.6/types.hal 4401 * @return The converted SimPhonebookRecord 4402 */ convertHalPhonebookRecordInfo( android.hardware.radio.V1_6.PhonebookRecordInfo recInfo)4403 public static SimPhonebookRecord convertHalPhonebookRecordInfo( 4404 android.hardware.radio.V1_6.PhonebookRecordInfo recInfo) { 4405 String[] emails = recInfo.emails == null ? null 4406 : recInfo.emails.toArray(new String[recInfo.emails.size()]); 4407 String[] numbers = recInfo.additionalNumbers == null ? null 4408 : recInfo.additionalNumbers.toArray(new String[recInfo.additionalNumbers.size()]); 4409 return new SimPhonebookRecord(recInfo.recordId, recInfo.name, recInfo.number, emails, 4410 numbers); 4411 } 4412 4413 /** 4414 * Convert PhonebookRecordInfo defined in PhonebookRecordInfo.aidl to SimPhonebookRecord 4415 * @param recInfo PhonebookRecordInfo defined in PhonebookRecordInfo.aidl 4416 * @return The converted SimPhonebookRecord 4417 */ convertHalPhonebookRecordInfo( android.hardware.radio.sim.PhonebookRecordInfo recInfo)4418 public static SimPhonebookRecord convertHalPhonebookRecordInfo( 4419 android.hardware.radio.sim.PhonebookRecordInfo recInfo) { 4420 return new SimPhonebookRecord(recInfo.recordId, recInfo.name, recInfo.number, 4421 recInfo.emails, recInfo.additionalNumbers); 4422 } 4423 4424 /** 4425 * Convert to PhonebookRecordInfo defined in radio/1.6/types.hal 4426 * @param record SimPhonebookRecord to convert 4427 * @return The converted PhonebookRecordInfo defined in radio/1.6/types.hal 4428 */ convertToHalPhonebookRecordInfo( SimPhonebookRecord record)4429 public static android.hardware.radio.V1_6.PhonebookRecordInfo convertToHalPhonebookRecordInfo( 4430 SimPhonebookRecord record) { 4431 if (record != null) { 4432 return record.toPhonebookRecordInfo(); 4433 } 4434 return null; 4435 } 4436 4437 /** 4438 * Convert to PhonebookRecordInfo.aidl 4439 * @param record SimPhonebookRecord to convert 4440 * @return The converted PhonebookRecordInfo 4441 */ 4442 public static android.hardware.radio.sim.PhonebookRecordInfo convertToHalPhonebookRecordInfoAidl(SimPhonebookRecord record)4443 convertToHalPhonebookRecordInfoAidl(SimPhonebookRecord record) { 4444 if (record != null) { 4445 return record.toPhonebookRecordInfoAidl(); 4446 } 4447 return new android.hardware.radio.sim.PhonebookRecordInfo(); 4448 } 4449 4450 /** 4451 * Convert array of SimSlotStatus to IccSlotStatus 4452 * @param o object that represents array/list of SimSlotStatus 4453 * @return ArrayList of IccSlotStatus 4454 */ convertHalSlotStatus(Object o)4455 public static ArrayList<IccSlotStatus> convertHalSlotStatus(Object o) { 4456 ArrayList<IccSlotStatus> response = new ArrayList<>(); 4457 try { 4458 final android.hardware.radio.config.SimSlotStatus[] halSlotStatusArray = 4459 (android.hardware.radio.config.SimSlotStatus[]) o; 4460 for (android.hardware.radio.config.SimSlotStatus slotStatus : halSlotStatusArray) { 4461 IccSlotStatus iccSlotStatus = new IccSlotStatus(); 4462 iccSlotStatus.setCardState(slotStatus.cardState); 4463 int portCount = slotStatus.portInfo.length; 4464 iccSlotStatus.mSimPortInfos = new IccSimPortInfo[portCount]; 4465 for (int i = 0; i < portCount; i++) { 4466 IccSimPortInfo simPortInfo = new IccSimPortInfo(); 4467 simPortInfo.mIccId = slotStatus.portInfo[i].iccId; 4468 // If port is not active, set invalid logical slot index(-1) irrespective of 4469 // the modem response. For more info, check http://b/209035150 4470 simPortInfo.mLogicalSlotIndex = slotStatus.portInfo[i].portActive 4471 ? slotStatus.portInfo[i].logicalSlotId : -1; 4472 simPortInfo.mPortActive = slotStatus.portInfo[i].portActive; 4473 iccSlotStatus.mSimPortInfos[i] = simPortInfo; 4474 } 4475 iccSlotStatus.atr = slotStatus.atr; 4476 iccSlotStatus.eid = slotStatus.eid; 4477 response.add(iccSlotStatus); 4478 } 4479 return response; 4480 } catch (ClassCastException ignore) { } 4481 try { 4482 final ArrayList<android.hardware.radio.config.V1_2.SimSlotStatus> 4483 halSlotStatusArray = 4484 (ArrayList<android.hardware.radio.config.V1_2.SimSlotStatus>) o; 4485 for (android.hardware.radio.config.V1_2.SimSlotStatus slotStatus : 4486 halSlotStatusArray) { 4487 IccSlotStatus iccSlotStatus = new IccSlotStatus(); 4488 iccSlotStatus.setCardState(slotStatus.base.cardState); 4489 // Old HAL versions does not support MEP, so only one port is available. 4490 iccSlotStatus.mSimPortInfos = new IccSimPortInfo[1]; 4491 IccSimPortInfo simPortInfo = new IccSimPortInfo(); 4492 simPortInfo.mIccId = slotStatus.base.iccid; 4493 simPortInfo.mPortActive = (slotStatus.base.slotState == IccSlotStatus.STATE_ACTIVE); 4494 // If port/slot is not active, set invalid logical slot index(-1) irrespective of 4495 // the modem response. For more info, check http://b/209035150 4496 simPortInfo.mLogicalSlotIndex = simPortInfo.mPortActive 4497 ? slotStatus.base.logicalSlotId : -1; 4498 iccSlotStatus.mSimPortInfos[TelephonyManager.DEFAULT_PORT_INDEX] = simPortInfo; 4499 iccSlotStatus.atr = slotStatus.base.atr; 4500 iccSlotStatus.eid = slotStatus.eid; 4501 response.add(iccSlotStatus); 4502 } 4503 return response; 4504 } catch (ClassCastException ignore) { } 4505 try { 4506 final ArrayList<android.hardware.radio.config.V1_0.SimSlotStatus> 4507 halSlotStatusArray = 4508 (ArrayList<android.hardware.radio.config.V1_0.SimSlotStatus>) o; 4509 for (android.hardware.radio.config.V1_0.SimSlotStatus slotStatus : 4510 halSlotStatusArray) { 4511 IccSlotStatus iccSlotStatus = new IccSlotStatus(); 4512 iccSlotStatus.setCardState(slotStatus.cardState); 4513 // Old HAL versions does not support MEP, so only one port is available. 4514 iccSlotStatus.mSimPortInfos = new IccSimPortInfo[1]; 4515 IccSimPortInfo simPortInfo = new IccSimPortInfo(); 4516 simPortInfo.mIccId = slotStatus.iccid; 4517 simPortInfo.mPortActive = (slotStatus.slotState == IccSlotStatus.STATE_ACTIVE); 4518 // If port/slot is not active, set invalid logical slot index(-1) irrespective of 4519 // the modem response. For more info, check http://b/209035150 4520 simPortInfo.mLogicalSlotIndex = simPortInfo.mPortActive 4521 ? slotStatus.logicalSlotId : -1; 4522 iccSlotStatus.mSimPortInfos[TelephonyManager.DEFAULT_PORT_INDEX] = simPortInfo; 4523 iccSlotStatus.atr = slotStatus.atr; 4524 response.add(iccSlotStatus); 4525 } 4526 return response; 4527 } catch (ClassCastException ignore) { } 4528 return response; 4529 } 4530 4531 /** 4532 * Convert List<UiccSlotMapping> list to SlotPortMapping[] 4533 * @param slotMapping List<UiccSlotMapping> of slots mapping 4534 * @return SlotPortMapping[] of slots mapping 4535 */ convertSimSlotsMapping( List<UiccSlotMapping> slotMapping)4536 public static android.hardware.radio.config.SlotPortMapping[] convertSimSlotsMapping( 4537 List<UiccSlotMapping> slotMapping) { 4538 android.hardware.radio.config.SlotPortMapping[] res = 4539 new android.hardware.radio.config.SlotPortMapping[slotMapping.size()]; 4540 for (UiccSlotMapping mapping : slotMapping) { 4541 int logicalSlotIdx = mapping.getLogicalSlotIndex(); 4542 res[logicalSlotIdx] = new android.hardware.radio.config.SlotPortMapping(); 4543 res[logicalSlotIdx].physicalSlotId = mapping.getPhysicalSlotIndex(); 4544 res[logicalSlotIdx].portId = mapping.getPortIndex(); 4545 } 4546 return res; 4547 } 4548 4549 /** Convert a list of UiccSlotMapping to an ArrayList<Integer>.*/ convertSlotMappingToList( List<UiccSlotMapping> slotMapping)4550 public static ArrayList<Integer> convertSlotMappingToList( 4551 List<UiccSlotMapping> slotMapping) { 4552 int[] physicalSlots = new int[slotMapping.size()]; 4553 for (UiccSlotMapping mapping : slotMapping) { 4554 physicalSlots[mapping.getLogicalSlotIndex()] = mapping.getPhysicalSlotIndex(); 4555 } 4556 return primitiveArrayToArrayList(physicalSlots); 4557 } 4558 4559 4560 /** 4561 * Convert PhoneCapability to telephony PhoneCapability. 4562 * @param deviceNrCapabilities device's nr capability array 4563 * @param o PhoneCapability to convert 4564 * @return converted PhoneCapability 4565 */ convertHalPhoneCapability(int[] deviceNrCapabilities, Object o)4566 public static PhoneCapability convertHalPhoneCapability(int[] deviceNrCapabilities, Object o) { 4567 int maxActiveVoiceCalls = 0; 4568 int maxActiveData = 0; 4569 boolean validationBeforeSwitchSupported = false; 4570 List<ModemInfo> logicalModemList = new ArrayList<>(); 4571 if (o instanceof android.hardware.radio.config.PhoneCapability) { 4572 final android.hardware.radio.config.PhoneCapability phoneCapability = 4573 (android.hardware.radio.config.PhoneCapability) o; 4574 maxActiveData = phoneCapability.maxActiveData; 4575 validationBeforeSwitchSupported = phoneCapability.isInternetLingeringSupported; 4576 for (int modemId : phoneCapability.logicalModemIds) { 4577 logicalModemList.add(new ModemInfo(modemId)); 4578 } 4579 } else if (o instanceof android.hardware.radio.config.V1_1.PhoneCapability) { 4580 final android.hardware.radio.config.V1_1.PhoneCapability phoneCapability = 4581 (android.hardware.radio.config.V1_1.PhoneCapability) o; 4582 maxActiveData = phoneCapability.maxActiveData; 4583 validationBeforeSwitchSupported = phoneCapability.isInternetLingeringSupported; 4584 for (android.hardware.radio.config.V1_1.ModemInfo modemInfo : 4585 phoneCapability.logicalModemList) { 4586 logicalModemList.add(new ModemInfo(modemInfo.modemId)); 4587 } 4588 } 4589 return new PhoneCapability(maxActiveVoiceCalls, maxActiveData, logicalModemList, 4590 validationBeforeSwitchSupported, deviceNrCapabilities); 4591 } 4592 4593 /** Append the data to the end of an ArrayList */ appendPrimitiveArrayToArrayList(byte[] src, ArrayList<Byte> dst)4594 public static void appendPrimitiveArrayToArrayList(byte[] src, ArrayList<Byte> dst) { 4595 for (byte b : src) { 4596 dst.add(b); 4597 } 4598 } 4599 4600 /** Convert a primitive byte array to an ArrayList<Integer>. */ primitiveArrayToArrayList(byte[] arr)4601 public static ArrayList<Byte> primitiveArrayToArrayList(byte[] arr) { 4602 ArrayList<Byte> arrayList = new ArrayList<>(arr.length); 4603 for (byte b : arr) { 4604 arrayList.add(b); 4605 } 4606 return arrayList; 4607 } 4608 4609 /** Convert a primitive int array to an ArrayList<Integer>. */ primitiveArrayToArrayList(int[] arr)4610 public static ArrayList<Integer> primitiveArrayToArrayList(int[] arr) { 4611 ArrayList<Integer> arrayList = new ArrayList<>(arr.length); 4612 for (int i : arr) { 4613 arrayList.add(i); 4614 } 4615 return arrayList; 4616 } 4617 4618 /** Convert a primitive String array to an ArrayList<String>. */ primitiveArrayToArrayList(String[] arr)4619 public static ArrayList<String> primitiveArrayToArrayList(String[] arr) { 4620 return new ArrayList<>(Arrays.asList(arr)); 4621 } 4622 4623 /** Convert an ArrayList of Bytes to an exactly-sized primitive array */ arrayListToPrimitiveArray(ArrayList<Byte> bytes)4624 public static byte[] arrayListToPrimitiveArray(ArrayList<Byte> bytes) { 4625 byte[] ret = new byte[bytes.size()]; 4626 for (int i = 0; i < ret.length; i++) { 4627 ret[i] = bytes.get(i); 4628 } 4629 return ret; 4630 } 4631 4632 /** Convert null to an empty String */ convertNullToEmptyString(String string)4633 public static String convertNullToEmptyString(String string) { 4634 return string != null ? string : ""; 4635 } 4636 4637 /** 4638 * Convert setup data reason to string. 4639 * 4640 * @param reason The reason for setup data call. 4641 * @return The reason in string format. 4642 */ setupDataReasonToString(@etupDataReason int reason)4643 public static String setupDataReasonToString(@SetupDataReason int reason) { 4644 switch (reason) { 4645 case DataService.REQUEST_REASON_NORMAL: 4646 return "NORMAL"; 4647 case DataService.REQUEST_REASON_HANDOVER: 4648 return "HANDOVER"; 4649 case DataService.REQUEST_REASON_UNKNOWN: 4650 return "UNKNOWN"; 4651 default: 4652 return "UNKNOWN(" + reason + ")"; 4653 } 4654 } 4655 4656 /** 4657 * Convert deactivate data reason to string. 4658 * 4659 * @param reason The reason for deactivate data call. 4660 * @return The reason in string format. 4661 */ deactivateDataReasonToString(@eactivateDataReason int reason)4662 public static String deactivateDataReasonToString(@DeactivateDataReason int reason) { 4663 switch (reason) { 4664 case DataService.REQUEST_REASON_NORMAL: 4665 return "NORMAL"; 4666 case DataService.REQUEST_REASON_HANDOVER: 4667 return "HANDOVER"; 4668 case DataService.REQUEST_REASON_SHUTDOWN: 4669 return "SHUTDOWN"; 4670 case DataService.REQUEST_REASON_UNKNOWN: 4671 return "UNKNOWN"; 4672 default: 4673 return "UNKNOWN(" + reason + ")"; 4674 } 4675 } 4676 4677 /** 4678 * RIL request to String 4679 * @param request request 4680 * @return The converted String request 4681 */ requestToString(int request)4682 public static String requestToString(int request) { 4683 switch(request) { 4684 case RIL_REQUEST_GET_SIM_STATUS: 4685 return "GET_SIM_STATUS"; 4686 case RIL_REQUEST_ENTER_SIM_PIN: 4687 return "ENTER_SIM_PIN"; 4688 case RIL_REQUEST_ENTER_SIM_PUK: 4689 return "ENTER_SIM_PUK"; 4690 case RIL_REQUEST_ENTER_SIM_PIN2: 4691 return "ENTER_SIM_PIN2"; 4692 case RIL_REQUEST_ENTER_SIM_PUK2: 4693 return "ENTER_SIM_PUK2"; 4694 case RIL_REQUEST_CHANGE_SIM_PIN: 4695 return "CHANGE_SIM_PIN"; 4696 case RIL_REQUEST_CHANGE_SIM_PIN2: 4697 return "CHANGE_SIM_PIN2"; 4698 case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: 4699 return "ENTER_NETWORK_DEPERSONALIZATION"; 4700 case RIL_REQUEST_GET_CURRENT_CALLS: 4701 return "GET_CURRENT_CALLS"; 4702 case RIL_REQUEST_DIAL: 4703 return "DIAL"; 4704 case RIL_REQUEST_GET_IMSI: 4705 return "GET_IMSI"; 4706 case RIL_REQUEST_HANGUP: 4707 return "HANGUP"; 4708 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: 4709 return "HANGUP_WAITING_OR_BACKGROUND"; 4710 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: 4711 return "HANGUP_FOREGROUND_RESUME_BACKGROUND"; 4712 case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: 4713 return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE"; 4714 case RIL_REQUEST_CONFERENCE: 4715 return "CONFERENCE"; 4716 case RIL_REQUEST_UDUB: 4717 return "UDUB"; 4718 case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: 4719 return "LAST_CALL_FAIL_CAUSE"; 4720 case RIL_REQUEST_SIGNAL_STRENGTH: 4721 return "SIGNAL_STRENGTH"; 4722 case RIL_REQUEST_VOICE_REGISTRATION_STATE: 4723 return "VOICE_REGISTRATION_STATE"; 4724 case RIL_REQUEST_DATA_REGISTRATION_STATE: 4725 return "DATA_REGISTRATION_STATE"; 4726 case RIL_REQUEST_OPERATOR: 4727 return "OPERATOR"; 4728 case RIL_REQUEST_RADIO_POWER: 4729 return "RADIO_POWER"; 4730 case RIL_REQUEST_DTMF: 4731 return "DTMF"; 4732 case RIL_REQUEST_SEND_SMS: 4733 return "SEND_SMS"; 4734 case RIL_REQUEST_SEND_SMS_EXPECT_MORE: 4735 return "SEND_SMS_EXPECT_MORE"; 4736 case RIL_REQUEST_SETUP_DATA_CALL: 4737 return "SETUP_DATA_CALL"; 4738 case RIL_REQUEST_SIM_IO: 4739 return "SIM_IO"; 4740 case RIL_REQUEST_SEND_USSD: 4741 return "SEND_USSD"; 4742 case RIL_REQUEST_CANCEL_USSD: 4743 return "CANCEL_USSD"; 4744 case RIL_REQUEST_GET_CLIR: 4745 return "GET_CLIR"; 4746 case RIL_REQUEST_SET_CLIR: 4747 return "SET_CLIR"; 4748 case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: 4749 return "QUERY_CALL_FORWARD_STATUS"; 4750 case RIL_REQUEST_SET_CALL_FORWARD: 4751 return "SET_CALL_FORWARD"; 4752 case RIL_REQUEST_QUERY_CALL_WAITING: 4753 return "QUERY_CALL_WAITING"; 4754 case RIL_REQUEST_SET_CALL_WAITING: 4755 return "SET_CALL_WAITING"; 4756 case RIL_REQUEST_SMS_ACKNOWLEDGE: 4757 return "SMS_ACKNOWLEDGE"; 4758 case RIL_REQUEST_GET_IMEI: 4759 return "GET_IMEI"; 4760 case RIL_REQUEST_GET_IMEISV: 4761 return "GET_IMEISV"; 4762 case RIL_REQUEST_ANSWER: 4763 return "ANSWER"; 4764 case RIL_REQUEST_DEACTIVATE_DATA_CALL: 4765 return "DEACTIVATE_DATA_CALL"; 4766 case RIL_REQUEST_QUERY_FACILITY_LOCK: 4767 return "QUERY_FACILITY_LOCK"; 4768 case RIL_REQUEST_SET_FACILITY_LOCK: 4769 return "SET_FACILITY_LOCK"; 4770 case RIL_REQUEST_CHANGE_BARRING_PASSWORD: 4771 return "CHANGE_BARRING_PASSWORD"; 4772 case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: 4773 return "QUERY_NETWORK_SELECTION_MODE"; 4774 case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: 4775 return "SET_NETWORK_SELECTION_AUTOMATIC"; 4776 case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: 4777 return "SET_NETWORK_SELECTION_MANUAL"; 4778 case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : 4779 return "QUERY_AVAILABLE_NETWORKS "; 4780 case RIL_REQUEST_DTMF_START: 4781 return "DTMF_START"; 4782 case RIL_REQUEST_DTMF_STOP: 4783 return "DTMF_STOP"; 4784 case RIL_REQUEST_BASEBAND_VERSION: 4785 return "BASEBAND_VERSION"; 4786 case RIL_REQUEST_SEPARATE_CONNECTION: 4787 return "SEPARATE_CONNECTION"; 4788 case RIL_REQUEST_SET_MUTE: 4789 return "SET_MUTE"; 4790 case RIL_REQUEST_GET_MUTE: 4791 return "GET_MUTE"; 4792 case RIL_REQUEST_QUERY_CLIP: 4793 return "QUERY_CLIP"; 4794 case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: 4795 return "LAST_DATA_CALL_FAIL_CAUSE"; 4796 case RIL_REQUEST_DATA_CALL_LIST: 4797 return "DATA_CALL_LIST"; 4798 case RIL_REQUEST_RESET_RADIO: 4799 return "RESET_RADIO"; 4800 case RIL_REQUEST_OEM_HOOK_RAW: 4801 return "OEM_HOOK_RAW"; 4802 case RIL_REQUEST_OEM_HOOK_STRINGS: 4803 return "OEM_HOOK_STRINGS"; 4804 case RIL_REQUEST_SCREEN_STATE: 4805 return "SCREEN_STATE"; 4806 case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: 4807 return "SET_SUPP_SVC_NOTIFICATION"; 4808 case RIL_REQUEST_WRITE_SMS_TO_SIM: 4809 return "WRITE_SMS_TO_SIM"; 4810 case RIL_REQUEST_DELETE_SMS_ON_SIM: 4811 return "DELETE_SMS_ON_SIM"; 4812 case RIL_REQUEST_SET_BAND_MODE: 4813 return "SET_BAND_MODE"; 4814 case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: 4815 return "QUERY_AVAILABLE_BAND_MODE"; 4816 case RIL_REQUEST_STK_GET_PROFILE: 4817 return "STK_GET_PROFILE"; 4818 case RIL_REQUEST_STK_SET_PROFILE: 4819 return "STK_SET_PROFILE"; 4820 case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: 4821 return "STK_SEND_ENVELOPE_COMMAND"; 4822 case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: 4823 return "STK_SEND_TERMINAL_RESPONSE"; 4824 case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: 4825 return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM"; 4826 case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: 4827 return "EXPLICIT_CALL_TRANSFER"; 4828 case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: 4829 return "SET_PREFERRED_NETWORK_TYPE"; 4830 case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: 4831 return "GET_PREFERRED_NETWORK_TYPE"; 4832 case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: 4833 return "GET_NEIGHBORING_CELL_IDS"; 4834 case RIL_REQUEST_SET_LOCATION_UPDATES: 4835 return "SET_LOCATION_UPDATES"; 4836 case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: 4837 return "CDMA_SET_SUBSCRIPTION_SOURCE"; 4838 case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: 4839 return "CDMA_SET_ROAMING_PREFERENCE"; 4840 case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: 4841 return "CDMA_QUERY_ROAMING_PREFERENCE"; 4842 case RIL_REQUEST_SET_TTY_MODE: 4843 return "SET_TTY_MODE"; 4844 case RIL_REQUEST_QUERY_TTY_MODE: 4845 return "QUERY_TTY_MODE"; 4846 case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: 4847 return "CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE"; 4848 case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: 4849 return "CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE"; 4850 case RIL_REQUEST_CDMA_FLASH: 4851 return "CDMA_FLASH"; 4852 case RIL_REQUEST_CDMA_BURST_DTMF: 4853 return "CDMA_BURST_DTMF"; 4854 case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: 4855 return "CDMA_VALIDATE_AND_WRITE_AKEY"; 4856 case RIL_REQUEST_CDMA_SEND_SMS: 4857 return "CDMA_SEND_SMS"; 4858 case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: 4859 return "CDMA_SMS_ACKNOWLEDGE"; 4860 case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: 4861 return "GSM_GET_BROADCAST_CONFIG"; 4862 case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: 4863 return "GSM_SET_BROADCAST_CONFIG"; 4864 case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: 4865 return "GSM_BROADCAST_ACTIVATION"; 4866 case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: 4867 return "CDMA_GET_BROADCAST_CONFIG"; 4868 case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: 4869 return "CDMA_SET_BROADCAST_CONFIG"; 4870 case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: 4871 return "CDMA_BROADCAST_ACTIVATION"; 4872 case RIL_REQUEST_CDMA_SUBSCRIPTION: 4873 return "CDMA_SUBSCRIPTION"; 4874 case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: 4875 return "CDMA_WRITE_SMS_TO_RUIM"; 4876 case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: 4877 return "CDMA_DELETE_SMS_ON_RUIM"; 4878 case RIL_REQUEST_DEVICE_IDENTITY: 4879 return "DEVICE_IDENTITY"; 4880 case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: 4881 return "EXIT_EMERGENCY_CALLBACK_MODE"; 4882 case RIL_REQUEST_GET_SMSC_ADDRESS: 4883 return "GET_SMSC_ADDRESS"; 4884 case RIL_REQUEST_SET_SMSC_ADDRESS: 4885 return "SET_SMSC_ADDRESS"; 4886 case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: 4887 return "REPORT_SMS_MEMORY_STATUS"; 4888 case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: 4889 return "REPORT_STK_SERVICE_IS_RUNNING"; 4890 case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: 4891 return "CDMA_GET_SUBSCRIPTION_SOURCE"; 4892 case RIL_REQUEST_ISIM_AUTHENTICATION: 4893 return "ISIM_AUTHENTICATION"; 4894 case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: 4895 return "ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU"; 4896 case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: 4897 return "STK_SEND_ENVELOPE_WITH_STATUS"; 4898 case RIL_REQUEST_VOICE_RADIO_TECH: 4899 return "VOICE_RADIO_TECH"; 4900 case RIL_REQUEST_GET_CELL_INFO_LIST: 4901 return "GET_CELL_INFO_LIST"; 4902 case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: 4903 return "SET_CELL_INFO_LIST_RATE"; 4904 case RIL_REQUEST_SET_INITIAL_ATTACH_APN: 4905 return "SET_INITIAL_ATTACH_APN"; 4906 case RIL_REQUEST_IMS_REGISTRATION_STATE: 4907 return "IMS_REGISTRATION_STATE"; 4908 case RIL_REQUEST_IMS_SEND_SMS: 4909 return "IMS_SEND_SMS"; 4910 case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC: 4911 return "SIM_TRANSMIT_APDU_BASIC"; 4912 case RIL_REQUEST_SIM_OPEN_CHANNEL: 4913 return "SIM_OPEN_CHANNEL"; 4914 case RIL_REQUEST_SIM_CLOSE_CHANNEL: 4915 return "SIM_CLOSE_CHANNEL"; 4916 case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL: 4917 return "SIM_TRANSMIT_APDU_CHANNEL"; 4918 case RIL_REQUEST_NV_READ_ITEM: 4919 return "NV_READ_ITEM"; 4920 case RIL_REQUEST_NV_WRITE_ITEM: 4921 return "NV_WRITE_ITEM"; 4922 case RIL_REQUEST_NV_WRITE_CDMA_PRL: 4923 return "NV_WRITE_CDMA_PRL"; 4924 case RIL_REQUEST_NV_RESET_CONFIG: 4925 return "NV_RESET_CONFIG"; 4926 case RIL_REQUEST_SET_UICC_SUBSCRIPTION: 4927 return "SET_UICC_SUBSCRIPTION"; 4928 case RIL_REQUEST_ALLOW_DATA: 4929 return "ALLOW_DATA"; 4930 case RIL_REQUEST_GET_HARDWARE_CONFIG: 4931 return "GET_HARDWARE_CONFIG"; 4932 case RIL_REQUEST_SIM_AUTHENTICATION: 4933 return "SIM_AUTHENTICATION"; 4934 case RIL_REQUEST_GET_DC_RT_INFO: 4935 return "GET_DC_RT_INFO"; 4936 case RIL_REQUEST_SET_DC_RT_INFO_RATE: 4937 return "SET_DC_RT_INFO_RATE"; 4938 case RIL_REQUEST_SET_DATA_PROFILE: 4939 return "SET_DATA_PROFILE"; 4940 case RIL_REQUEST_SHUTDOWN: 4941 return "SHUTDOWN"; 4942 case RIL_REQUEST_GET_RADIO_CAPABILITY: 4943 return "GET_RADIO_CAPABILITY"; 4944 case RIL_REQUEST_SET_RADIO_CAPABILITY: 4945 return "SET_RADIO_CAPABILITY"; 4946 case RIL_REQUEST_START_LCE: 4947 return "START_LCE"; 4948 case RIL_REQUEST_STOP_LCE: 4949 return "STOP_LCE"; 4950 case RIL_REQUEST_PULL_LCEDATA: 4951 return "PULL_LCEDATA"; 4952 case RIL_REQUEST_GET_ACTIVITY_INFO: 4953 return "GET_ACTIVITY_INFO"; 4954 case RIL_REQUEST_SET_ALLOWED_CARRIERS: 4955 return "SET_ALLOWED_CARRIERS"; 4956 case RIL_REQUEST_GET_ALLOWED_CARRIERS: 4957 return "GET_ALLOWED_CARRIERS"; 4958 case RIL_REQUEST_SEND_DEVICE_STATE: 4959 return "SEND_DEVICE_STATE"; 4960 case RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER: 4961 return "SET_UNSOLICITED_RESPONSE_FILTER"; 4962 case RIL_REQUEST_SET_SIM_CARD_POWER: 4963 return "SET_SIM_CARD_POWER"; 4964 case RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION: 4965 return "SET_CARRIER_INFO_IMSI_ENCRYPTION"; 4966 case RIL_REQUEST_START_NETWORK_SCAN: 4967 return "START_NETWORK_SCAN"; 4968 case RIL_REQUEST_STOP_NETWORK_SCAN: 4969 return "STOP_NETWORK_SCAN"; 4970 case RIL_REQUEST_START_KEEPALIVE: 4971 return "START_KEEPALIVE"; 4972 case RIL_REQUEST_STOP_KEEPALIVE: 4973 return "STOP_KEEPALIVE"; 4974 case RIL_REQUEST_ENABLE_MODEM: 4975 return "ENABLE_MODEM"; 4976 case RIL_REQUEST_GET_MODEM_STATUS: 4977 return "GET_MODEM_STATUS"; 4978 case RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE: 4979 return "CDMA_SEND_SMS_EXPECT_MORE"; 4980 case RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY: 4981 return "GET_SIM_PHONEBOOK_CAPACITY"; 4982 case RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS: 4983 return "GET_SIM_PHONEBOOK_RECORDS"; 4984 case RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORD: 4985 return "UPDATE_SIM_PHONEBOOK_RECORD"; 4986 case RIL_REQUEST_GET_SLOT_STATUS: 4987 return "GET_SLOT_STATUS"; 4988 case RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING: 4989 return "SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING"; 4990 case RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA: 4991 return "SET_SIGNAL_STRENGTH_REPORTING_CRITERIA"; 4992 case RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA: 4993 return "SET_LINK_CAPACITY_REPORTING_CRITERIA"; 4994 case RIL_REQUEST_SET_PREFERRED_DATA_MODEM: 4995 return "SET_PREFERRED_DATA_MODEM"; 4996 case RIL_REQUEST_EMERGENCY_DIAL: 4997 return "EMERGENCY_DIAL"; 4998 case RIL_REQUEST_GET_PHONE_CAPABILITY: 4999 return "GET_PHONE_CAPABILITY"; 5000 case RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG: 5001 return "SWITCH_DUAL_SIM_CONFIG"; 5002 case RIL_REQUEST_ENABLE_UICC_APPLICATIONS: 5003 return "ENABLE_UICC_APPLICATIONS"; 5004 case RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT: 5005 return "GET_UICC_APPLICATIONS_ENABLEMENT"; 5006 case RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS: 5007 return "SET_SYSTEM_SELECTION_CHANNELS"; 5008 case RIL_REQUEST_GET_BARRING_INFO: 5009 return "GET_BARRING_INFO"; 5010 case RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION: 5011 return "ENTER_SIM_DEPERSONALIZATION"; 5012 case RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY: 5013 return "ENABLE_NR_DUAL_CONNECTIVITY"; 5014 case RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED: 5015 return "IS_NR_DUAL_CONNECTIVITY_ENABLED"; 5016 case RIL_REQUEST_ALLOCATE_PDU_SESSION_ID: 5017 return "ALLOCATE_PDU_SESSION_ID"; 5018 case RIL_REQUEST_RELEASE_PDU_SESSION_ID: 5019 return "RELEASE_PDU_SESSION_ID"; 5020 case RIL_REQUEST_START_HANDOVER: 5021 return "START_HANDOVER"; 5022 case RIL_REQUEST_CANCEL_HANDOVER: 5023 return "CANCEL_HANDOVER"; 5024 case RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS: 5025 return "GET_SYSTEM_SELECTION_CHANNELS"; 5026 case RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES: 5027 return "GET_HAL_DEVICE_CAPABILITIES"; 5028 case RIL_REQUEST_SET_DATA_THROTTLING: 5029 return "SET_DATA_THROTTLING"; 5030 case RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP: 5031 return "SET_ALLOWED_NETWORK_TYPES_BITMAP"; 5032 case RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP: 5033 return "GET_ALLOWED_NETWORK_TYPES_BITMAP"; 5034 case RIL_REQUEST_GET_SLICING_CONFIG: 5035 return "GET_SLICING_CONFIG"; 5036 case RIL_REQUEST_ENABLE_VONR: 5037 return "ENABLE_VONR"; 5038 case RIL_REQUEST_IS_VONR_ENABLED: 5039 return "IS_VONR_ENABLED"; 5040 case RIL_REQUEST_SET_USAGE_SETTING: 5041 return "SET_USAGE_SETTING"; 5042 case RIL_REQUEST_GET_USAGE_SETTING: 5043 return "GET_USAGE_SETTING"; 5044 default: 5045 return "<unknown request " + request + ">"; 5046 } 5047 } 5048 5049 /** 5050 * RIL response to String 5051 * @param response response 5052 * @return The converted String response 5053 */ responseToString(int response)5054 public static String responseToString(int response) { 5055 switch (response) { 5056 case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: 5057 return "UNSOL_RESPONSE_RADIO_STATE_CHANGED"; 5058 case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: 5059 return "UNSOL_RESPONSE_CALL_STATE_CHANGED"; 5060 case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED: 5061 return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED"; 5062 case RIL_UNSOL_RESPONSE_NEW_SMS: 5063 return "UNSOL_RESPONSE_NEW_SMS"; 5064 case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: 5065 return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT"; 5066 case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: 5067 return "UNSOL_RESPONSE_NEW_SMS_ON_SIM"; 5068 case RIL_UNSOL_ON_USSD: 5069 return "UNSOL_ON_USSD"; 5070 case RIL_UNSOL_ON_USSD_REQUEST: 5071 return "UNSOL_ON_USSD_REQUEST"; 5072 case RIL_UNSOL_NITZ_TIME_RECEIVED: 5073 return "UNSOL_NITZ_TIME_RECEIVED"; 5074 case RIL_UNSOL_SIGNAL_STRENGTH: 5075 return "UNSOL_SIGNAL_STRENGTH"; 5076 case RIL_UNSOL_DATA_CALL_LIST_CHANGED: 5077 return "UNSOL_DATA_CALL_LIST_CHANGED"; 5078 case RIL_UNSOL_SUPP_SVC_NOTIFICATION: 5079 return "UNSOL_SUPP_SVC_NOTIFICATION"; 5080 case RIL_UNSOL_STK_SESSION_END: 5081 return "UNSOL_STK_SESSION_END"; 5082 case RIL_UNSOL_STK_PROACTIVE_COMMAND: 5083 return "UNSOL_STK_PROACTIVE_COMMAND"; 5084 case RIL_UNSOL_STK_EVENT_NOTIFY: 5085 return "UNSOL_STK_EVENT_NOTIFY"; 5086 case RIL_UNSOL_STK_CALL_SETUP: 5087 return "UNSOL_STK_CALL_SETUP"; 5088 case RIL_UNSOL_SIM_SMS_STORAGE_FULL: 5089 return "UNSOL_SIM_SMS_STORAGE_FULL"; 5090 case RIL_UNSOL_SIM_REFRESH: 5091 return "UNSOL_SIM_REFRESH"; 5092 case RIL_UNSOL_CALL_RING: 5093 return "UNSOL_CALL_RING"; 5094 case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: 5095 return "UNSOL_RESPONSE_SIM_STATUS_CHANGED"; 5096 case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: 5097 return "UNSOL_RESPONSE_CDMA_NEW_SMS"; 5098 case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: 5099 return "UNSOL_RESPONSE_NEW_BROADCAST_SMS"; 5100 case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: 5101 return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL"; 5102 case RIL_UNSOL_RESTRICTED_STATE_CHANGED: 5103 return "UNSOL_RESTRICTED_STATE_CHANGED"; 5104 case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: 5105 return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE"; 5106 case RIL_UNSOL_CDMA_CALL_WAITING: 5107 return "UNSOL_CDMA_CALL_WAITING"; 5108 case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: 5109 return "UNSOL_CDMA_OTA_PROVISION_STATUS"; 5110 case RIL_UNSOL_CDMA_INFO_REC: 5111 return "UNSOL_CDMA_INFO_REC"; 5112 case RIL_UNSOL_OEM_HOOK_RAW: 5113 return "UNSOL_OEM_HOOK_RAW"; 5114 case RIL_UNSOL_RINGBACK_TONE: 5115 return "UNSOL_RINGBACK_TONE"; 5116 case RIL_UNSOL_RESEND_INCALL_MUTE: 5117 return "UNSOL_RESEND_INCALL_MUTE"; 5118 case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: 5119 return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED"; 5120 case RIL_UNSOL_CDMA_PRL_CHANGED: 5121 return "UNSOL_CDMA_PRL_CHANGED"; 5122 case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: 5123 return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE"; 5124 case RIL_UNSOL_RIL_CONNECTED: 5125 return "UNSOL_RIL_CONNECTED"; 5126 case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: 5127 return "UNSOL_VOICE_RADIO_TECH_CHANGED"; 5128 case RIL_UNSOL_CELL_INFO_LIST: 5129 return "UNSOL_CELL_INFO_LIST"; 5130 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: 5131 return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED"; 5132 case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED: 5133 return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED"; 5134 case RIL_UNSOL_SRVCC_STATE_NOTIFY: 5135 return "UNSOL_SRVCC_STATE_NOTIFY"; 5136 case RIL_UNSOL_HARDWARE_CONFIG_CHANGED: 5137 return "UNSOL_HARDWARE_CONFIG_CHANGED"; 5138 case RIL_UNSOL_DC_RT_INFO_CHANGED: 5139 return "UNSOL_DC_RT_INFO_CHANGED"; 5140 case RIL_UNSOL_RADIO_CAPABILITY: 5141 return "UNSOL_RADIO_CAPABILITY"; 5142 case RIL_UNSOL_ON_SS: 5143 return "UNSOL_ON_SS"; 5144 case RIL_UNSOL_STK_CC_ALPHA_NOTIFY: 5145 return "UNSOL_STK_CC_ALPHA_NOTIFY"; 5146 case RIL_UNSOL_LCEDATA_RECV: 5147 return "UNSOL_LCE_INFO_RECV"; 5148 case RIL_UNSOL_PCO_DATA: 5149 return "UNSOL_PCO_DATA"; 5150 case RIL_UNSOL_MODEM_RESTART: 5151 return "UNSOL_MODEM_RESTART"; 5152 case RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION: 5153 return "UNSOL_CARRIER_INFO_IMSI_ENCRYPTION"; 5154 case RIL_UNSOL_NETWORK_SCAN_RESULT: 5155 return "UNSOL_NETWORK_SCAN_RESULT"; 5156 case RIL_UNSOL_KEEPALIVE_STATUS: 5157 return "UNSOL_KEEPALIVE_STATUS"; 5158 case RIL_UNSOL_UNTHROTTLE_APN: 5159 return "UNSOL_UNTHROTTLE_APN"; 5160 case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED: 5161 return "UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED"; 5162 case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED: 5163 return "UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED"; 5164 case RIL_UNSOL_ICC_SLOT_STATUS: 5165 return "UNSOL_ICC_SLOT_STATUS"; 5166 case RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG: 5167 return "UNSOL_PHYSICAL_CHANNEL_CONFIG"; 5168 case RIL_UNSOL_EMERGENCY_NUMBER_LIST: 5169 return "UNSOL_EMERGENCY_NUMBER_LIST"; 5170 case RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED: 5171 return "UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED"; 5172 case RIL_UNSOL_REGISTRATION_FAILED: 5173 return "UNSOL_REGISTRATION_FAILED"; 5174 case RIL_UNSOL_BARRING_INFO_CHANGED: 5175 return "UNSOL_BARRING_INFO_CHANGED"; 5176 default: 5177 return "<unknown response>"; 5178 } 5179 } 5180 5181 /** 5182 * Create capabilities based off of the radio hal version and feature set configurations. 5183 * @param radioHalVersion radio hal version 5184 * @param modemReducedFeatureSet1 reduced feature set 5185 * @return set of capabilities 5186 */ 5187 @VisibleForTesting getCaps(HalVersion radioHalVersion, boolean modemReducedFeatureSet1)5188 public static Set<String> getCaps(HalVersion radioHalVersion, boolean modemReducedFeatureSet1) { 5189 final Set<String> caps = new HashSet<>(); 5190 5191 if (radioHalVersion.equals(RIL.RADIO_HAL_VERSION_UNKNOWN)) { 5192 // If the Radio HAL is UNKNOWN, no capabilities will present themselves. 5193 loge("Radio Hal Version is UNKNOWN!"); 5194 } 5195 5196 logd("Radio Hal Version = " + radioHalVersion.toString()); 5197 if (radioHalVersion.greaterOrEqual(RIL.RADIO_HAL_VERSION_1_6)) { 5198 caps.add(CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); 5199 logd("CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK"); 5200 5201 if (!modemReducedFeatureSet1) { 5202 caps.add(CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE); 5203 logd("CAPABILITY_SECONDARY_LINK_BANDWIDTH_VISIBLE"); 5204 caps.add(CAPABILITY_NR_DUAL_CONNECTIVITY_CONFIGURATION_AVAILABLE); 5205 logd("CAPABILITY_NR_DUAL_CONNECTIVITY_CONFIGURATION_AVAILABLE"); 5206 caps.add(CAPABILITY_THERMAL_MITIGATION_DATA_THROTTLING); 5207 logd("CAPABILITY_THERMAL_MITIGATION_DATA_THROTTLING"); 5208 caps.add(CAPABILITY_SLICING_CONFIG_SUPPORTED); 5209 logd("CAPABILITY_SLICING_CONFIG_SUPPORTED"); 5210 caps.add(CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED); 5211 logd("CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED"); 5212 } else { 5213 caps.add(CAPABILITY_SIM_PHONEBOOK_IN_MODEM); 5214 logd("CAPABILITY_SIM_PHONEBOOK_IN_MODEM"); 5215 } 5216 } 5217 return caps; 5218 } 5219 isPrimitiveOrWrapper(Class c)5220 private static boolean isPrimitiveOrWrapper(Class c) { 5221 return c.isPrimitive() || WRAPPER_CLASSES.contains(c); 5222 } 5223 5224 /** 5225 * Return a general String representation of a class 5226 * @param o The object to convert to String 5227 * @return A string containing all public non-static local variables of a class 5228 */ convertToString(Object o)5229 public static String convertToString(Object o) { 5230 boolean toStringExists = false; 5231 try { 5232 toStringExists = o.getClass().getMethod("toString").getDeclaringClass() != Object.class; 5233 } catch (NoSuchMethodException e) { 5234 loge(e.toString()); 5235 } 5236 if (toStringExists || isPrimitiveOrWrapper(o.getClass()) || o instanceof ArrayList) { 5237 return o.toString(); 5238 } 5239 if (o.getClass().isArray()) { 5240 // Special handling for arrays 5241 StringBuilder sb = new StringBuilder("["); 5242 boolean added = false; 5243 if (isPrimitiveOrWrapper(o.getClass().getComponentType())) { 5244 for (int i = 0; i < Array.getLength(o); i++) { 5245 sb.append(convertToString(Array.get(o, i))).append(", "); 5246 added = true; 5247 } 5248 } else { 5249 for (Object element : (Object[]) o) { 5250 sb.append(convertToString(element)).append(", "); 5251 added = true; 5252 } 5253 } 5254 if (added) { 5255 // Remove extra , 5256 sb.delete(sb.length() - 2, sb.length()); 5257 } 5258 sb.append("]"); 5259 return sb.toString(); 5260 } 5261 StringBuilder sb = new StringBuilder(o.getClass().getSimpleName()); 5262 sb.append("{"); 5263 Field[] fields = o.getClass().getDeclaredFields(); 5264 int tag = -1; 5265 try { 5266 tag = (int) o.getClass().getDeclaredMethod("getTag").invoke(o); 5267 } catch (IllegalAccessException | InvocationTargetException e) { 5268 loge(e.toString()); 5269 } catch (NoSuchMethodException ignored) { 5270 // Ignored since only unions have the getTag method 5271 } 5272 if (tag != -1) { 5273 // Special handling for unions 5274 String tagName = null; 5275 try { 5276 Method method = o.getClass().getDeclaredMethod("_tagString", int.class); 5277 method.setAccessible(true); 5278 tagName = (String) method.invoke(o, tag); 5279 } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { 5280 loge(e.toString()); 5281 } 5282 if (tagName != null) { 5283 sb.append(tagName); 5284 sb.append("="); 5285 // From tag, create method name getTag 5286 String getTagMethod = "get" + tagName.substring(0, 1).toUpperCase(Locale.ROOT) 5287 + tagName.substring(1); 5288 Object val = null; 5289 try { 5290 val = o.getClass().getDeclaredMethod(getTagMethod).invoke(o); 5291 } catch (NoSuchMethodException | IllegalAccessException 5292 | InvocationTargetException e) { 5293 loge(e.toString()); 5294 } 5295 if (val != null) { 5296 sb.append(convertToString(val)); 5297 } 5298 } 5299 } else { 5300 boolean added = false; 5301 for (Field field : fields) { 5302 // Ignore static variables 5303 if (Modifier.isStatic(field.getModifiers())) continue; 5304 sb.append(field.getName()).append("="); 5305 Object val = null; 5306 try { 5307 val = field.get(o); 5308 } catch (IllegalAccessException e) { 5309 loge(e.toString()); 5310 } 5311 if (val == null) continue; 5312 sb.append(convertToString(val)).append(", "); 5313 added = true; 5314 } 5315 if (added) { 5316 // Remove extra , 5317 sb.delete(sb.length() - 2, sb.length()); 5318 } 5319 } 5320 sb.append("}"); 5321 return sb.toString(); 5322 } 5323 logd(String log)5324 private static void logd(String log) { 5325 Rlog.d("RILUtils", log); 5326 } 5327 loge(String log)5328 private static void loge(String log) { 5329 Rlog.e("RILUtils", log); 5330 } 5331 } 5332