blob: 49e96a020d14643c116b1b3fd1494c050f698bb3 [file] [log] [blame]
The Android Open Source Projectf8057102009-03-15 16:47:16 -07001/*
Brian Muramatsu40bdc5e2010-08-13 16:20:15 -07002 * Copyright (C) 2008 The Android Open Source Project
The Android Open Source Projectf8057102009-03-15 16:47:16 -07003 *
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
17package android.tests.getinfo;
18
19import android.app.Activity;
20import android.app.Instrumentation;
21import android.content.Context;
22import android.content.Intent;
Brian Muramatsu4af6c4e2010-06-21 16:57:12 -070023import android.content.pm.FeatureInfo;
Brian Muramatsua61d3232010-06-08 12:29:36 -070024import android.content.pm.PackageManager;
Brian Muramatsue6b12dc2010-11-08 14:56:40 -080025import android.content.res.Configuration;
The Android Open Source Projectf8057102009-03-15 16:47:16 -070026import android.os.Build;
27import android.os.Bundle;
Brett Chabot62a17ce2009-11-12 13:35:13 -080028import android.telephony.TelephonyManager;
The Android Open Source Projectf8057102009-03-15 16:47:16 -070029import android.util.DisplayMetrics;
Brian Muramatsu73799892010-06-23 17:42:52 -070030import android.util.Log;
The Android Open Source Projectf8057102009-03-15 16:47:16 -070031import android.view.Display;
32import android.view.WindowManager;
33
Brian Muramatsu570acf72011-03-10 17:21:07 -080034import java.io.IOException;
Brian Muramatsu73799892010-06-23 17:42:52 -070035import java.lang.reflect.Field;
36import java.util.ArrayList;
Brian Muramatsu4af6c4e2010-06-21 16:57:12 -070037import java.util.HashSet;
Brian Muramatsu73799892010-06-23 17:42:52 -070038import java.util.List;
Brian Muramatsu570acf72011-03-10 17:21:07 -080039import java.util.Scanner;
Brian Muramatsu4af6c4e2010-06-21 16:57:12 -070040import java.util.Set;
Brian Muramatsu55790392010-06-14 14:45:42 -070041
Brett Chabot2f903ad2011-02-02 18:22:18 -080042public class DeviceInfoInstrument extends Instrumentation implements DeviceInfoConstants {
Brian Muramatsua61d3232010-06-08 12:29:36 -070043
Brian Muramatsu73799892010-06-23 17:42:52 -070044 private static final String TAG = "DeviceInfoInstrument";
Brian Muramatsua61d3232010-06-08 12:29:36 -070045
The Android Open Source Projectf8057102009-03-15 16:47:16 -070046 private static Bundle mResults = new Bundle();
47
The Android Open Source Projectf8057102009-03-15 16:47:16 -070048 public DeviceInfoInstrument() {
49 super();
50 }
51
52 @Override
53 public void onCreate(Bundle arguments) {
54 start();
55 }
56
57 @Override
58 public void onStart() {
59
60 addResult(BUILD_ID, Build.ID);
61 addResult(PRODUCT_NAME, Build.PRODUCT);
62 addResult(BUILD_DEVICE, Build.DEVICE);
63 addResult(BUILD_BOARD, Build.BOARD);
Brian Muramatsud6445ae2010-10-27 13:31:28 -070064 addResult(BUILD_MANUFACTURER, Build.MANUFACTURER);
The Android Open Source Projectf8057102009-03-15 16:47:16 -070065 addResult(BUILD_BRAND, Build.BRAND);
66 addResult(BUILD_MODEL, Build.MODEL);
67 addResult(BUILD_TYPE, Build.TYPE);
The Android Open Source Projectf8057102009-03-15 16:47:16 -070068 addResult(BUILD_FINGERPRINT, Build.FINGERPRINT);
Brian Muramatsu722008e2010-05-25 16:44:48 -070069 addResult(BUILD_ABI, Build.CPU_ABI);
70 addResult(BUILD_ABI2, Build.CPU_ABI2);
Brett Chabot770358e2011-10-28 17:27:35 -070071 addResult(SERIAL_NUMBER, Build.SERIAL);
The Android Open Source Projectf8057102009-03-15 16:47:16 -070072
The Android Open Source Projectf8057102009-03-15 16:47:16 -070073 addResult(VERSION_RELEASE, Build.VERSION.RELEASE);
74 addResult(VERSION_SDK, Build.VERSION.SDK);
75
76 DisplayMetrics metrics = new DisplayMetrics();
77 WindowManager wm = (WindowManager) getContext().getSystemService(
78 Context.WINDOW_SERVICE);
79 Display d = wm.getDefaultDisplay();
Madan Ankapura56c756f2013-05-10 10:10:27 -070080 d.getRealMetrics(metrics);
Brett Chabot770358e2011-10-28 17:27:35 -070081 addResult(RESOLUTION, String.format("%sx%s", metrics.widthPixels, metrics.heightPixels));
Brian Muramatsu647277e2010-11-16 13:58:42 -080082 addResult(SCREEN_DENSITY, metrics.density);
The Android Open Source Projectf8057102009-03-15 16:47:16 -070083 addResult(SCREEN_X_DENSITY, metrics.xdpi);
84 addResult(SCREEN_Y_DENSITY, metrics.ydpi);
85
Brian Muramatsue6b12dc2010-11-08 14:56:40 -080086 String screenDensityBucket = getScreenDensityBucket(metrics);
87 addResult(SCREEN_DENSITY_BUCKET, screenDensityBucket);
88
89 String screenSize = getScreenSize();
90 addResult(SCREEN_SIZE, screenSize);
91
The Android Open Source Projectf8057102009-03-15 16:47:16 -070092 Intent intent = new Intent();
93 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
94 intent.setClass(this.getContext(), DeviceInfoActivity.class);
95
Bill Napier6c12b462009-05-14 11:07:39 -070096 DeviceInfoActivity activity = (DeviceInfoActivity) startActivitySync(intent);
97 waitForIdleSync();
98 activity.waitForAcitityToFinish();
The Android Open Source Projectf8057102009-03-15 16:47:16 -070099
Brett Chabot62a17ce2009-11-12 13:35:13 -0800100 TelephonyManager tm = (TelephonyManager) getContext().getSystemService(
101 Context.TELEPHONY_SERVICE);
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700102 // network
Brett Chabot62a17ce2009-11-12 13:35:13 -0800103 String network = tm.getNetworkOperatorName();
Brett Chabot51b9caa2011-09-07 18:44:22 -0700104 addResult(NETWORK, network.trim());
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700105
106 // imei
Brett Chabot62a17ce2009-11-12 13:35:13 -0800107 String imei = tm.getDeviceId();
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700108 addResult(IMEI, imei);
109
110 // imsi
Brett Chabot62a17ce2009-11-12 13:35:13 -0800111 String imsi = tm.getSubscriberId();
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700112 addResult(IMSI, imsi);
113
114 // phone number
Brett Chabot62a17ce2009-11-12 13:35:13 -0800115 String phoneNumber = tm.getLine1Number();
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700116 addResult(PHONE_NUMBER, phoneNumber);
117
Brian Muramatsua61d3232010-06-08 12:29:36 -0700118 // features
119 String features = getFeatures();
120 addResult(FEATURES, features);
121
Brian Muramatsu55790392010-06-14 14:45:42 -0700122 // processes
123 String processes = getProcesses();
124 addResult(PROCESSES, processes);
125
Brian Muramatsud89a48b2010-07-29 12:03:49 -0700126 // OpenGL ES version
127 String openGlEsVersion = getOpenGlEsVersion();
128 addResult(OPEN_GL_ES_VERSION, openGlEsVersion);
129
Brian Muramatsu570acf72011-03-10 17:21:07 -0800130 // partitions
131 String partitions = getPartitions();
132 addResult(PARTITIONS, partitions);
Brian Muramatsud89a48b2010-07-29 12:03:49 -0700133
Keun young Parkabed8862011-12-09 10:57:33 -0800134 // System libraries
135 String sysLibraries = getSystemLibraries();
136 addResult(SYS_LIBRARIES, sysLibraries);
137
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700138 finish(Activity.RESULT_OK, mResults);
139 }
140
141 /**
142 * Add string result.
143 *
144 * @param key the string of the key name.
145 * @param value string value.
146 */
147 static void addResult(final String key, final String value){
148 mResults.putString(key, value);
149 }
150
151 /**
152 * Add integer result.
153 *
154 * @param key the string of the key name.
155 * @param value integer value.
156 */
157 private void addResult(final String key, final int value){
158 mResults.putInt(key, value);
159 }
160
161 /**
162 * Add float result.
163 *
164 * @param key the string of the key name.
165 * @param value float value.
166 */
167 private void addResult(final String key, final float value){
168 mResults.putFloat(key, value);
169 }
Brian Muramatsua61d3232010-06-08 12:29:36 -0700170
Brian Muramatsue6b12dc2010-11-08 14:56:40 -0800171 private String getScreenSize() {
172 Configuration config = getContext().getResources().getConfiguration();
173 int screenLayout = config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
174 String screenSize = String.format("0x%x", screenLayout);
175 switch (screenLayout) {
176 case Configuration.SCREENLAYOUT_SIZE_SMALL:
177 screenSize = "small";
178 break;
179
180 case Configuration.SCREENLAYOUT_SIZE_NORMAL:
181 screenSize = "normal";
182 break;
183
184 case Configuration.SCREENLAYOUT_SIZE_LARGE:
185 screenSize = "large";
186 break;
187
Guru Nagarajan63c59832012-01-13 21:33:05 -0800188 case Configuration.SCREENLAYOUT_SIZE_XLARGE:
189 screenSize = "xlarge";
190 break;
191
Brian Muramatsue6b12dc2010-11-08 14:56:40 -0800192 case Configuration.SCREENLAYOUT_SIZE_UNDEFINED:
193 screenSize = "undefined";
194 break;
195 }
196 return screenSize;
197 }
198
199 private String getScreenDensityBucket(DisplayMetrics metrics) {
200 switch (metrics.densityDpi) {
201 case DisplayMetrics.DENSITY_LOW:
202 return "ldpi";
203
204 case DisplayMetrics.DENSITY_MEDIUM:
205 return "mdpi";
206
Guru Nagarajan63c59832012-01-13 21:33:05 -0800207 case DisplayMetrics.DENSITY_TV:
208 return "tvdpi";
209
Brian Muramatsue6b12dc2010-11-08 14:56:40 -0800210 case DisplayMetrics.DENSITY_HIGH:
211 return "hdpi";
212
Guru Nagarajan63c59832012-01-13 21:33:05 -0800213 case DisplayMetrics.DENSITY_XHIGH:
Brian Muramatsue6b12dc2010-11-08 14:56:40 -0800214 return "xdpi";
215
216 default:
217 return "" + metrics.densityDpi;
218 }
219 }
220
Brian Muramatsua61d3232010-06-08 12:29:36 -0700221 /**
222 * Return a summary of the device's feature as a semi-colon-delimited list of colon separated
Brian Muramatsu4af6c4e2010-06-21 16:57:12 -0700223 * name and availability pairs like "feature1:sdk:true;feature2:sdk:false;feature3:other:true;".
Brian Muramatsua61d3232010-06-08 12:29:36 -0700224 */
225 private String getFeatures() {
Brian Muramatsu4af6c4e2010-06-21 16:57:12 -0700226 StringBuilder features = new StringBuilder();
227
Brian Muramatsu73799892010-06-23 17:42:52 -0700228 try {
229 Set<String> checkedFeatures = new HashSet<String>();
Brian Muramatsua61d3232010-06-08 12:29:36 -0700230
Brian Muramatsu73799892010-06-23 17:42:52 -0700231 PackageManager packageManager = getContext().getPackageManager();
232 for (String featureName : getPackageManagerFeatures()) {
233 checkedFeatures.add(featureName);
234 boolean hasFeature = packageManager.hasSystemFeature(featureName);
235 addFeature(features, featureName, "sdk", hasFeature);
Brian Muramatsu4af6c4e2010-06-21 16:57:12 -0700236 }
Brian Muramatsu73799892010-06-23 17:42:52 -0700237
238 FeatureInfo[] featureInfos = packageManager.getSystemAvailableFeatures();
239 if (featureInfos != null) {
240 for (FeatureInfo featureInfo : featureInfos) {
241 if (featureInfo.name != null && !checkedFeatures.contains(featureInfo.name)) {
242 addFeature(features, featureInfo.name, "other", true);
243 }
244 }
245 }
246 } catch (Exception exception) {
247 Log.e(TAG, "Error getting features: " + exception.getMessage(), exception);
Brian Muramatsu4af6c4e2010-06-21 16:57:12 -0700248 }
249
250 return features.toString();
251 }
252
253 private static void addFeature(StringBuilder features, String name, String type,
254 boolean available) {
255 features.append(name).append(':').append(type).append(':').append(available).append(';');
Brian Muramatsua61d3232010-06-08 12:29:36 -0700256 }
Brian Muramatsu55790392010-06-14 14:45:42 -0700257
258 /**
Brian Muramatsu73799892010-06-23 17:42:52 -0700259 * Use reflection to get the features defined by the SDK. If there are features that do not fit
260 * the convention of starting with "FEATURE_" then they will still be shown under the
261 * "Other Features" section.
262 *
263 * @return list of feature names from sdk
264 */
265 private List<String> getPackageManagerFeatures() {
266 try {
267 List<String> features = new ArrayList<String>();
268 Field[] fields = PackageManager.class.getFields();
269 for (Field field : fields) {
270 if (field.getName().startsWith("FEATURE_")) {
271 String feature = (String) field.get(null);
272 features.add(feature);
273 }
274 }
275 return features;
276 } catch (IllegalAccessException illegalAccess) {
277 throw new RuntimeException(illegalAccess);
278 }
279 }
280
281 /**
Brian Muramatsu55790392010-06-14 14:45:42 -0700282 * Return a semi-colon-delimited list of the root processes that were running on the phone
283 * or an error message.
284 */
285 private static String getProcesses() {
286 StringBuilder builder = new StringBuilder();
287
288 try {
289 String[] rootProcesses = RootProcessScanner.getRootProcesses();
290 for (String rootProcess : rootProcesses) {
Brian Muramatsu1d67e192012-01-18 15:24:23 -0800291 builder.append(rootProcess).append(':').append(0).append(';');
Brian Muramatsu55790392010-06-14 14:45:42 -0700292 }
Brian Muramatsu73799892010-06-23 17:42:52 -0700293 } catch (Exception exception) {
294 Log.e(TAG, "Error getting processes: " + exception.getMessage(), exception);
295 builder.append(exception.getMessage());
Brian Muramatsu55790392010-06-14 14:45:42 -0700296 }
297
298 return builder.toString();
299 }
Brian Muramatsud89a48b2010-07-29 12:03:49 -0700300
301 /** @return a string containing the Open GL ES version number or an error message */
302 private String getOpenGlEsVersion() {
303 PackageManager packageManager = getContext().getPackageManager();
304 FeatureInfo[] featureInfos = packageManager.getSystemAvailableFeatures();
305 if (featureInfos != null && featureInfos.length > 0) {
306 for (FeatureInfo featureInfo : featureInfos) {
307 // Null feature name means this feature is the open gl es version feature.
308 if (featureInfo.name == null) {
309 return featureInfo.getGlEsVersion();
310 }
311 }
312 }
313 return "No feature for Open GL ES version.";
314 }
Brian Muramatsu570acf72011-03-10 17:21:07 -0800315
316 private String getPartitions() {
317 try {
318 StringBuilder builder = new StringBuilder();
319 Process df = new ProcessBuilder("df").start();
320 Scanner scanner = new Scanner(df.getInputStream());
321 try {
322 while (scanner.hasNextLine()) {
323 builder.append(scanner.nextLine()).append(';');
324 }
325 return builder.toString();
326 } finally {
327 scanner.close();
328 }
329 } catch (IOException e) {
330 return "Not able to run df for partition information.";
331 }
332 }
Keun young Parkabed8862011-12-09 10:57:33 -0800333
334 private String getSystemLibraries() {
335 PackageManager pm = getContext().getPackageManager();
336 String list[] = pm.getSystemSharedLibraryNames();
337
338 StringBuilder builder = new StringBuilder();
339 for (String lib : list) {
340 builder.append(lib);
341 builder.append(";");
342 }
343
344 return builder.toString();
345 }
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700346}