Am.java revision 62f20ecf492d2b29881bba307c79ff55e68760e6
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
210f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackbornimport android.app.ActivityManager;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative;
23287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport android.app.IActivityController;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IInstrumentationWatcher;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.content.Context;
299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.content.IIntentReceiver;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
339c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport android.os.ParcelFileDescriptor;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
3646d110329e659cc9cb9514e220ce273701eb151dDianne Hackbornimport android.os.SystemProperties;
379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.util.AndroidException;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.BufferedReader;
419c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.File;
429c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.FileNotFoundException;
43287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.IOException;
44287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.InputStreamReader;
458f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackbornimport java.io.PrintStream;
469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport java.net.URISyntaxException;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Am {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IActivityManager mAm;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mArgs;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNextArg;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mCurArgData;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mDebugOption = false;
588f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn    private boolean mWaitOption = false;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    private String mProfileFile;
6162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn    private boolean mProfileAutoStop;
6262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    // These are magic strings understood by the Eclipse plugin.
649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private static final String FATAL_ERROR_CODE = "Error type 1";
659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private static final String NO_SYSTEM_ERROR_CODE = "Error type 2";
669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private static final String NO_CLASS_ERROR_CODE = "Error type 3";
679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Command-line entry point.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args The command-line arguments
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void main(String[] args) {
749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        try {
759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            (new Am()).run(args);
769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        } catch (IllegalArgumentException e) {
779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            showUsage();
789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            System.err.println("Error: " + e.getMessage());
799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        } catch (Exception e) {
809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            System.err.println(e.toString());
819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            System.exit(1);
829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private void run(String[] args) throws Exception {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (args.length < 1) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            showUsage();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAm = ActivityManagerNative.getDefault();
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAm == null) {
939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            System.err.println(NO_SYSTEM_ERROR_CODE);
949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            throw new AndroidException("Can't connect to activity manager; is the system running?");
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArgs = args;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String op = args[0];
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextArg = 1;
1009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op.equals("start")) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runStart();
1036fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker        } else if (op.equals("startservice")) {
1046fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker            runStartService();
105351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang        } else if (op.equals("force-stop")) {
106351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang            runForceStop();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (op.equals("instrument")) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runInstrument();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (op.equals("broadcast")) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendBroadcast();
111f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project        } else if (op.equals("profile")) {
112f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project            runProfile();
113824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        } else if (op.equals("dumpheap")) {
114824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden            runDumpHeap();
115287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        } else if (op.equals("monitor")) {
116287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            runMonitor();
117e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        } else if (op.equals("screen-compat")) {
118e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            runScreenCompat();
1197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } else if (op.equals("display-size")) {
1207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            runDisplaySize();
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            throw new IllegalArgumentException("Unknown command: " + op);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private Intent makeIntent() throws URISyntaxException {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Intent intent = new Intent();
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasIntentInfo = false;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDebugOption = false;
1318f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        mWaitOption = false;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri data = null;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String type = null;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        String opt;
1369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        while ((opt=nextOption()) != null) {
1379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            if (opt.equals("-a")) {
1389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.setAction(nextArgRequired());
1399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
1409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-d")) {
1419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                data = Uri.parse(nextArgRequired());
1429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
1439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-t")) {
1449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                type = nextArgRequired();
1459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
1469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-c")) {
1479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.addCategory(nextArgRequired());
1489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
1499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-e") || opt.equals("--es")) {
1509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String key = nextArgRequired();
1519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String value = nextArgRequired();
1529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.putExtra(key, value);
1539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
154305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker            } else if (opt.equals("--esn")) {
155305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker                String key = nextArgRequired();
156305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker                intent.putExtra(key, (String) null);
157305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker                hasIntentInfo = true;
1589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("--ei")) {
1599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String key = nextArgRequired();
1609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String value = nextArgRequired();
1619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.putExtra(key, Integer.valueOf(value));
1629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
1638ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu            } else if (opt.equals("--eu")) {
1648ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu                String key = nextArgRequired();
1658ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu                String value = nextArgRequired();
1668ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu                intent.putExtra(key, Uri.parse(value));
1678ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu                hasIntentInfo = true;
1682d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra            } else if (opt.equals("--eia")) {
1692d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                String key = nextArgRequired();
1702d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                String value = nextArgRequired();
1712d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                String[] strings = value.split(",");
1722d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                int[] list = new int[strings.length];
1732d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                for (int i = 0; i < strings.length; i++) {
1742d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                    list[i] = Integer.valueOf(strings[i]);
1752d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                }
1762d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                intent.putExtra(key, list);
1772d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                hasIntentInfo = true;
1786a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki            } else if (opt.equals("--el")) {
1796a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki                String key = nextArgRequired();
1806a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki                String value = nextArgRequired();
1816a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki                intent.putExtra(key, Long.valueOf(value));
1826a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki                hasIntentInfo = true;
1832d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra            } else if (opt.equals("--ela")) {
1842d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                String key = nextArgRequired();
1852d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                String value = nextArgRequired();
1862d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                String[] strings = value.split(",");
1872d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                long[] list = new long[strings.length];
1882d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                for (int i = 0; i < strings.length; i++) {
1892d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                    list[i] = Long.valueOf(strings[i]);
1902d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                }
1912d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                intent.putExtra(key, list);
1922d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra                hasIntentInfo = true;
1939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("--ez")) {
1949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String key = nextArgRequired();
1959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String value = nextArgRequired();
1969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.putExtra(key, Boolean.valueOf(value));
1979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
1989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-n")) {
1999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String str = nextArgRequired();
2009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                ComponentName cn = ComponentName.unflattenFromString(str);
2019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                if (cn == null) throw new IllegalArgumentException("Bad component name: " + str);
2029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.setComponent(cn);
2039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                hasIntentInfo = true;
2049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-f")) {
2059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                String str = nextArgRequired();
2069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.setFlags(Integer.decode(str).intValue());
2075ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--grant-read-uri-permission")) {
2085ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
2095ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--grant-write-uri-permission")) {
2105ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
21146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            } else if (opt.equals("--exclude-stopped-packages")) {
21246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
21346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            } else if (opt.equals("--include-stopped-packages")) {
21446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
2155ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--debug-log-resolution")) {
2165ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);
2175ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-brought-to-front")) {
2185ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
2195ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-clear-top")) {
2205ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
2215ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-clear-when-task-reset")) {
2225ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
2235ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-exclude-from-recents")) {
2245ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
2255ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-launched-from-history")) {
2265ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
2275ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-multiple-task")) {
2285ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
2295ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-no-animation")) {
2305ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
2315ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-no-history")) {
2325ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
2335ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-no-user-action")) {
2345ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
2355ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-previous-is-top")) {
2365ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
2375ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-reorder-to-front")) {
2385ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
2395ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-reset-task-if-needed")) {
2405ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
2415ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--activity-single-top")) {
2425ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
24346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            } else if (opt.equals("--activity-clear-task")) {
24446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
24546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            } else if (opt.equals("--activity-task-on-home")) {
24646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME);
2475ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--receiver-registered-only")) {
2485ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
2495ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn            } else if (opt.equals("--receiver-replace-pending")) {
2505ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn                intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
2519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-D")) {
2529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                mDebugOption = true;
2538f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            } else if (opt.equals("-W")) {
2548f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                mWaitOption = true;
25562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            } else if (opt.equals("-P")) {
25662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                mProfileFile = nextArgRequired();
25762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                mProfileAutoStop = true;
25862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            } else if (opt.equals("--start-profiler")) {
25962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                mProfileFile = nextArgRequired();
26062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                mProfileAutoStop = false;
2619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else {
2629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                System.err.println("Error: Unknown option: " + opt);
2639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                showUsage();
2649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                return null;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        intent.setDataAndType(data, type);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String uri = nextArg();
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (uri != null) {
2719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            Intent oldIntent = intent;
272746a95ab7145a1c7583d1f2d6004a508cd7a31dcChristian Mehlmauer            intent = Intent.parseUri(uri, 0);
2739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            if (oldIntent.getAction() != null) {
2749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.setAction(oldIntent.getAction());
2759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            }
2769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            if (oldIntent.getData() != null || oldIntent.getType() != null) {
2779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                intent.setDataAndType(oldIntent.getData(), oldIntent.getType());
2789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            }
2799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            Set cats = oldIntent.getCategories();
2809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            if (cats != null) {
2819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                Iterator it = cats.iterator();
2829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                while (it.hasNext()) {
2839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                    intent.addCategory((String)it.next());
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            hasIntentInfo = true;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied");
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intent;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2936fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker    private void runStartService() throws Exception {
2946fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker        Intent intent = makeIntent();
2956fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker        System.out.println("Starting service: " + intent);
2966fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker        ComponentName cn = mAm.startService(null, intent, intent.getType());
2976fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker        if (cn == null) {
2986fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker            System.err.println("Error: Not found; no service started.");
2996fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker        }
3006fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker    }
3016fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker
3029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private void runStart() throws Exception {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Intent intent = makeIntent();
3049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        System.out.println("Starting: " + intent);
3059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
30662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
30762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        ParcelFileDescriptor fd = null;
30862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
30962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        if (mProfileFile != null) {
31062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            try {
31162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                fd = ParcelFileDescriptor.open(
31262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                        new File(mProfileFile),
31362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                        ParcelFileDescriptor.MODE_CREATE |
31462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                        ParcelFileDescriptor.MODE_TRUNCATE |
31562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                        ParcelFileDescriptor.MODE_READ_WRITE);
31662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            } catch (FileNotFoundException e) {
31762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                System.err.println("Error: Unable to open file: " + mProfileFile);
31862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                return;
31962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            }
32062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn        }
32162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn
3229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        // XXX should do something to determine the MIME type.
3238f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        IActivityManager.WaitResult result = null;
3248f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        int res;
3258f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        if (mWaitOption) {
3268f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            result = mAm.startActivityAndWait(null, intent, intent.getType(),
32762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                        null, 0, null, null, 0, false, mDebugOption,
32862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                        mProfileFile, fd, mProfileAutoStop);
3298f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            res = result.result;
3308f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        } else {
3318f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            res = mAm.startActivity(null, intent, intent.getType(),
33262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    null, 0, null, null, 0, false, mDebugOption,
33362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                    mProfileFile, fd, mProfileAutoStop);
3348f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        }
3358f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        PrintStream out = mWaitOption ? System.out : System.err;
3368f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        boolean launched = false;
3379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        switch (res) {
3389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_SUCCESS:
3398f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                launched = true;
3409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_SWITCHES_CANCELED:
3428f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                launched = true;
3438f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        "Warning: Activity not started because the "
3459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + " current activity is being kept for the user.");
3469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_DELIVERED_TO_TOP:
3488f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                launched = true;
3498f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        "Warning: Activity not started, intent has "
3519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + "been delivered to currently running "
3529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + "top-most instance.");
3539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_RETURN_INTENT_TO_CALLER:
3558f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                launched = true;
3568f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        "Warning: Activity not started because intent "
3589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + "should be handled by the caller");
3599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_TASK_TO_FRONT:
3618f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                launched = true;
3628f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        "Warning: Activity not started, its current "
3649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + "task has been brought to the front");
3659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_INTENT_NOT_RESOLVED:
3678f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Error: Activity not started, unable to "
3699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + "resolve " + intent.toString());
3709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_CLASS_NOT_FOUND:
3728f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(NO_CLASS_ERROR_CODE);
3738f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println("Error: Activity class " +
3749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        intent.getComponent().toShortString()
3759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + " does not exist.");
3769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:
3788f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        "Error: Activity not started, you requested to "
3809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + "both forward and receive its result");
3819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            case IActivityManager.START_PERMISSION_DENIED:
3838f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        "Error: Activity not started, you do not "
3859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        + "have permission to access it.");
3869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            default:
3888f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                out.println(
3899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        "Error: Activity not started, unknown error code " + res);
3909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                break;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3928f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        if (mWaitOption && launched) {
3938f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            if (result == null) {
3948f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                result = new IActivityManager.WaitResult();
3958f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                result.who = intent.getComponent();
3968f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            }
3978f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            System.out.println("Status: " + (result.timeout ? "timeout" : "ok"));
3988f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            if (result.who != null) {
3998f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                System.out.println("Activity: " + result.who.flattenToShortString());
4008f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            }
4018f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            if (result.thisTime >= 0) {
4028f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                System.out.println("ThisTime: " + result.thisTime);
4038f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            }
4048f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            if (result.totalTime >= 0) {
4058f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn                System.out.println("TotalTime: " + result.totalTime);
4068f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            }
4078f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn            System.out.println("Complete");
4088f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
411351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang    private void runForceStop() throws Exception {
412351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang        mAm.forceStopPackage(nextArgRequired());
413351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang    }
414351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang
4159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private void sendBroadcast() throws Exception {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Intent intent = makeIntent();
4179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        IntentReceiver receiver = new IntentReceiver();
4189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        System.out.println("Broadcasting: " + intent);
4199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false);
4209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        receiver.waitForFinish();
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private void runInstrument() throws Exception {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String profileFile = null;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean wait = false;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean rawMode = false;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean no_window_animation = false;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle args = new Bundle();
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String argKey = null, argValue = null;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        String opt;
4339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        while ((opt=nextOption()) != null) {
4349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            if (opt.equals("-p")) {
4359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                profileFile = nextArgRequired();
4369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-w")) {
4379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                wait = true;
4389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-r")) {
4399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                rawMode = true;
4409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else if (opt.equals("-e")) {
4419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                argKey = nextArgRequired();
4429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                argValue = nextArgRequired();
4439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                args.putString(argKey, argValue);
44446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            } else if (opt.equals("--no_window_animation")
44546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                    || opt.equals("--no-window-animation")) {
4469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                no_window_animation = true;
4479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } else {
4489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                System.err.println("Error: Unknown option: " + opt);
4499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                showUsage();
4509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                return;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        String cnArg = nextArgRequired();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComponentName cn = ComponentName.unflattenFromString(cnArg);
4569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationWatcher watcher = null;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wait) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            watcher = new InstrumentationWatcher();
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            watcher.setRawOutput(rawMode);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float[] oldAnims = null;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (no_window_animation) {
4659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            oldAnims = wm.getAnimationScales();
4669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            wm.setAnimationScale(0, 0.0f);
4679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            wm.setAnimationScale(1, 0.0f);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher)) {
4719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (watcher != null) {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!watcher.waitForFinish()) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("INSTRUMENTATION_ABORTED: System has crashed.");
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (oldAnims != null) {
4819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            wm.setAnimationScales(oldAnims);
4829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        }
4839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    }
4849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
48546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn    static void removeWallOption() {
48646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        String props = SystemProperties.get("dalvik.vm.extra-opts");
48746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        if (props != null && props.contains("-Xprofile:wallclock")) {
48846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            props = props.replace("-Xprofile:wallclock", "");
48946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            props = props.trim();
49046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            SystemProperties.set("dalvik.vm.extra-opts", props);
49146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        }
49246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn    }
49346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn
4949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private void runProfile() throws Exception {
4959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        String profileFile = null;
4969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        boolean start = false;
49746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        boolean wall = false;
4987eabe55db6b113f83c2cefcd06812648927de877Romain Guy        int profileType = 0;
49946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn
50046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        String process = null;
50146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn
5029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        String cmd = nextArgRequired();
5037eabe55db6b113f83c2cefcd06812648927de877Romain Guy        if ("looper".equals(cmd)) {
5047eabe55db6b113f83c2cefcd06812648927de877Romain Guy            cmd = nextArgRequired();
5057eabe55db6b113f83c2cefcd06812648927de877Romain Guy            profileType = 1;
5067eabe55db6b113f83c2cefcd06812648927de877Romain Guy        }
5077eabe55db6b113f83c2cefcd06812648927de877Romain Guy
5089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        if ("start".equals(cmd)) {
5099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            start = true;
51046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            wall = "--wall".equals(nextOption());
51146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            process = nextArgRequired();
51246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        } else if ("stop".equals(cmd)) {
51362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn            process = nextArg();
51446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        } else {
51546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            // Compatibility with old syntax: process is specified first.
51646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            process = cmd;
51746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            cmd = nextArgRequired();
51846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            if ("start".equals(cmd)) {
51946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                start = true;
52046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            } else if (!"stop".equals(cmd)) {
52146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                throw new IllegalArgumentException("Profile command " + process + " not valid");
52246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            }
52346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        }
52446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn
52546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        ParcelFileDescriptor fd = null;
52646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn
52746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        if (start) {
5289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            profileFile = nextArgRequired();
5299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            try {
5309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                fd = ParcelFileDescriptor.open(
5319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        new File(profileFile),
5329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        ParcelFileDescriptor.MODE_CREATE |
5339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        ParcelFileDescriptor.MODE_TRUNCATE |
5349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        ParcelFileDescriptor.MODE_READ_WRITE);
5359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } catch (FileNotFoundException e) {
5369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                System.err.println("Error: Unable to open file: " + profileFile);
5379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                return;
5389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            }
5399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        }
5409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
54146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        try {
54246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            if (wall) {
54346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                // XXX doesn't work -- this needs to be set before booting.
54446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                String props = SystemProperties.get("dalvik.vm.extra-opts");
54546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                if (props == null || !props.contains("-Xprofile:wallclock")) {
54646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                    props = props + " -Xprofile:wallclock";
54746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                    //SystemProperties.set("dalvik.vm.extra-opts", props);
54846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                }
54946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            } else if (start) {
55046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                //removeWallOption();
55146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            }
5527eabe55db6b113f83c2cefcd06812648927de877Romain Guy            if (!mAm.profileControl(process, start, profileFile, fd, profileType)) {
55346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                wall = false;
55446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                throw new AndroidException("PROFILE FAILED on process " + process);
55546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            }
55646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        } finally {
55746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            if (!wall) {
55846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                //removeWallOption();
55946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn            }
5609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        }
5619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    }
5629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
563824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden    private void runDumpHeap() throws Exception {
564824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        boolean managed = !"-n".equals(nextOption());
565824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        String process = nextArgRequired();
566824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        String heapFile = nextArgRequired();
567824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        ParcelFileDescriptor fd = null;
568824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden
569824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        try {
570824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden            fd = ParcelFileDescriptor.open(
571824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden                    new File(heapFile),
572824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden                    ParcelFileDescriptor.MODE_CREATE |
573824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden                    ParcelFileDescriptor.MODE_TRUNCATE |
574824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden                    ParcelFileDescriptor.MODE_READ_WRITE);
575824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        } catch (FileNotFoundException e) {
576824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden            System.err.println("Error: Unable to open file: " + heapFile);
577824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden            return;
578824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        }
579824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden
580824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        if (!mAm.dumpHeap(process, managed, heapFile, fd)) {
581824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden            throw new AndroidException("HEAP DUMP FAILED on process " + process);
582824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden        }
583824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden    }
584824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden
585287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    class MyActivityController extends IActivityController.Stub {
586f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        final String mGdbPort;
587f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
588287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int STATE_NORMAL = 0;
589287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int STATE_CRASHED = 1;
590287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int STATE_EARLY_ANR = 2;
591287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int STATE_ANR = 3;
592287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
593287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        int mState;
594287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
595287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_DEFAULT = 0;
596287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
597287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_CRASH_DIALOG = 0;
598287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_CRASH_KILL = 1;
599287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
600287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_EARLY_ANR_CONTINUE = 0;
601287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_EARLY_ANR_KILL = 1;
602287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
603287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_ANR_DIALOG = 0;
604287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_ANR_KILL = 1;
605287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        static final int RESULT_ANR_WAIT = 1;
606287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
607287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        int mResult;
608287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
609f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        Process mGdbProcess;
610f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        Thread mGdbThread;
611f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        boolean mGotGdbPrint;
612f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
613f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        MyActivityController(String gdbPort) {
614f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            mGdbPort = gdbPort;
615f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        }
616f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
617287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        @Override
618287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public boolean activityResuming(String pkg) throws RemoteException {
619287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            synchronized (this) {
620287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("** Activity resuming: " + pkg);
621287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
622287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            return true;
623287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
624287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
625287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        @Override
626287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public boolean activityStarting(Intent intent, String pkg) throws RemoteException {
627287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            synchronized (this) {
628287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("** Activity starting: " + pkg);
629287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
630287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            return true;
631287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
632287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
633287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        @Override
634287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg,
635287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                long timeMillis, String stackTrace) throws RemoteException {
636287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            synchronized (this) {
637287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("** ERROR: PROCESS CRASHED");
638287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("processName: " + processName);
639287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("processPid: " + pid);
640287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("shortMsg: " + shortMsg);
641287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("longMsg: " + longMsg);
642287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("timeMillis: " + timeMillis);
643287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("stack:");
644287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.print(stackTrace);
645287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("#");
646f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                int result = waitControllerLocked(pid, STATE_CRASHED);
647287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return result == RESULT_CRASH_KILL ? false : true;
648287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
649287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
650287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
651287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        @Override
652287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public int appEarlyNotResponding(String processName, int pid, String annotation)
653287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                throws RemoteException {
654287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            synchronized (this) {
655287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("** ERROR: EARLY PROCESS NOT RESPONDING");
656287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("processName: " + processName);
657287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("processPid: " + pid);
658287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("annotation: " + annotation);
659f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                int result = waitControllerLocked(pid, STATE_EARLY_ANR);
660287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (result == RESULT_EARLY_ANR_KILL) return -1;
661287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return 0;
662287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
663287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
664287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
665287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        @Override
666287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public int appNotResponding(String processName, int pid, String processStats)
667287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                throws RemoteException {
668287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            synchronized (this) {
669287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("** ERROR: PROCESS NOT RESPONDING");
670287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("processName: " + processName);
671287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("processPid: " + pid);
672287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("processStats:");
673287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.print(processStats);
674287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                System.out.println("#");
675f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                int result = waitControllerLocked(pid, STATE_ANR);
676287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (result == RESULT_ANR_KILL) return -1;
677287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (result == RESULT_ANR_WAIT) return 1;
678287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return 0;
679287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
680287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
681287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
682f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        void killGdbLocked() {
683f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            mGotGdbPrint = false;
684f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            if (mGdbProcess != null) {
685f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                System.out.println("Stopping gdbserver");
686f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                mGdbProcess.destroy();
687f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                mGdbProcess = null;
688f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            }
689f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            if (mGdbThread != null) {
690f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                mGdbThread.interrupt();
691f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                mGdbThread = null;
692f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            }
693f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        }
694f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
695f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        int waitControllerLocked(int pid, int state) {
696f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            if (mGdbPort != null) {
697f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                killGdbLocked();
698f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
699f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                try {
700f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    System.out.println("Starting gdbserver on port " + mGdbPort);
701f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    System.out.println("Do the following:");
702f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    System.out.println("  adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort);
703f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    System.out.println("  gdbclient app_process :" + mGdbPort);
704f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
705f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    mGdbProcess = Runtime.getRuntime().exec(new String[] {
706f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                            "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid)
707f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    });
708f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    final InputStreamReader converter = new InputStreamReader(
709f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                            mGdbProcess.getInputStream());
710f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    mGdbThread = new Thread() {
711f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                        @Override
712f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                        public void run() {
713f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                            BufferedReader in = new BufferedReader(converter);
714f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                            String line;
715f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                            int count = 0;
716f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                            while (true) {
717f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                synchronized (MyActivityController.this) {
718f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    if (mGdbThread == null) {
719f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                        return;
720f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    }
721f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    if (count == 2) {
722f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                        mGotGdbPrint = true;
723f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                        MyActivityController.this.notifyAll();
724f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    }
725f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                }
726f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                try {
727f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    line = in.readLine();
728f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    if (line == null) {
729f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                        return;
730f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    }
731f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    System.out.println("GDB: " + line);
732f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    count++;
733f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                } catch (IOException e) {
734f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                    return;
735f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                                }
736f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                            }
737f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                        }
738f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    };
739f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    mGdbThread.start();
740f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
741f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    // Stupid waiting for .5s.  Doesn't matter if we end early.
742f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    try {
743f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                        this.wait(500);
744f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    } catch (InterruptedException e) {
745f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    }
746f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
747f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                } catch (IOException e) {
748f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    System.err.println("Failure starting gdbserver: " + e);
749f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                    killGdbLocked();
750f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                }
751f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            }
752287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            mState = state;
753287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            System.out.println("");
754287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            printMessageForState();
755287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
756287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            while (mState != STATE_NORMAL) {
757287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                try {
758287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    wait();
759287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                } catch (InterruptedException e) {
760287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
761287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
762287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
763f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            killGdbLocked();
764f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
765287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            return mResult;
766287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
767287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
768287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        void resumeController(int result) {
769287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            synchronized (this) {
770287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mState = STATE_NORMAL;
771287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mResult = result;
772287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                notifyAll();
773287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
774287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
775287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
776287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        void printMessageForState() {
777287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            switch (mState) {
778287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                case STATE_NORMAL:
779287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("Monitoring activity manager...  available commands:");
780287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    break;
781287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                case STATE_CRASHED:
782287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("Waiting after crash...  available commands:");
783287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("(c)ontinue: show crash dialog");
784287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("(k)ill: immediately kill app");
785287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    break;
786287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                case STATE_EARLY_ANR:
787287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("Waiting after early ANR...  available commands:");
788287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("(c)ontinue: standard ANR processing");
789287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("(k)ill: immediately kill app");
790287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    break;
791287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                case STATE_ANR:
792287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("Waiting after ANR...  available commands:");
793287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("(c)ontinue: show ANR dialog");
794287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("(k)ill: immediately kill app");
795287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    System.out.println("(w)ait: wait some more");
796287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    break;
797287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
798287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            System.out.println("(q)uit: finish monitoring");
799287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
800287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
801287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        void run() throws RemoteException {
802287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            try {
803287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                printMessageForState();
804287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
805287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mAm.setActivityController(this);
806287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mState = STATE_NORMAL;
807287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
808287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                InputStreamReader converter = new InputStreamReader(System.in);
809287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                BufferedReader in = new BufferedReader(converter);
810287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                String line;
811287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
812287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                while ((line = in.readLine()) != null) {
813287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    boolean addNewline = true;
814287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    if (line.length() <= 0) {
815287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        addNewline = false;
816287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    } else if ("q".equals(line) || "quit".equals(line)) {
817287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        resumeController(RESULT_DEFAULT);
818287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        break;
819287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    } else if (mState == STATE_CRASHED) {
820287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        if ("c".equals(line) || "continue".equals(line)) {
821287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            resumeController(RESULT_CRASH_DIALOG);
822287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        } else if ("k".equals(line) || "kill".equals(line)) {
823287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            resumeController(RESULT_CRASH_KILL);
824287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        } else {
825287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            System.out.println("Invalid command: " + line);
826287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        }
827287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    } else if (mState == STATE_ANR) {
828287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        if ("c".equals(line) || "continue".equals(line)) {
829287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            resumeController(RESULT_ANR_DIALOG);
830287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        } else if ("k".equals(line) || "kill".equals(line)) {
831287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            resumeController(RESULT_ANR_KILL);
832287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        } else if ("w".equals(line) || "wait".equals(line)) {
833287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            resumeController(RESULT_ANR_WAIT);
834287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        } else {
835287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            System.out.println("Invalid command: " + line);
836287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        }
837287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    } else if (mState == STATE_EARLY_ANR) {
838287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        if ("c".equals(line) || "continue".equals(line)) {
839287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            resumeController(RESULT_EARLY_ANR_CONTINUE);
840287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        } else if ("k".equals(line) || "kill".equals(line)) {
841287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            resumeController(RESULT_EARLY_ANR_KILL);
842287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        } else {
843287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            System.out.println("Invalid command: " + line);
844287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        }
845287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    } else {
846287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        System.out.println("Invalid command: " + line);
847287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    }
848287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
849287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    synchronized (this) {
850287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        if (addNewline) {
851287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                            System.out.println("");
852287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        }
853287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        printMessageForState();
854287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    }
855287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
856287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
857287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            } catch (IOException e) {
858287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                e.printStackTrace();
859287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            } finally {
860287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mAm.setActivityController(null);
861287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
862287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
863287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
864287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
865287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    private void runMonitor() throws Exception {
866f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        String opt;
867f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        String gdbPort = null;
868f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        while ((opt=nextOption()) != null) {
869f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            if (opt.equals("--gdb")) {
870f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                gdbPort = nextArgRequired();
871f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            } else {
872f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                System.err.println("Error: Unknown option: " + opt);
873f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                showUsage();
874f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn                return;
875f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn            }
876f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        }
877f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn
878f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        MyActivityController controller = new MyActivityController(gdbPort);
879287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        controller.run();
880287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
881287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
882e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    private void runScreenCompat() throws Exception {
883e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        String mode = nextArgRequired();
884e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        boolean enabled;
885e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        if ("on".equals(mode)) {
886e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            enabled = true;
887e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        } else if ("off".equals(mode)) {
888e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            enabled = false;
889e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        } else {
890e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            System.err.println("Error: enabled mode must be 'on' or 'off' at " + mode);
891e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            showUsage();
892e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            return;
893e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        }
894e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
895e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        String packageName = nextArgRequired();
896e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        do {
897e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            try {
8980f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                mAm.setPackageScreenCompatMode(packageName, enabled
8990f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                        ? ActivityManager.COMPAT_MODE_ENABLED
9000f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                        : ActivityManager.COMPAT_MODE_DISABLED);
901e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            } catch (RemoteException e) {
902e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            }
903e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            packageName = nextArg();
904e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn        } while (packageName != null);
905e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    }
906e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
9077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private void runDisplaySize() throws Exception {
9087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        String size = nextArgRequired();
9097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        int m, n;
9107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if ("reset".equals(size)) {
9117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            m = n = -1;
9127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } else {
9137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            int div = size.indexOf('x');
9147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (div <= 0 || div >= (size.length()-1)) {
9157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                System.err.println("Error: bad size " + size);
9167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                showUsage();
9177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                return;
9187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
9197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            String mstr = size.substring(0, div);
9207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            String nstr = size.substring(div+1);
9217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            try {
9227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                m = Integer.parseInt(mstr);
9237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                n = Integer.parseInt(nstr);
9247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            } catch (NumberFormatException e) {
9257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                System.err.println("Error: bad number " + e);
9267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                showUsage();
9277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                return;
9287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
9297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
9307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
9317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (m < n) {
9327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            int tmp = m;
9337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            m = n;
9347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            n = tmp;
9357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
9367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
9377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService(
9387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                Context.WINDOW_SERVICE));
9397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (wm == null) {
9407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            System.err.println(NO_SYSTEM_ERROR_CODE);
9417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            throw new AndroidException("Can't connect to window manager; is the system running?");
9427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
9437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
9447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        try {
9457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (m >= 0 && n >= 0) {
9467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                wm.setForcedDisplaySize(m, n);
9477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            } else {
9487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                wm.clearForcedDisplaySize();
9497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
9507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } catch (RemoteException e) {
951351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang        }
9527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
9537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
9549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private class IntentReceiver extends IIntentReceiver.Stub {
9559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        private boolean mFinished = false;
9569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
9579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        public synchronized void performReceive(
95868d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn                Intent intent, int rc, String data, Bundle ext, boolean ord,
95968d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn                boolean sticky) {
9609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            String line = "Broadcast completed: result=" + rc;
9619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            if (data != null) line = line + ", data=\"" + data + "\"";
9629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            if (ext != null) line = line + ", extras: " + ext;
9639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            System.out.println(line);
9649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            mFinished = true;
9659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            notifyAll();
9669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        }
9679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
9689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        public synchronized void waitForFinish() {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
9709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                while (!mFinished) wait();
9719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            } catch (InterruptedException e) {
9729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                throw new IllegalStateException(e);
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class InstrumentationWatcher extends IInstrumentationWatcher.Stub {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mFinished = false;
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mRawMode = false;
9809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
982305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker         * Set or reset "raw mode".  In "raw mode", all bundles are dumped.  In "pretty mode",
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that.
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param rawMode true for raw mode, false for pretty mode.
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setRawOutput(boolean rawMode) {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRawMode = rawMode;
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // pretty printer mode?
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pretty = null;
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mRawMode && results != null) {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pretty != null) {
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.print(pretty);
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (results != null) {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (String key : results.keySet()) {
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            System.out.println(
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key));
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode);
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void instrumentationFinished(ComponentName name, int resultCode,
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bundle results) {
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // pretty printer mode?
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pretty = null;
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mRawMode && results != null) {
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pretty != null) {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println(pretty);
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (results != null) {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (String key : results.keySet()) {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            System.out.println(
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key));
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println("INSTRUMENTATION_CODE: " + resultCode);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFinished = true;
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean waitForFinish() {
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (!mFinished) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!mAm.asBinder().pingBinder()) {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return false;
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wait(1000);
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
10459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                        throw new IllegalStateException(e);
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String nextOption() {
10549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        if (mCurArgData != null) {
10559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            String prev = mArgs[mNextArg - 1];
10569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            throw new IllegalArgumentException("No argument expected after \"" + prev + "\"");
10579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        }
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mNextArg >= mArgs.length) {
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String arg = mArgs[mNextArg];
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!arg.startsWith("-")) {
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextArg++;
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (arg.equals("--")) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (arg.length() > 1 && arg.charAt(1) != '-') {
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (arg.length() > 2) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCurArgData = arg.substring(2);
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return arg.substring(0, 2);
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCurArgData = null;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return arg;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurArgData = null;
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return arg;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private String nextArg() {
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurArgData != null) {
10849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            String arg = mCurArgData;
10859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            mCurArgData = null;
10869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            return arg;
10879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        } else if (mNextArg < mArgs.length) {
10889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            return mArgs[mNextArg++];
10899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        } else {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private String nextArgRequired() {
10959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        String arg = nextArg();
10969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        if (arg == null) {
10979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            String prev = mArgs[mNextArg - 1];
10989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor            throw new IllegalArgumentException("Argument expected after \"" + prev + "\"");
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return arg;
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor    private static void showUsage() {
11049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor        System.err.println(
11059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                "usage: am [subcommand] [options]\n" +
110662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                "usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>] <INTENT>\n" +
110746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "       am startservice <INTENT>\n" +
110846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "       am force-stop <PACKAGE>\n" +
110946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "       am broadcast <INTENT>\n" +
111062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                "       am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" +
111146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "               [--no-window-animation] <COMPONENT>\n" +
11127eabe55db6b113f83c2cefcd06812648927de877Romain Guy                "       am profile [looper] start <PROCESS> <FILE>\n" +
111362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                "       am profile [looper] stop [<PROCESS>]\n" +
111446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "       am dumpheap [flags] <PROCESS> <FILE>\n" +
111546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "       am monitor [--gdb <port>]\n" +
111646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "       am screen-compat [on|off] <PACKAGE>\n" +
111746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "       am display-size [reset|MxN]\n" +
11189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                "\n" +
111946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am start: start an Activity.  Options are:\n" +
112046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    -D: enable debugging\n" +
112146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    -W: wait for launch to complete\n" +
112262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                "    --start-profiler <FILE>: start profiler and send results to <FILE>\n" +
112362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn                "    -P <FILE>: like above, but profiling stops when app goes idle\n" +
11249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                "\n" +
112546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am startservice: start a Service.\n" +
11266fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker                "\n" +
112746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am force-stop: force stop everything associated with <PACKAGE>.\n" +
1128351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang                "\n" +
112946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am broadcast: send a broadcast Intent.\n" +
11309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                "\n" +
113146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am instrument: start an Instrumentation.  Typically this target <COMPONENT>\n" +
113246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "  is the form <TEST_PACKAGE>/<RUNNER_CLASS>.  Options are:\n" +
113346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT).  Use with\n" +
113446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "        [-e perf true] to generate raw output for performance measurements.\n" +
113546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    -e <NAME> <VALUE>: set argument <NAME> to <VALUE>.  For test runners a\n" +
113646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "        common form is [-e <testrunner_flag> <value>[,<value>...]].\n" +
113746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    -p <FILE>: write profiling data to <FILE>\n" +
113846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    -w: wait for instrumentation to finish before returning.  Required for\n" +
113946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "        test runners.\n" +
114046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    --no-window-animation: turn off window animations will running.\n" +
11419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                "\n" +
114246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am profile: start and stop profiler on a process.\n" +
1143f9b5eed81d690ab8f336cb3345b46a36e278f180Joe Malin                "\n" +
114446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am dumpheap: dump the heap of a process.  Options are:\n" +
114546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    -n: dump native heap instead of managed heap\n" +
11469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                "\n" +
114746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am monitor: start monitoring for crashes or ANRs.\n" +
114846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    --gdb: start gdbserv on the given port at crash/ANR\n" +
1149287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                "\n" +
115046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am screen-compat: control screen compatibility mode of <PACKAGE>.\n" +
1151e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                "\n" +
115246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "am display-size: override display size.\n" +
11537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                "\n" +
115446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "<INTENT> specifications include these flags and arguments:\n" +
115546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" +
115646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [-c <CATEGORY> [-c <CATEGORY>] ...]\n" +
115746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" +
115846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--esn <EXTRA_KEY> ...]\n" +
115946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" +
116046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" +
116146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]\n" +
11628ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu                "    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]\n" +
116346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]\n" +
116446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]\n" +
116546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [-n <COMPONENT>] [-f <FLAGS>]\n" +
116646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--grant-read-uri-permission] [--grant-write-uri-permission]\n" +
116746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--debug-log-resolution] [--exclude-stopped-packages]\n" +
116846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--include-stopped-packages]\n" +
116946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-brought-to-front] [--activity-clear-top]\n" +
117046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]\n" +
117146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-launched-from-history] [--activity-multiple-task]\n" +
117246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-no-animation] [--activity-no-history]\n" +
117346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-no-user-action] [--activity-previous-is-top]\n" +
117446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-reorder-to-front] [--activity-reset-task-if-needed]\n" +
117546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-single-top] [--activity-clear-task]\n" +
117646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--activity-task-on-home]\n" +
117746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [--receiver-registered-only] [--receiver-replace-pending]\n" +
117846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn                "    [<URI>]\n"
11799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor                );
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1182