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