• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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