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