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