Instrumentation.java revision bcbcaa7edd32ba67c6290d79f7e7821c4b5b39ac
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ActivityNotFoundException;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.MessageQueue;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewConfiguration;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for implementing application instrumentation code.  When running
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with instrumentation turned on, this class will be instantiated for you
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before any of the application code, allowing you to monitor all of the
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interaction the system has with the application.  An Instrumentation
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementation is described to the system through an AndroidManifest.xml's
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <instrumentation> tag.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Instrumentation {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If included in the status or final bundle sent to an IInstrumentationWatcher, this key
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * identifies the class that is writing the report.  This can be used to provide more structured
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * logging or reporting capabilities in the IInstrumentationWatcher.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String REPORT_KEY_IDENTIFIER = "id";
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If included in the status or final bundle sent to an IInstrumentationWatcher, this key
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * identifies a string which can simply be printed to the output stream.  Using these streams
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provides a "pretty printer" version of the status & final packets.  Any bundles including
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this key should also include the complete set of raw key/value pairs, so that the
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation can also be launched, and results collected, by an automated system.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String REPORT_KEY_STREAMRESULT = "stream";
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Instrumentation";
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ActivityThread mThread = null;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MessageQueue mMessageQueue = null;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mInstrContext;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mAppContext;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComponentName mComponent;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Thread mRunner;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private List<ActivityWaiter> mWaitingActivities;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private List<ActivityMonitor> mActivityMonitors;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IInstrumentationWatcher mWatcher;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mPreCpuTime;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mStart;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mAutomaticPerformanceSnapshots = false;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle mPrePerfMetrics = new Bundle();
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle mPerfMetrics = new Bundle();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Instrumentation() {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the instrumentation is starting, before any application code
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has been loaded.  Usually this will be implemented to simply call
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #start} to begin the instrumentation thread, which will then
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * continue execution in {@link #onStart}.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you do not need your own thread -- that is you are writing your
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation to be completely asynchronous (returning to the event
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loop so that the application can run), you can simply begin your
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation here, for example call {@link Context#startActivity} to
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * begin the appropriate first activity of the application.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param arguments Any additional arguments that were supplied when the
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  instrumentation was started.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate(Bundle arguments) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create and start a new thread in which to run instrumentation.  This new
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thread will call to {@link #onStart} where you can implement the
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void start() {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRunner != null) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Instrumentation already started");
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRunner = new InstrumentationThread("Instr: " + getClass().getName());
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRunner.start();
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Method where the instrumentation thread enters execution.  This allows
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you to run your instrumentation code in a separate thread than the
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application, so that it can perform blocking operation such as
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #sendKeySync} or {@link #startActivitySync}.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You will typically want to call finish() when this function is done,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to end your instrumentation.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStart() {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called whenever the system captures an unhandled exception that
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was thrown by the application.  The default implementation simply
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false, allowing normal system handling of the exception to take
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * place.
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param obj The client object that generated the exception.  May be an
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Application, Activity, BroadcastReceiver, Service, or null.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param e The exception that was thrown.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return To allow normal system exception process to occur, return false.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         If true is returned, the system will proceed as if the exception
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         didn't happen.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onException(Object obj, Throwable e) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provide a status report about the application.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode Current success/failure of instrumentation.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param results Any results to send back to the code that started the instrumentation.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStatus(int resultCode, Bundle results) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWatcher != null) {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWatcher.instrumentationStatus(mComponent, resultCode, results);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            catch (RemoteException e) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWatcher = null;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Terminate instrumentation of the application.  This will cause the
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application process to exit, removing this instrumentation from the next
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the application is started.
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode Overall success/failure of instrumentation.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param results Any results to send back to the code that started the
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                instrumentation.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finish(int resultCode, Bundle results) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAutomaticPerformanceSnapshots) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            endPerformanceSnapshot();
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPerfMetrics != null) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.putAll(mPerfMetrics);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.finishInstrumentation(resultCode, results);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAutomaticPerformanceSnapshots() {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAutomaticPerformanceSnapshots = true;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startPerformanceSnapshot() {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStart = 0;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isProfiling()) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Add initial binder counts
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle binderCounts = getBinderCounts();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (String key: binderCounts.keySet()) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addPerfMetricLong("pre_" + key, binderCounts.getLong(key));
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Force a GC and zero out the performance counters.  Do this
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // before reading initial CPU/wall-clock times so we don't include
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the cost of this setup in our final metrics.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startAllocCounting();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Record CPU time up to this point, and start timing.  Note:  this
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // must happen at the end of this method, otherwise the timing will
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // include noise.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStart = SystemClock.uptimeMillis();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPreCpuTime = Process.getElapsedCpuTime();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endPerformanceSnapshot() {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isProfiling()) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Stop the timing. This must be done first before any other counting is stopped.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long cpuTime = Process.getElapsedCpuTime();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long duration = SystemClock.uptimeMillis();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stopAllocCounting();
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long nativeMax = Debug.getNativeHeapSize() / 1024;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long nativeFree = Debug.getNativeHeapFreeSize() / 1024;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.getMemoryInfo(memInfo);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Runtime runtime = Runtime.getRuntime();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long dalvikMax = runtime.totalMemory() / 1024;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long dalvikFree = runtime.freeMemory() / 1024;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long dalvikAllocated = dalvikMax - dalvikFree;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Add final binder counts
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle binderCounts = getBinderCounts();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (String key: binderCounts.keySet()) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addPerfMetricLong(key, binderCounts.getLong(key));
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Add alloc counts
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle allocCounts = getAllocCounts();
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (String key: allocCounts.keySet()) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addPerfMetricLong(key, allocCounts.getLong(key));
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("execution_time", duration - mStart);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("pre_cpu_time", mPreCpuTime);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("cpu_time", cpuTime - mPreCpuTime);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("native_size", nativeMax);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("native_allocated", nativeAllocated);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("native_free", nativeFree);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("native_pss", memInfo.nativePss);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("native_private_dirty", memInfo.nativePrivateDirty);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("native_shared_dirty", memInfo.nativeSharedDirty);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("java_size", dalvikMax);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("java_allocated", dalvikAllocated);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricLong("java_free", dalvikFree);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("java_pss", memInfo.dalvikPss);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("java_private_dirty", memInfo.dalvikPrivateDirty);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("java_shared_dirty", memInfo.dalvikSharedDirty);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("other_pss", memInfo.otherPss);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("other_private_dirty", memInfo.otherPrivateDirty);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            addPerfMetricInt("other_shared_dirty", memInfo.otherSharedDirty);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addPerfMetricLong(String key, long value) {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPerfMetrics.putLong("performance." + key, value);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addPerfMetricInt(String key, int value) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPerfMetrics.putInt("performance." + key, value);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the instrumented application is stopping, after all of the
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal application cleanup has occurred.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onDestroy() {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the Context of this instrumentation's package.  Note that this is
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * often different than the Context of the application being
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentated, since the instrumentation code often lives is a
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * different package than that of the application it is running against.
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link #getTargetContext} to retrieve a Context for the target
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The instrumentation's package context.
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getTargetContext
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getContext() {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInstrContext;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns complete component name of this instrumentation.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the complete component name for this instrumentation.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getComponentName() {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mComponent;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a Context for the target application being instrumented.  Note
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that this is often different than the Context of the instrumentation
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code, since the instrumentation code often lives is a different package
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * than that of the application it is running against. See
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getContext} to retrieve a Context for the instrumentation code.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A Context in the target application.
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getContext
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getTargetContext() {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAppContext;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check whether this instrumentation was started with profiling enabled.
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if profiling was enabled when starting, else false.
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isProfiling() {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mThread.isProfiling();
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method will start profiling if isProfiling() returns true. You should
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only call this method if you set the handleProfiling attribute in the
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * manifest file for this Instrumentation to true.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startProfiling() {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread.isProfiling()) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File(mThread.getProfileFilePath());
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.getParentFile().mkdirs();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops profiling if isProfiling() returns true.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopProfiling() {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread.isProfiling()) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.stopMethodTracing();
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Force the global system in or out of touch mode.  This can be used if
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your instrumentation relies on the UI being in one more or the other
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when it starts.
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouch Set to true to be in touch mode, false to be in
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus mode.
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInTouchMode(boolean inTouch) {
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IWindowManager.Stub.asInterface(
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("window")).setInTouchMode(inTouch);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Shouldn't happen!
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Schedule a callback for when the application's main thread goes idle
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (has no more events to process).
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param recipient Called the next time the thread's message queue is
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  idle.
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void waitForIdle(Runnable recipient) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageQueue.addIdleHandler(new Idler(recipient));
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.getHandler().post(new EmptyRunnable());
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Synchronously wait for the application to be idle.  Can not be called
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the main application thread -- use {@link #start} to execute
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation in its own thread.
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void waitForIdleSync() {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Idler idler = new Idler(null);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageQueue.addIdleHandler(idler);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.getHandler().post(new EmptyRunnable());
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        idler.waitForIdle();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a call on the application's main thread, blocking until it is
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * complete.  Useful for doing things that are not thread-safe, such as
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * looking at or modifying the view hierarchy.
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param runner The code to run on the main thread.
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void runOnMainSync(Runnable runner) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SyncRunnable sr = new SyncRunnable(runner);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.getHandler().post(sr);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sr.waitForComplete();
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start a new activity and wait for it to begin running before returning.
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In addition to being synchronous, this method as some semantic
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * differences from the standard {@link Context#startActivity} call: the
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity component is resolved before talking with the activity manager
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (its class name is specified in the Intent that this method ultimately
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * starts), and it does not allow you to start activities that run in a
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * different process.  In addition, if the given Intent resolves to
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple activities, instead of displaying a dialog for the user to
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * select an activity, an exception will be thrown.
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The function returns as soon as the activity goes idle following the
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call to its {@link Activity#onCreate}.  Generally this means it has gone
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through the full initialization including {@link Activity#onResume} and
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawn and displayed its initial window.
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent Description of the activity to start.
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Context#startActivity
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity startActivitySync(Intent intent) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityInfo ai = intent.resolveActivityInfo(
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getTargetContext().getPackageManager(), 0);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai == null) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Unable to resolve activity for: " + intent);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
449d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn            String myProc = mThread.getProcessName();
450d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn            if (!ai.processName.equals(myProc)) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // todo: if this intent is ambiguous, look here to see if
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // there is a single match that is in our package.
453d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn                throw new RuntimeException("Intent in process "
454d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn                        + myProc + " resolved to different process "
455d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn                        + ai.processName + ": " + intent);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setComponent(new ComponentName(
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ai.applicationInfo.packageName, ai.name));
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ActivityWaiter aw = new ActivityWaiter(intent);
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWaitingActivities == null) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWaitingActivities = new ArrayList();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWaitingActivities.add(aw);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getTargetContext().startActivity(intent);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSync.wait();
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (mWaitingActivities.contains(aw));
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return aw.activity;
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Information about a particular kind of Intent that is being monitored.
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * An instance of this class is added to the
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current instrumentation through {@link #addMonitor}; after being added,
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when a new activity is being started the monitor will be checked and, if
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * matching, its hit count updated and (optionally) the call stopped and a
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * canned result returned.
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An ActivityMonitor can also be used to look for the creation of an
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, through the {@link #waitForActivity} method.  This will return
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after a matching activity has been created with that activity object.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class ActivityMonitor {
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final IntentFilter mWhich;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final String mClass;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityResult mResult;
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final boolean mBlock;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is protected by 'Instrumentation.this.mSync'.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*package*/ int mHits = 0;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is protected by 'this'.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*package*/ Activity mLastActivity = null;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a new ActivityMonitor that looks for a particular kind of
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * intent to be started.
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which The set of intents this monitor is responsible for.
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param result A canned result to return if the monitor is hit; can
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *               be null.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param block Controls whether the monitor should block the activity
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              start (returning its canned result) or let the call
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              proceed.
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see Instrumentation#addMonitor
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityMonitor(
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter which, ActivityResult result, boolean block) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhich = which;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mClass = null;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResult = result;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlock = block;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a new ActivityMonitor that looks for a specific activity
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * class to be started.
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cls The activity class this monitor is responsible for.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param result A canned result to return if the monitor is hit; can
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *               be null.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param block Controls whether the monitor should block the activity
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              start (returning its canned result) or let the call
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              proceed.
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see Instrumentation#addMonitor
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityMonitor(
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cls, ActivityResult result, boolean block) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhich = null;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mClass = cls;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResult = result;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlock = block;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the filter associated with this ActivityMonitor.
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final IntentFilter getFilter() {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWhich;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the result associated with this ActivityMonitor, or null if
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * none.
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ActivityResult getResult() {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mResult;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Check whether this monitor blocks activity starts (not allowing the
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * actual activity to run) or allows them to execute normally.
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final boolean isBlocking() {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mBlock;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the number of times the monitor has been hit so far.
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int getHits() {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mHits;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the most recent activity class that was seen by this
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * monitor.
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity getLastActivity() {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mLastActivity;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Block until an Activity is created that matches this monitor,
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * returning the resulting activity.
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Activity
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity waitForActivity() {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (mLastActivity == null) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wait();
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity res = mLastActivity;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastActivity = null;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Block until an Activity is created that matches this monitor,
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * returning the resulting activity or till the timeOut period expires.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If the timeOut expires before the activity is started, return null.
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timeOut Time to wait before the activity is created.
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Activity
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity waitForActivityWithTimeout(long timeOut) {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wait(timeOut);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mLastActivity == null) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Activity res = mLastActivity;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastActivity = null;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return res;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean match(Context who,
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Activity activity,
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Intent intent) {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWhich != null
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && mWhich.match(who.getContentResolver(), intent,
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    true, "Instrumentation") < 0) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mClass != null) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String cls = null;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity != null) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cls = activity.getClass().getName();
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (intent.getComponent() != null) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cls = intent.getComponent().getClassName();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cls == null || !mClass.equals(cls)) {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (activity != null) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastActivity = activity;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a new {@link ActivityMonitor} that will be checked whenever an
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is started.  The monitor is added
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after any existing ones; the monitor will be hit only if none of the
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * existing monitors can themselves handle the Intent.
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The new ActivityMonitor to see.
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor(IntentFilter, ActivityResult, boolean)
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #checkMonitorHit
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addMonitor(ActivityMonitor monitor) {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mActivityMonitors == null) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActivityMonitors = new ArrayList();
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.add(monitor);
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A convenience wrapper for {@link #addMonitor(ActivityMonitor)} that
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creates an intent filter matching {@link ActivityMonitor} for you and
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns it.
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filter The set of intents this monitor is responsible for.
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param result A canned result to return if the monitor is hit; can
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               be null.
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param block Controls whether the monitor should block the activity
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              start (returning its canned result) or let the call
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              proceed.
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly created and added activity monitor.
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor(ActivityMonitor)
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #checkMonitorHit
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityMonitor addMonitor(
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IntentFilter filter, ActivityResult result, boolean block) {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityMonitor am = new ActivityMonitor(filter, result, block);
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addMonitor(am);
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return am;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A convenience wrapper for {@link #addMonitor(ActivityMonitor)} that
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creates a class matching {@link ActivityMonitor} for you and returns it.
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cls The activity class this monitor is responsible for.
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param result A canned result to return if the monitor is hit; can
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               be null.
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param block Controls whether the monitor should block the activity
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              start (returning its canned result) or let the call
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              proceed.
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly created and added activity monitor.
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor(ActivityMonitor)
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #checkMonitorHit
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityMonitor addMonitor(
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls, ActivityResult result, boolean block) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityMonitor am = new ActivityMonitor(cls, result, block);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addMonitor(am);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return am;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Test whether an existing {@link ActivityMonitor} has been hit.  If the
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * monitor has been hit at least <var>minHits</var> times, then it will be
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * removed from the activity monitor list and true returned.  Otherwise it
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is left as-is and false is returned.
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The ActivityMonitor to check.
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param minHits The minimum number of hits required.
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the hit count has been reached, else false.
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean checkMonitorHit(ActivityMonitor monitor, int minHits) {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForIdleSync();
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (monitor.getHits() < minHits) {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wait for an existing {@link ActivityMonitor} to be hit.  Once the
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * monitor has been hit, it is removed from the activity monitor list and
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the first created Activity object that matched it is returned.
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The ActivityMonitor to wait for.
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Activity object that matched the monitor.
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity waitForMonitor(ActivityMonitor monitor) {
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity activity = monitor.waitForActivity();
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return activity;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wait for an existing {@link ActivityMonitor} to be hit till the timeout
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * expires.  Once the monitor has been hit, it is removed from the activity
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * monitor list and the first created Activity object that matched it is
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned.  If the timeout expires, a null object is returned.
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The ActivityMonitor to wait for.
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timeOut The timeout value in secs.
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Activity object that matched the monitor.
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity waitForMonitorWithTimeout(ActivityMonitor monitor, long timeOut) {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity activity = monitor.waitForActivityWithTimeout(timeOut);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return activity;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove an {@link ActivityMonitor} that was previously added with
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #addMonitor}.
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The monitor to remove.
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeMonitor(ActivityMonitor monitor) {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a particular menu item.
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param targetActivity The activity in question.
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The identifier associated with the menu item.
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flag Additional flags, if any.
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the invocation was successful (for example, it could be
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false if item is disabled).
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean invokeMenuActionSync(Activity targetActivity,
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int id, int flag) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class MenuRunnable implements Runnable {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final Activity activity;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int identifier;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int flags;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean returnValue;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public MenuRunnable(Activity _activity, int _identifier,
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int _flags) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activity = _activity;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                identifier = _identifier;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flags = _flags;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Window win = activity.getWindow();
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                returnValue = win.performPanelIdentifierAction(
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Window.FEATURE_OPTIONS_PANEL,
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            identifier,
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            flags);
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MenuRunnable mr = new MenuRunnable(targetActivity, id, flag);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        runOnMainSync(mr);
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mr.returnValue;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show the context menu for the currently focused view and executes a
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * particular context menu item.
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param targetActivity The activity in question.
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The identifier associated with the context menu item.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flag Additional flags, if any.
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the invocation was successful (for example, it could be
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false if item is disabled).
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean invokeContextMenuAction(Activity targetActivity, int id, int flag) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Bring up context menu for current focus.
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // It'd be nice to do this through code, but currently ListView depends on
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //   long press to set metadata for its selected child
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent downEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(downEvent);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Need to wait for long press
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForIdleSync();
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(ViewConfiguration.getLongPressTimeout());
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Could not sleep for long press timeout", e);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent upEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER);
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(upEvent);
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Wait for context menu to appear
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForIdleSync();
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class ContextMenuRunnable implements Runnable {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final Activity activity;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int identifier;
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int flags;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean returnValue;
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public ContextMenuRunnable(Activity _activity, int _identifier,
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int _flags) {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activity = _activity;
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                identifier = _identifier;
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flags = _flags;
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Window win = activity.getWindow();
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                returnValue = win.performContextMenuIdentifierAction(
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            identifier,
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            flags);
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContextMenuRunnable cmr = new ContextMenuRunnable(targetActivity, id, flag);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        runOnMainSync(cmr);
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cmr.returnValue;
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends the key events corresponding to the text to the app being
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumented.
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The text to be sent.
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStringSync(String text) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text == null) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyCharacterMap keyCharacterMap =
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyEvent[] events = keyCharacterMap.getEvents(text.toCharArray());
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (events != null) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < events.length; i++) {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sendKeySync(events[i]);
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a key event to the currently focused window/view and wait for it to
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be processed.  Finished at some point after the recipient has returned
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from its event processing, though it may <em>not</em> have completely
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finished reacting from the event -- for example, if it needs to update
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its display as a result, it may still be in the process of doing that.
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The event to send to the current focus.
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendKeySync(KeyEvent event) {
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .injectKeyEvent(event, true);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends an up and down key event sync to the currently focused window.
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param key The integer keycode for the event.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendKeyDownUpSync(int key) {
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, key));
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, key));
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Higher-level method for sending both the down and up key events for a
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * particular character key code.  Equivalent to creating both KeyEvent
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * objects by hand and calling {@link #sendKeySync}.  The event appears
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as if it came from keyboard 0, the built in one.
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyCode The key code of the character to send.
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendCharacterSync(int keyCode) {
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, keyCode));
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, keyCode));
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch a pointer event. Finished at some point after the recipient has
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned from its event processing, though it may <em>not</em> have
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finished reacting from the event -- for example, if it needs
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to update its display as a result, it may still be in the process of
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * doing that.
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event A motion event describing the pointer action.  (As noted in
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendPointerSync(MotionEvent event) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .injectPointerEvent(event, true);
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch a trackball event. Finished at some point after the recipient has
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned from its event processing, though it may <em>not</em> have
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finished reacting from the event -- for example, if it needs
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to update its display as a result, it may still be in the process of
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * doing that.
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event A motion event describing the trackball action.  (As noted in
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendTrackballEventSync(MotionEvent event) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .injectTrackballEvent(event, true);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of the process's {@link Application} object.  The
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation provides the normal system behavior.
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cl The ClassLoader with which to instantiate the object.
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param className The name of the class implementing the Application
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  object.
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context to initialize the application with
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly instantiated Application object.
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Application newApplication(ClassLoader cl, String className, Context context)
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws InstantiationException, IllegalAccessException,
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassNotFoundException {
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return newApplication(cl.loadClass(className), context);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of the process's {@link Application} object.  The
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation provides the normal system behavior.
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param clazz The class used to create an Application object from.
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context to initialize the application with
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly instantiated Application object.
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Application newApplication(Class<?> clazz, Context context)
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws InstantiationException, IllegalAccessException,
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassNotFoundException {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Application app = (Application)clazz.newInstance();
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        app.attach(context);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return app;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of the application's {@link Application#onCreate}
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param app The application being created.
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callApplicationOnCreate(Application app) {
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        app.onCreate();
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of an {@link Activity} object.  This method is intended for use with
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unit tests, such as android.test.ActivityUnitTestCase.  The activity will be useable
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * locally but will be missing some of the linkages necessary for use within the sytem.
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param clazz The Class of the desired Activity
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The base context for the activity to use
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param token The token for this activity to communicate with
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param application The application object (if any)
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent that started this Activity
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param info ActivityInfo from the manifest
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param title The title, typically retrieved from the ActivityInfo record
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parent The parent Activity (if any)
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The embedded Id (if any)
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param lastNonConfigurationInstance Arbitrary object that will be
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * available via {@link Activity#getLastNonConfigurationInstance()
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.getLastNonConfigurationInstance()}.
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the instantiated activity
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws InstantiationException
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalAccessException
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity newActivity(Class<?> clazz, Context context,
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder token, Application application, Intent intent, ActivityInfo info,
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence title, Activity parent, String id,
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Object lastNonConfigurationInstance) throws InstantiationException,
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalAccessException {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity activity = (Activity)clazz.newInstance();
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityThread aThread = null;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.attach(context, aThread, this, token, application, intent, info, title,
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parent, id, lastNonConfigurationInstance, new Configuration());
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return activity;
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of the process's {@link Activity} object.  The
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation provides the normal system behavior.
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cl The ClassLoader with which to instantiate the object.
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param className The name of the class implementing the Activity
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  object.
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The Intent object that specified the activity class being
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               instantiated.
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly instantiated Activity object.
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity newActivity(ClassLoader cl, String className,
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent intent)
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws InstantiationException, IllegalAccessException,
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassNotFoundException {
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (Activity)cl.loadClass(className).newInstance();
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onCreate}
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being created.
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param icicle The previously frozen state (or null) to pass through to
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               onCreate().
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnCreate(Activity activity, Bundle icicle) {
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWaitingActivities != null) {
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mWaitingActivities.size();
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityWaiter aw = mWaitingActivities.get(i);
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Intent intent = aw.intent;
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (intent.filterEquals(activity.getIntent())) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        aw.activity = activity;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMessageQueue.addIdleHandler(new ActivityGoing(aw));
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onCreate(icicle);
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityMonitors != null) {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mActivityMonitors.size();
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityMonitor am = mActivityMonitors.get(i);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    am.match(activity, activity, activity.getIntent());
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnDestroy(Activity activity) {
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      if (mWaitingActivities != null) {
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          synchronized (mSync) {
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              final int N = mWaitingActivities.size();
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              for (int i=0; i<N; i++) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  final ActivityWaiter aw = mWaitingActivities.get(i);
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  final Intent intent = aw.intent;
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  if (intent.filterEquals(activity.getIntent())) {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      aw.activity = activity;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      mMessageQueue.addIdleHandler(new ActivityGoing(aw));
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  }
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              }
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      activity.onDestroy();
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      if (mActivityMonitors != null) {
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          synchronized (mSync) {
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              final int N = mActivityMonitors.size();
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              for (int i=0; i<N; i++) {
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  final ActivityMonitor am = mActivityMonitors.get(i);
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  am.match(activity, activity, activity.getIntent());
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              }
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      }
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  }
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onRestoreInstanceState}
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being restored.
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState The previously saved state being restored.
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnRestoreInstanceState(Activity activity, Bundle savedInstanceState) {
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performRestoreInstanceState(savedInstanceState);
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onPostCreate} method.
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply calls through to that method.
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being created.
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param icicle The previously frozen state (or null) to pass through to
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               onPostCreate().
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnPostCreate(Activity activity, Bundle icicle) {
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onPostCreate(icicle);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onNewIntent}
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity receiving a new Intent.
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The new intent being received.
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnNewIntent(Activity activity, Intent intent) {
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onNewIntent(intent);
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onStart}
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being started.
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnStart(Activity activity) {
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onStart();
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onRestart}
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being restarted.
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnRestart(Activity activity) {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onRestart();
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onResume} method.  The
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply calls through to that method.
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being resumed.
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnResume(Activity activity) {
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onResume();
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityMonitors != null) {
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mActivityMonitors.size();
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityMonitor am = mActivityMonitors.get(i);
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    am.match(activity, activity, activity.getIntent());
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onStop}
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being stopped.
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnStop(Activity activity) {
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onStop();
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onPause} method.  The
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply calls through to that method.
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being saved.
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState The bundle to pass to the call.
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnSaveInstanceState(Activity activity, Bundle outState) {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performSaveInstanceState(outState);
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onPause} method.  The
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply calls through to that method.
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being paused.
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnPause(Activity activity) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performPause();
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onUserLeaveHint} method.
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply calls through to that method.
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being notified that the user has navigated away
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnUserLeaving(Activity activity) {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performUserLeaving();
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts allocation counting. This triggers a gc and resets the counts.
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAllocCounting() {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Before we start trigger a GC and reset the debug counts. Run the
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // finalizers and another GC before starting and stopping the alloc
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // counts. This will free up any objects that were just sitting around
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // waiting for their finalizers to be run.
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().runFinalization();
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Debug.resetAllCounts();
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // start the counts
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Debug.startAllocCounting();
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops allocation counting.
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopAllocCounting() {
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().runFinalization();
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Debug.stopAllocCounting();
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If Results already contains Key, it appends Value to the key's ArrayList
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the key. If the key doesn't already exist in results, it
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * adds the key/value pair to results.
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addValue(String key, int value, Bundle results) {
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (results.containsKey(key)) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<Integer> list = results.getIntegerArrayList(key);
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (list != null) {
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                list.add(value);
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<Integer> list = new ArrayList<Integer>();
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            list.add(value);
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.putIntegerArrayList(key, list);
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a bundle with the current results from the allocation counting.
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Bundle getAllocCounts() {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle results = new Bundle();
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_alloc_count", Debug.getGlobalAllocCount());
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_alloc_size", Debug.getGlobalAllocSize());
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_freed_count", Debug.getGlobalFreedCount());
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_freed_size", Debug.getGlobalFreedSize());
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("gc_invocation_count", Debug.getGlobalGcInvocationCount());
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return results;
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a bundle with the counts for various binder counts for this process. Currently the only two that are
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reported are the number of send and the number of received transactions.
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Bundle getBinderCounts() {
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle results = new Bundle();
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("sent_transactions", Debug.getBinderSentTransactions());
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("received_transactions", Debug.getBinderReceivedTransactions());
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return results;
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Description of a Activity execution result to return to the original
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity.
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class ActivityResult {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a new activity result.  See {@link Activity#setResult} for
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * more information.
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param resultCode The result code to propagate back to the
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * originating activity, often RESULT_CANCELED or RESULT_OK
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param resultData The data to propagate back to the originating
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * activity.
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityResult(int resultCode, Intent resultData) {
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = resultData;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the result code contained in this result.
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getResultCode() {
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mResultCode;
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the data contained in this result.
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Intent getResultData() {
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mResultData;
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int mResultCode;
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Intent mResultData;
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a startActivity call made by the application.  The default
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation takes care of updating any active {@link ActivityMonitor}
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * objects and dispatches this call to the system activity manager; you can
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * override this to watch for the application to start an activity, and
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modify what happens when it does.
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method returns an {@link ActivityResult} object, which you can
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use when intercepting application calls to avoid performing the start
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity action but still return the result the application is
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * expecting.  To do this, override this method to catch the call to start
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity so that it returns a new ActivityResult containing the results
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you would like the application to see, and don't call up to the super
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class.  Note that an application is only expecting a result if
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>requestCode</var> is &gt;= 0.
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param who The Context from which the activity is being started.
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param contextThread The main thread of the Context from which the activity
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                      is being started.
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param token Internal token identifying to the system who is starting
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              the activity; may be null.
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param target Which activity is perform the start (and thus receiving
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               any result); may be null if this call is not being made
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               from an activity.
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The actual Intent to start.
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Identifier for this request's result; less than zero
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    if the caller is not expecting a result.
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return To force the return of a particular result, return an
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         ActivityResult object containing the desired data; otherwise
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return null.  The default implementation always returns null.
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Activity#startActivity(Intent)
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Activity#startActivityForResult(Intent, int)
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Activity#startActivityFromChild
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityResult execStartActivity(
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context who, IBinder contextThread, IBinder token, Activity target,
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Intent intent, int requestCode) {
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IApplicationThread whoThread = (IApplicationThread) contextThread;
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityMonitors != null) {
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mActivityMonitors.size();
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityMonitor am = mActivityMonitors.get(i);
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (am.match(who, null, intent)) {
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        am.mHits++;
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (am.isBlocking()) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return requestCode >= 0 ? am.getResult() : null;
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int result = ActivityManagerNative.getDefault()
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .startActivity(whoThread, intent,
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.resolveTypeIfNeeded(who.getContentResolver()),
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        null, 0, token, target != null ? target.mEmbeddedID : null,
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        requestCode, false, false);
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkStartActivityResult(result, intent);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ final void init(ActivityThread thread,
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Context instrContext, Context appContext, ComponentName component,
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IInstrumentationWatcher watcher) {
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread = thread;
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageQueue = mThread.getLooper().myQueue();
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrContext = instrContext;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAppContext = appContext;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mComponent = component;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWatcher = watcher;
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1471bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn    /*package*/ static void checkStartActivityResult(int res, Object intent) {
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res >= IActivityManager.START_SUCCESS) {
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (res) {
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case IActivityManager.START_INTENT_NOT_RESOLVED:
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case IActivityManager.START_CLASS_NOT_FOUND:
1479bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                if (intent instanceof Intent && ((Intent)intent).getComponent() != null)
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new ActivityNotFoundException(
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Unable to find explicit activity class "
1482bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            + ((Intent)intent).getComponent().toShortString()
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "; have you declared this activity in your AndroidManifest.xml?");
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ActivityNotFoundException(
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "No Activity found to handle " + intent);
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case IActivityManager.START_PERMISSION_DENIED:
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException("Not allowed to start activity "
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + intent);
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new AndroidRuntimeException(
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "FORWARD_RESULT_FLAG used while also requesting a result");
1492bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            case IActivityManager.START_NOT_ACTIVITY:
1493bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                throw new IllegalArgumentException(
1494bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        "PendingIntent is not an activity");
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new AndroidRuntimeException("Unknown error code "
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + res + " when starting " + intent);
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void validateNotAppThread() {
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ActivityThread.currentActivityThread() != null) {
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "This method can not be called from the main application thread");
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final class InstrumentationThread extends Thread {
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public InstrumentationThread(String name) {
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(name);
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IActivityManager am = ActivityManagerNative.getDefault();
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_DISPLAY);
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Exception setting priority of instrumentation thread "
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Process.myTid(), e);
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAutomaticPerformanceSnapshots) {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                startPerformanceSnapshot();
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onStart();
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class EmptyRunnable implements Runnable {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class SyncRunnable implements Runnable {
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Runnable mTarget;
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mComplete;
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public SyncRunnable(Runnable target) {
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTarget = target;
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTarget.run();
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mComplete = true;
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void waitForComplete() {
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (!mComplete) {
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wait();
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ActivityWaiter {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Intent intent;
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Activity activity;
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityWaiter(Intent _intent) {
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = _intent;
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final class ActivityGoing implements MessageQueue.IdleHandler {
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityWaiter mWaiter;
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityGoing(ActivityWaiter waiter) {
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWaiter = waiter;
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final boolean queueIdle() {
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWaitingActivities.remove(mWaiter);
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSync.notifyAll();
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class Idler implements MessageQueue.IdleHandler {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Runnable mCallback;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mIdle;
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Idler(Runnable callback) {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallback = callback;
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIdle = false;
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final boolean queueIdle() {
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCallback != null) {
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCallback.run();
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIdle = true;
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void waitForIdle() {
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (!mIdle) {
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wait();
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1617