Am.java revision 305e1b8fe926430e63d167ebed0c1f4d191ebcdc
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 5305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Licensed under the Apache License, Version 2.0 (the "License"); 6305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** you may not use this file except in compliance with the License. 7305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 9305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 11305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Unless required by applicable law or agreed to in writing, software 12305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** distributed under the License is distributed on an "AS IS" BASIS, 13305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.am; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IInstrumentationWatcher; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.content.IIntentReceiver; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 309c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport android.os.ParcelFileDescriptor; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.util.AndroidException; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.File; 379c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.FileNotFoundException; 389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport java.net.URISyntaxException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Am { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mAm; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDebugOption = false; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // These are magic strings understood by the Eclipse plugin. 529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String FATAL_ERROR_CODE = "Error type 1"; 539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_SYSTEM_ERROR_CODE = "Error type 2"; 549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_CLASS_ERROR_CODE = "Error type 3"; 559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command-line entry point. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args The command-line arguments 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor (new Am()).run(args); 649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (IllegalArgumentException e) { 659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: " + e.getMessage()); 679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (Exception e) { 689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(e.toString()); 699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.exit(1); 709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void run(String[] args) throws Exception { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAm = ActivityManagerNative.getDefault(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAm == null) { 819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_SYSTEM_ERROR_CODE); 829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("Can't connect to activity manager; is the system running?"); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.equals("start")) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runStart(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("instrument")) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstrument(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("broadcast")) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendBroadcast(); 95f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } else if (op.equals("profile")) { 96f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project runProfile(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Unknown command: " + op); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private Intent makeIntent() throws URISyntaxException { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasIntentInfo = false; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDebugOption = false; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = null; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = null; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 1119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 1129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-a")) { 1139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(nextArgRequired()); 1149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-d")) { 1169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor data = Uri.parse(nextArgRequired()); 1179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-t")) { 1199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor type = nextArgRequired(); 1209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-c")) { 1229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory(nextArgRequired()); 1239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e") || opt.equals("--es")) { 1259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, value); 1289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 129305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker } else if (opt.equals("--esn")) { 130305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker String key = nextArgRequired(); 131305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker intent.putExtra(key, (String) null); 132305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker hasIntentInfo = true; 1339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ei")) { 1349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Integer.valueOf(value)); 1379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ez")) { 1399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Boolean.valueOf(value)); 1429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-n")) { 1449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 1459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ComponentName cn = ComponentName.unflattenFromString(str); 1469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + str); 1479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setComponent(cn); 1489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-f")) { 1509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 1519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setFlags(Integer.decode(str).intValue()); 1529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-D")) { 1539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mDebugOption = true; 1549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 1559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 1569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 1579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return null; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(data, type); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String uri = nextArg(); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uri != null) { 1649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Intent oldIntent = intent; 1659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent = Intent.getIntent(uri); 1669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (oldIntent.getAction() != null) { 1679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(oldIntent.getAction()); 1689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 1699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (oldIntent.getData() != null || oldIntent.getType() != null) { 1709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setDataAndType(oldIntent.getData(), oldIntent.getType()); 1719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 1729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Set cats = oldIntent.getCategories(); 1739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cats != null) { 1749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Iterator it = cats.iterator(); 1759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (it.hasNext()) { 1769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory((String)it.next()); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied"); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runStart() throws Exception { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 1889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Starting: " + intent); 1899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // XXX should do something to determine the MIME type. 1919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor int res = mAm.startActivity(null, intent, intent.getType(), 1929f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor null, 0, null, null, 0, false, mDebugOption); 1939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor switch (res) { 1949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_SUCCESS: 1959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 1969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_SWITCHES_CANCELED: 1979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 1989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started because the " 1999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + " current activity is being kept for the user."); 2009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_DELIVERED_TO_TOP: 2029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 2039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started, intent has " 2049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "been delivered to currently running " 2059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "top-most instance."); 2069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_RETURN_INTENT_TO_CALLER: 2089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 2099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started because intent " 2109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "should be handled by the caller"); 2119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_TASK_TO_FRONT: 2139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 2149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started, its current " 2159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "task has been brought to the front"); 2169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_INTENT_NOT_RESOLVED: 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println( 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Activity not started, unable to " 2209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "resolve " + intent.toString()); 2219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_CLASS_NOT_FOUND: 2239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_CLASS_ERROR_CODE); 2249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Activity class " + 2259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.getComponent().toShortString() 2269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + " does not exist."); 2279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: 2299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 2309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, you requested to " 2319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "both forward and receive its result"); 2329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_PERMISSION_DENIED: 2349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 2359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, you do not " 2369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "have permission to access it."); 2379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor default: 2399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 2409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, unknown error code " + res); 2419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void sendBroadcast() throws Exception { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 2479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor IntentReceiver receiver = new IntentReceiver(); 2489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Broadcasting: " + intent); 2499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false); 2509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor receiver.waitForFinish(); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runInstrument() throws Exception { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile = null; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wait = false; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rawMode = false; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean no_window_animation = false; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle args = new Bundle(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String argKey = null, argValue = null; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 2639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 2649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-p")) { 2659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 2669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-w")) { 2679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wait = true; 2689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-r")) { 2699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor rawMode = true; 2709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e")) { 2719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argKey = nextArgRequired(); 2729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argValue = nextArgRequired(); 2739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor args.putString(argKey, argValue); 2749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--no_window_animation")) { 2759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor no_window_animation = true; 2769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 2779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 2789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 2799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cnArg = nextArgRequired(); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(cnArg); 2859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationWatcher watcher = null; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wait) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher = new InstrumentationWatcher(); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.setRawOutput(rawMode); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] oldAnims = null; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (no_window_animation) { 2949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor oldAnims = wm.getAnimationScales(); 2959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(0, 0.0f); 2969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(1, 0.0f); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher)) { 3009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcher != null) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!watcher.waitForFinish()) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_ABORTED: System has crashed."); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldAnims != null) { 3109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScales(oldAnims); 3119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runProfile() throws Exception { 3159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String profileFile = null; 3169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor boolean start = false; 3179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String process = nextArgRequired(); 3189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor fd = null; 3199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cmd = nextArgRequired(); 3219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if ("start".equals(cmd)) { 3229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor start = true; 3239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 3249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 3259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor fd = ParcelFileDescriptor.open( 3269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor new File(profileFile), 3279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_CREATE | 3289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_TRUNCATE | 3299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_READ_WRITE); 3309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (FileNotFoundException e) { 3319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unable to open file: " + profileFile); 3329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 3339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (!"stop".equals(cmd)) { 3359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Profile command " + cmd + " not valid"); 3369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!mAm.profileControl(process, start, profileFile, fd)) { 3399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("PROFILE FAILED on process " + process); 3409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private class IntentReceiver extends IIntentReceiver.Stub { 3449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private boolean mFinished = false; 3459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void performReceive( 34768d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn Intent intent, int rc, String data, Bundle ext, boolean ord, 34868d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn boolean sticky) { 3499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String line = "Broadcast completed: result=" + rc; 3509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (data != null) line = line + ", data=\"" + data + "\""; 3519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (ext != null) line = line + ", extras: " + ext; 3529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println(line); 3539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mFinished = true; 3549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor notifyAll(); 3559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void waitForFinish() { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (!mFinished) wait(); 3609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (InterruptedException e) { 3619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class InstrumentationWatcher extends IInstrumentationWatcher.Stub { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFinished = false; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRawMode = false; 3699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 371305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode", 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawMode true for raw mode, false for pretty mode. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRawOutput(boolean rawMode) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawMode = rawMode; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pretty); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationFinished(ComponentName name, int resultCode, 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle results) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pretty); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key)); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_CODE: " + resultCode); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean waitForFinish() { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mFinished) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAm.asBinder().pingBinder()) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(1000); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 4349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 4439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (mCurArgData != null) { 4449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 4459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); 4469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArg() { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 4739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = mCurArgData; 4749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mCurArgData = null; 4759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return arg; 4769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (mNextArg < mArgs.length) { 4779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return mArgs[mNextArg++]; 4789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArgRequired() { 4849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = nextArg(); 4859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (arg == null) { 4869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 4879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static void showUsage() { 4939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 4949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "usage: am [subcommand] [options]\n" + 4959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 4969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " start an Activity: am start [-D] <INTENT>\n" + 4979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -D: enable debugging\n" + 4989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 4999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " send a broadcast Intent: am broadcast <INTENT>\n" + 5009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 5019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " start an Instrumentation: am instrument [flags] <COMPONENT>\n" + 5029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)\n" + 5039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -e <NAME> <VALUE>: set argument <NAME> to <VALUE>\n" + 5049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -p <FILE>: write profiling data to <FILE>\n" + 5059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -w: wait for instrumentation to finish before returning\n" + 5069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 5079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " start profiling: am profile <PROCESS> start <FILE>\n" + 5089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " stop profiling: am profile <PROCESS> stop\n" + 5099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 5109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " <INTENT> specifications include these flags:\n" + 5119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" + 5129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-c <CATEGORY> [-c <CATEGORY>] ...]\n" + 5139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" + 514305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker " [--esn <EXTRA_KEY> ...]\n" + 5159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" + 5169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" + 5179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-n <COMPONENT>] [-f <FLAGS>] [<URI>]\n" 5189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 521