1 /* 2 * Copyright (C) 2011 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 android.telephony.cts; 18 19 import android.app.Instrumentation; 20 import android.os.ParcelFileDescriptor; 21 import android.telecom.TelecomManager; 22 import android.telephony.AccessNetworkConstants; 23 import android.telephony.TelephonyManager; 24 25 import java.io.BufferedReader; 26 import java.io.FileInputStream; 27 import java.io.InputStream; 28 import java.io.InputStreamReader; 29 import java.lang.reflect.Field; 30 import java.nio.charset.StandardCharsets; 31 import java.util.List; 32 import java.util.Map; 33 import java.util.function.BooleanSupplier; 34 35 public class TelephonyUtils { 36 37 /** 38 * See {@link TelecomManager#ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION} 39 */ 40 public static final String ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION_STRING = 41 "ENABLE_GET_CALL_STATE_PERMISSION_PROTECTION"; 42 43 /** 44 * See com.android.services.telephony.rcs.DelegateStateTracker# 45 * SUPPORT_REGISTERING_DELEGATE_STATE 46 */ 47 public static final String SUPPORT_REGISTERING_DELEGATE_STATE_STRING = 48 "SUPPORT_REGISTERING_DELEGATE_STATE"; 49 /** 50 * See com.android.services.telephony.rcs.DelegateStateTracker# 51 * SUPPORT_DEREGISTERING_LOSING_PDN_STATE 52 */ 53 public static final String SUPPORT_DEREGISTERING_LOSING_PDN_STATE_STRING = 54 "SUPPORT_DEREGISTERING_LOSING_PDN_STATE"; 55 56 /** 57 * A map of {@link AccessNetworkConstants.RadioAccessNetworkType}s and its associated bands. 58 */ 59 public static final Map<Integer, List<Integer>> ALL_BANDS = Map.of( 60 AccessNetworkConstants.AccessNetworkType.GERAN, List.of( 61 AccessNetworkConstants.GeranBand.BAND_T380, 62 AccessNetworkConstants.GeranBand.BAND_T410, 63 AccessNetworkConstants.GeranBand.BAND_450, 64 AccessNetworkConstants.GeranBand.BAND_480, 65 AccessNetworkConstants.GeranBand.BAND_710, 66 AccessNetworkConstants.GeranBand.BAND_750, 67 AccessNetworkConstants.GeranBand.BAND_T810, 68 AccessNetworkConstants.GeranBand.BAND_850, 69 AccessNetworkConstants.GeranBand.BAND_P900, 70 AccessNetworkConstants.GeranBand.BAND_E900, 71 AccessNetworkConstants.GeranBand.BAND_R900, 72 AccessNetworkConstants.GeranBand.BAND_DCS1800, 73 AccessNetworkConstants.GeranBand.BAND_PCS1900, 74 AccessNetworkConstants.GeranBand.BAND_ER900), 75 AccessNetworkConstants.AccessNetworkType.UTRAN, List.of( 76 AccessNetworkConstants.UtranBand.BAND_1, 77 AccessNetworkConstants.UtranBand.BAND_2, 78 AccessNetworkConstants.UtranBand.BAND_3, 79 AccessNetworkConstants.UtranBand.BAND_4, 80 AccessNetworkConstants.UtranBand.BAND_5, 81 AccessNetworkConstants.UtranBand.BAND_6, 82 AccessNetworkConstants.UtranBand.BAND_7, 83 AccessNetworkConstants.UtranBand.BAND_8, 84 AccessNetworkConstants.UtranBand.BAND_9, 85 AccessNetworkConstants.UtranBand.BAND_10, 86 AccessNetworkConstants.UtranBand.BAND_11, 87 AccessNetworkConstants.UtranBand.BAND_12, 88 AccessNetworkConstants.UtranBand.BAND_13, 89 AccessNetworkConstants.UtranBand.BAND_14, 90 AccessNetworkConstants.UtranBand.BAND_19, 91 AccessNetworkConstants.UtranBand.BAND_20, 92 AccessNetworkConstants.UtranBand.BAND_21, 93 AccessNetworkConstants.UtranBand.BAND_22, 94 AccessNetworkConstants.UtranBand.BAND_25, 95 AccessNetworkConstants.UtranBand.BAND_26, 96 AccessNetworkConstants.UtranBand.BAND_A, 97 AccessNetworkConstants.UtranBand.BAND_B, 98 AccessNetworkConstants.UtranBand.BAND_C, 99 AccessNetworkConstants.UtranBand.BAND_D, 100 AccessNetworkConstants.UtranBand.BAND_E, 101 AccessNetworkConstants.UtranBand.BAND_F), 102 AccessNetworkConstants.AccessNetworkType.EUTRAN, List.of( 103 AccessNetworkConstants.EutranBand.BAND_1, 104 AccessNetworkConstants.EutranBand.BAND_2, 105 AccessNetworkConstants.EutranBand.BAND_3, 106 AccessNetworkConstants.EutranBand.BAND_4, 107 AccessNetworkConstants.EutranBand.BAND_5, 108 AccessNetworkConstants.EutranBand.BAND_6, 109 AccessNetworkConstants.EutranBand.BAND_7, 110 AccessNetworkConstants.EutranBand.BAND_8, 111 AccessNetworkConstants.EutranBand.BAND_9, 112 AccessNetworkConstants.EutranBand.BAND_10, 113 AccessNetworkConstants.EutranBand.BAND_11, 114 AccessNetworkConstants.EutranBand.BAND_12, 115 AccessNetworkConstants.EutranBand.BAND_13, 116 AccessNetworkConstants.EutranBand.BAND_14, 117 AccessNetworkConstants.EutranBand.BAND_17, 118 AccessNetworkConstants.EutranBand.BAND_18, 119 AccessNetworkConstants.EutranBand.BAND_19, 120 AccessNetworkConstants.EutranBand.BAND_20, 121 AccessNetworkConstants.EutranBand.BAND_21, 122 AccessNetworkConstants.EutranBand.BAND_22, 123 AccessNetworkConstants.EutranBand.BAND_23, 124 AccessNetworkConstants.EutranBand.BAND_24, 125 AccessNetworkConstants.EutranBand.BAND_25, 126 AccessNetworkConstants.EutranBand.BAND_26, 127 AccessNetworkConstants.EutranBand.BAND_27, 128 AccessNetworkConstants.EutranBand.BAND_28, 129 AccessNetworkConstants.EutranBand.BAND_30, 130 AccessNetworkConstants.EutranBand.BAND_31, 131 AccessNetworkConstants.EutranBand.BAND_33, 132 AccessNetworkConstants.EutranBand.BAND_34, 133 AccessNetworkConstants.EutranBand.BAND_35, 134 AccessNetworkConstants.EutranBand.BAND_36, 135 AccessNetworkConstants.EutranBand.BAND_37, 136 AccessNetworkConstants.EutranBand.BAND_38, 137 AccessNetworkConstants.EutranBand.BAND_39, 138 AccessNetworkConstants.EutranBand.BAND_40, 139 AccessNetworkConstants.EutranBand.BAND_41, 140 AccessNetworkConstants.EutranBand.BAND_42, 141 AccessNetworkConstants.EutranBand.BAND_43, 142 AccessNetworkConstants.EutranBand.BAND_44, 143 AccessNetworkConstants.EutranBand.BAND_45, 144 AccessNetworkConstants.EutranBand.BAND_46, 145 AccessNetworkConstants.EutranBand.BAND_47, 146 AccessNetworkConstants.EutranBand.BAND_48, 147 AccessNetworkConstants.EutranBand.BAND_49, 148 AccessNetworkConstants.EutranBand.BAND_50, 149 AccessNetworkConstants.EutranBand.BAND_51, 150 AccessNetworkConstants.EutranBand.BAND_52, 151 AccessNetworkConstants.EutranBand.BAND_53, 152 AccessNetworkConstants.EutranBand.BAND_65, 153 AccessNetworkConstants.EutranBand.BAND_66, 154 AccessNetworkConstants.EutranBand.BAND_68, 155 AccessNetworkConstants.EutranBand.BAND_70, 156 AccessNetworkConstants.EutranBand.BAND_71, 157 AccessNetworkConstants.EutranBand.BAND_72, 158 AccessNetworkConstants.EutranBand.BAND_73, 159 AccessNetworkConstants.EutranBand.BAND_74, 160 AccessNetworkConstants.EutranBand.BAND_85, 161 AccessNetworkConstants.EutranBand.BAND_87, 162 AccessNetworkConstants.EutranBand.BAND_88), 163 AccessNetworkConstants.AccessNetworkType.NGRAN, List.of( 164 AccessNetworkConstants.NgranBands.BAND_1, 165 AccessNetworkConstants.NgranBands.BAND_2, 166 AccessNetworkConstants.NgranBands.BAND_3, 167 AccessNetworkConstants.NgranBands.BAND_5, 168 AccessNetworkConstants.NgranBands.BAND_7, 169 AccessNetworkConstants.NgranBands.BAND_8, 170 AccessNetworkConstants.NgranBands.BAND_12, 171 AccessNetworkConstants.NgranBands.BAND_14, 172 AccessNetworkConstants.NgranBands.BAND_18, 173 AccessNetworkConstants.NgranBands.BAND_20, 174 AccessNetworkConstants.NgranBands.BAND_25, 175 AccessNetworkConstants.NgranBands.BAND_26, 176 AccessNetworkConstants.NgranBands.BAND_28, 177 AccessNetworkConstants.NgranBands.BAND_29, 178 AccessNetworkConstants.NgranBands.BAND_30, 179 AccessNetworkConstants.NgranBands.BAND_34, 180 AccessNetworkConstants.NgranBands.BAND_38, 181 AccessNetworkConstants.NgranBands.BAND_39, 182 AccessNetworkConstants.NgranBands.BAND_40, 183 AccessNetworkConstants.NgranBands.BAND_41, 184 AccessNetworkConstants.NgranBands.BAND_46, 185 AccessNetworkConstants.NgranBands.BAND_48, 186 AccessNetworkConstants.NgranBands.BAND_50, 187 AccessNetworkConstants.NgranBands.BAND_51, 188 AccessNetworkConstants.NgranBands.BAND_53, 189 AccessNetworkConstants.NgranBands.BAND_65, 190 AccessNetworkConstants.NgranBands.BAND_66, 191 AccessNetworkConstants.NgranBands.BAND_70, 192 AccessNetworkConstants.NgranBands.BAND_71, 193 AccessNetworkConstants.NgranBands.BAND_74, 194 AccessNetworkConstants.NgranBands.BAND_75, 195 AccessNetworkConstants.NgranBands.BAND_76, 196 AccessNetworkConstants.NgranBands.BAND_77, 197 AccessNetworkConstants.NgranBands.BAND_78, 198 AccessNetworkConstants.NgranBands.BAND_79, 199 AccessNetworkConstants.NgranBands.BAND_80, 200 AccessNetworkConstants.NgranBands.BAND_81, 201 AccessNetworkConstants.NgranBands.BAND_82, 202 AccessNetworkConstants.NgranBands.BAND_83, 203 AccessNetworkConstants.NgranBands.BAND_84, 204 AccessNetworkConstants.NgranBands.BAND_86, 205 AccessNetworkConstants.NgranBands.BAND_89, 206 AccessNetworkConstants.NgranBands.BAND_90, 207 AccessNetworkConstants.NgranBands.BAND_91, 208 AccessNetworkConstants.NgranBands.BAND_92, 209 AccessNetworkConstants.NgranBands.BAND_93, 210 AccessNetworkConstants.NgranBands.BAND_94, 211 AccessNetworkConstants.NgranBands.BAND_95, 212 AccessNetworkConstants.NgranBands.BAND_96, 213 AccessNetworkConstants.NgranBands.BAND_257, 214 AccessNetworkConstants.NgranBands.BAND_258, 215 AccessNetworkConstants.NgranBands.BAND_260, 216 AccessNetworkConstants.NgranBands.BAND_261)); 217 218 private static final String COMMAND_ADD_TEST_EMERGENCY_NUMBER = 219 "cmd phone emergency-number-test-mode -a "; 220 221 private static final String COMMAND_REMOVE_TEST_EMERGENCY_NUMBER = 222 "cmd phone emergency-number-test-mode -r "; 223 224 private static final String COMMAND_END_BLOCK_SUPPRESSION = "cmd phone end-block-suppression"; 225 226 private static final String COMMAND_FLUSH_TELEPHONY_METRICS = 227 "/system/bin/dumpsys activity service TelephonyDebugService --metricsproto"; 228 229 private static final String COMMAND_AM_COMPAT = "am compat "; 230 231 public static final String CTS_APP_PACKAGE = "android.telephony.cts"; 232 public static final String CTS_APP_PACKAGE2 = "android.telephony2.cts"; 233 234 private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 235 'A', 'B', 'C', 'D', 'E', 'F' }; 236 addTestEmergencyNumber(Instrumentation instr, String testNumber)237 public static void addTestEmergencyNumber(Instrumentation instr, String testNumber) 238 throws Exception { 239 executeShellCommand(instr, COMMAND_ADD_TEST_EMERGENCY_NUMBER + testNumber); 240 } 241 removeTestEmergencyNumber(Instrumentation instr, String testNumber)242 public static void removeTestEmergencyNumber(Instrumentation instr, String testNumber) 243 throws Exception { 244 executeShellCommand(instr, COMMAND_REMOVE_TEST_EMERGENCY_NUMBER + testNumber); 245 } 246 endBlockSuppression(Instrumentation instr)247 public static void endBlockSuppression(Instrumentation instr) throws Exception { 248 executeShellCommand(instr, COMMAND_END_BLOCK_SUPPRESSION); 249 } 250 flushTelephonyMetrics(Instrumentation instr)251 public static void flushTelephonyMetrics(Instrumentation instr) throws Exception { 252 executeShellCommand(instr, COMMAND_FLUSH_TELEPHONY_METRICS); 253 } 254 enableCompatCommand(Instrumentation instr, String pkgName, String commandName)255 public static void enableCompatCommand(Instrumentation instr, String pkgName, 256 String commandName) throws Exception { 257 executeShellCommand(instr, COMMAND_AM_COMPAT + "enable --no-kill " + commandName + " " 258 + pkgName); 259 } 260 disableCompatCommand(Instrumentation instr, String pkgName, String commandName)261 public static void disableCompatCommand(Instrumentation instr, String pkgName, 262 String commandName) throws Exception { 263 executeShellCommand(instr, COMMAND_AM_COMPAT + "disable --no-kill " + commandName + " " 264 + pkgName); 265 } 266 resetCompatCommand(Instrumentation instr, String pkgName, String commandName)267 public static void resetCompatCommand(Instrumentation instr, String pkgName, 268 String commandName) throws Exception { 269 executeShellCommand(instr, COMMAND_AM_COMPAT + "reset --no-kill " + commandName + " " 270 + pkgName); 271 } 272 isSkt(TelephonyManager telephonyManager)273 public static boolean isSkt(TelephonyManager telephonyManager) { 274 return isOperator(telephonyManager, "45005"); 275 } 276 isKt(TelephonyManager telephonyManager)277 public static boolean isKt(TelephonyManager telephonyManager) { 278 return isOperator(telephonyManager, "45002") 279 || isOperator(telephonyManager, "45004") 280 || isOperator(telephonyManager, "45008"); 281 } 282 isOperator(TelephonyManager telephonyManager, String operator)283 private static boolean isOperator(TelephonyManager telephonyManager, String operator) { 284 String simOperator = telephonyManager.getSimOperator(); 285 return simOperator != null && simOperator.equals(operator); 286 } 287 parseErrorCodeToString(int errorCode, Class<?> containingClass, String prefix)288 public static String parseErrorCodeToString(int errorCode, 289 Class<?> containingClass, String prefix) { 290 for (Field field : containingClass.getDeclaredFields()) { 291 if (field.getName().startsWith(prefix)) { 292 if (field.getType() == Integer.TYPE) { 293 field.setAccessible(true); 294 try { 295 if (field.getInt(null) == errorCode) { 296 return field.getName(); 297 } 298 } catch (IllegalAccessException e) { 299 continue; 300 } 301 } 302 } 303 } 304 return String.format("??%d??", errorCode); 305 } 306 307 /** 308 * Executes the given shell command and returns the output in a string. Note that even 309 * if we don't care about the output, we have to read the stream completely to make the 310 * command execute. 311 */ executeShellCommand(Instrumentation instrumentation, String command)312 public static String executeShellCommand(Instrumentation instrumentation, 313 String command) throws Exception { 314 final ParcelFileDescriptor pfd = 315 instrumentation.getUiAutomation().executeShellCommand(command); 316 BufferedReader br = null; 317 try (InputStream in = new FileInputStream(pfd.getFileDescriptor())) { 318 br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); 319 String str = null; 320 StringBuilder out = new StringBuilder(); 321 while ((str = br.readLine()) != null) { 322 out.append(str); 323 } 324 return out.toString(); 325 } finally { 326 if (br != null) { 327 closeQuietly(br); 328 } 329 closeQuietly(pfd); 330 } 331 } 332 closeQuietly(AutoCloseable closeable)333 private static void closeQuietly(AutoCloseable closeable) { 334 if (closeable != null) { 335 try { 336 closeable.close(); 337 } catch (RuntimeException rethrown) { 338 throw rethrown; 339 } catch (Exception ignored) { 340 } 341 } 342 } 343 pollUntilTrue(BooleanSupplier s, int times, int timeoutMs)344 public static boolean pollUntilTrue(BooleanSupplier s, int times, int timeoutMs) { 345 boolean successful = false; 346 for (int i = 0; i < times; i++) { 347 successful = s.getAsBoolean(); 348 if (successful) break; 349 try { 350 Thread.sleep(timeoutMs); 351 } catch (InterruptedException e) { } 352 } 353 return successful; 354 } 355 toHexString(byte[] array)356 public static String toHexString(byte[] array) { 357 int length = array.length; 358 char[] buf = new char[length * 2]; 359 360 int bufIndex = 0; 361 for (byte b : array) { 362 buf[bufIndex++] = HEX_DIGITS[(b >>> 4) & 0x0F]; 363 buf[bufIndex++] = HEX_DIGITS[b & 0x0F]; 364 } 365 366 return new String(buf); 367 } 368 toByte(char c)369 private static int toByte(char c) { 370 if (c >= '0' && c <= '9') return (c - '0'); 371 if (c >= 'A' && c <= 'F') return (c - 'A' + 10); 372 if (c >= 'a' && c <= 'f') return (c - 'a' + 10); 373 374 throw new RuntimeException("Invalid hex char '" + c + "'"); 375 } 376 hexStringToByteArray(String hexString)377 public static byte[] hexStringToByteArray(String hexString) { 378 int length = hexString.length(); 379 byte[] buffer = new byte[length / 2]; 380 381 for (int i = 0; i < length; i += 2) { 382 buffer[i / 2] = 383 (byte) ((toByte(hexString.charAt(i)) << 4) | toByte(hexString.charAt(i + 1))); 384 } 385 386 return buffer; 387 } 388 } 389