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;
26ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.InputManager;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
300a30328c10367f57834d7e8597832b6af00f5240Kristian Monsenimport android.os.Looper;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.MessageQueue;
32c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganovimport android.os.PerformanceCollector;
33a002604af0c9b1204556610537b85685d7055996Craig Mautnerimport android.os.PersistableBundle;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
35c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganovimport android.os.RemoteException;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
37c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganovimport android.os.SystemClock;
38f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackbornimport android.os.UserHandle;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager;
42ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.view.InputDevice;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewConfiguration;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
4885d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackbornimport com.android.internal.content.ReferrerIntent;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for implementing application instrumentation code.  When running
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with instrumentation turned on, this class will be instantiated for you
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before any of the application code, allowing you to monitor all of the
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interaction the system has with the application.  An Instrumentation
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementation is described to the system through an AndroidManifest.xml's
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <instrumentation> tag.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Instrumentation {
6380943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If included in the status or final bundle sent to an IInstrumentationWatcher, this key
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * identifies the class that is writing the report.  This can be used to provide more structured
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * logging or reporting capabilities in the IInstrumentationWatcher.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String REPORT_KEY_IDENTIFIER = "id";
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If included in the status or final bundle sent to an IInstrumentationWatcher, this key
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * identifies a string which can simply be printed to the output stream.  Using these streams
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * provides a "pretty printer" version of the status & final packets.  Any bundles including
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this key should also include the complete set of raw key/value pairs, so that the
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation can also be launched, and results collected, by an automated system.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String REPORT_KEY_STREAMRESULT = "stream";
7880943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Instrumentation";
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Object mSync = new Object();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ActivityThread mThread = null;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MessageQueue mMessageQueue = null;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mInstrContext;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mAppContext;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComponentName mComponent;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Thread mRunner;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private List<ActivityWaiter> mWaitingActivities;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private List<ActivityMonitor> mActivityMonitors;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IInstrumentationWatcher mWatcher;
9180943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov    private IUiAutomationConnection mUiAutomationConnection;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mAutomaticPerformanceSnapshots = false;
93ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private PerformanceCollector mPerformanceCollector;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle mPerfMetrics = new Bundle();
9580943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov    private UiAutomation mUiAutomation;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Instrumentation() {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the instrumentation is starting, before any application code
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has been loaded.  Usually this will be implemented to simply call
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #start} to begin the instrumentation thread, which will then
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * continue execution in {@link #onStart}.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you do not need your own thread -- that is you are writing your
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation to be completely asynchronous (returning to the event
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loop so that the application can run), you can simply begin your
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation here, for example call {@link Context#startActivity} to
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * begin the appropriate first activity of the application.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param arguments Any additional arguments that were supplied when the
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  instrumentation was started.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate(Bundle arguments) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create and start a new thread in which to run instrumentation.  This new
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * thread will call to {@link #onStart} where you can implement the
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void start() {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRunner != null) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Instrumentation already started");
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRunner = new InstrumentationThread("Instr: " + getClass().getName());
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRunner.start();
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Method where the instrumentation thread enters execution.  This allows
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you to run your instrumentation code in a separate thread than the
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application, so that it can perform blocking operation such as
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #sendKeySync} or {@link #startActivitySync}.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You will typically want to call finish() when this function is done,
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to end your instrumentation.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStart() {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called whenever the system captures an unhandled exception that
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was thrown by the application.  The default implementation simply
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false, allowing normal system handling of the exception to take
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * place.
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param obj The client object that generated the exception.  May be an
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            Application, Activity, BroadcastReceiver, Service, or null.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param e The exception that was thrown.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return To allow normal system exception process to occur, return false.
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         If true is returned, the system will proceed as if the exception
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         didn't happen.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onException(Object obj, Throwable e) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Provide a status report about the application.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode Current success/failure of instrumentation.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param results Any results to send back to the code that started the instrumentation.
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStatus(int resultCode, Bundle results) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWatcher != null) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWatcher.instrumentationStatus(mComponent, resultCode, results);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            catch (RemoteException e) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWatcher = null;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Terminate instrumentation of the application.  This will cause the
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application process to exit, removing this instrumentation from the next
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time the application is started.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resultCode Overall success/failure of instrumentation.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param results Any results to send back to the code that started the
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                instrumentation.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finish(int resultCode, Bundle results) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAutomaticPerformanceSnapshots) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            endPerformanceSnapshot();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPerfMetrics != null) {
192b65ea7bfc6797d1aa8ef359f144eb2b8070dbf72Dianne Hackborn            if (results == null) {
193b65ea7bfc6797d1aa8ef359f144eb2b8070dbf72Dianne Hackborn                results = new Bundle();
194b65ea7bfc6797d1aa8ef359f144eb2b8070dbf72Dianne Hackborn            }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.putAll(mPerfMetrics);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1978f6f1f43eeb0d7263b626978ee2c21d4053bf610Adam Momtaz        if (mUiAutomation != null) {
1988f6f1f43eeb0d7263b626978ee2c21d4053bf610Adam Momtaz            mUiAutomation.disconnect();
1998f6f1f43eeb0d7263b626978ee2c21d4053bf610Adam Momtaz            mUiAutomation = null;
2008f6f1f43eeb0d7263b626978ee2c21d4053bf610Adam Momtaz        }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.finishInstrumentation(resultCode, results);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAutomaticPerformanceSnapshots() {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAutomaticPerformanceSnapshots = true;
206ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerformanceCollector = new PerformanceCollector();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startPerformanceSnapshot() {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isProfiling()) {
211ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            mPerformanceCollector.beginSnapshot(null);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void endPerformanceSnapshot() {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isProfiling()) {
217ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            mPerfMetrics = mPerformanceCollector.endSnapshot();
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the instrumented application is stopping, after all of the
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal application cleanup has occurred.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onDestroy() {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the Context of this instrumentation's package.  Note that this is
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * often different than the Context of the application being
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentated, since the instrumentation code often lives is a
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * different package than that of the application it is running against.
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link #getTargetContext} to retrieve a Context for the target
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * application.
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The instrumentation's package context.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getTargetContext
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getContext() {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInstrContext;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns complete component name of this instrumentation.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the complete component name for this instrumentation.
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentName getComponentName() {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mComponent;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a Context for the target application being instrumented.  Note
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that this is often different than the Context of the instrumentation
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code, since the instrumentation code often lives is a different package
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * than that of the application it is running against. See
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getContext} to retrieve a Context for the instrumentation code.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A Context in the target application.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getContext
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Context getTargetContext() {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAppContext;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check whether this instrumentation was started with profiling enabled.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if profiling was enabled when starting, else false.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isProfiling() {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mThread.isProfiling();
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method will start profiling if isProfiling() returns true. You should
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only call this method if you set the handleProfiling attribute in the
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * manifest file for this Instrumentation to true.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startProfiling() {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread.isProfiling()) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File(mThread.getProfileFilePath());
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            file.getParentFile().mkdirs();
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops profiling if isProfiling() returns true.
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopProfiling() {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread.isProfiling()) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.stopMethodTracing();
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Force the global system in or out of touch mode.  This can be used if
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your instrumentation relies on the UI being in one more or the other
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when it starts.
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouch Set to true to be in touch mode, false to be in
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus mode.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInTouchMode(boolean inTouch) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IWindowManager.Stub.asInterface(
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("window")).setInTouchMode(inTouch);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Shouldn't happen!
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Schedule a callback for when the application's main thread goes idle
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (has no more events to process).
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param recipient Called the next time the thread's message queue is
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  idle.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void waitForIdle(Runnable recipient) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageQueue.addIdleHandler(new Idler(recipient));
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.getHandler().post(new EmptyRunnable());
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Synchronously wait for the application to be idle.  Can not be called
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the main application thread -- use {@link #start} to execute
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumentation in its own thread.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void waitForIdleSync() {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Idler idler = new Idler(null);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageQueue.addIdleHandler(idler);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.getHandler().post(new EmptyRunnable());
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        idler.waitForIdle();
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a call on the application's main thread, blocking until it is
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * complete.  Useful for doing things that are not thread-safe, such as
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * looking at or modifying the view hierarchy.
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param runner The code to run on the main thread.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void runOnMainSync(Runnable runner) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SyncRunnable sr = new SyncRunnable(runner);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread.getHandler().post(sr);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sr.waitForComplete();
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start a new activity and wait for it to begin running before returning.
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * In addition to being synchronous, this method as some semantic
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * differences from the standard {@link Context#startActivity} call: the
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity component is resolved before talking with the activity manager
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (its class name is specified in the Intent that this method ultimately
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * starts), and it does not allow you to start activities that run in a
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * different process.  In addition, if the given Intent resolves to
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple activities, instead of displaying a dialog for the user to
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * select an activity, an exception will be thrown.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The function returns as soon as the activity goes idle following the
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call to its {@link Activity#onCreate}.  Generally this means it has gone
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through the full initialization including {@link Activity#onResume} and
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawn and displayed its initial window.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent Description of the activity to start.
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Context#startActivity
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity startActivitySync(Intent intent) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = new Intent(intent);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ActivityInfo ai = intent.resolveActivityInfo(
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getTargetContext().getPackageManager(), 0);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai == null) {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Unable to resolve activity for: " + intent);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
386d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn            String myProc = mThread.getProcessName();
387d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn            if (!ai.processName.equals(myProc)) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // todo: if this intent is ambiguous, look here to see if
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // there is a single match that is in our package.
390d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn                throw new RuntimeException("Intent in process "
391d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn                        + myProc + " resolved to different process "
392d97c7adfc2d6e885826e40694a116cf3f9225025Dianne Hackborn                        + ai.processName + ": " + intent);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.setComponent(new ComponentName(
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ai.applicationInfo.packageName, ai.name));
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ActivityWaiter aw = new ActivityWaiter(intent);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWaitingActivities == null) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWaitingActivities = new ArrayList();
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWaitingActivities.add(aw);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getTargetContext().startActivity(intent);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSync.wait();
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (mWaitingActivities.contains(aw));
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return aw.activity;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Information about a particular kind of Intent that is being monitored.
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * An instance of this class is added to the
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current instrumentation through {@link #addMonitor}; after being added,
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when a new activity is being started the monitor will be checked and, if
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * matching, its hit count updated and (optionally) the call stopped and a
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * canned result returned.
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>An ActivityMonitor can also be used to look for the creation of an
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity, through the {@link #waitForActivity} method.  This will return
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after a matching activity has been created with that activity object.
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class ActivityMonitor {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final IntentFilter mWhich;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final String mClass;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityResult mResult;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final boolean mBlock;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is protected by 'Instrumentation.this.mSync'.
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*package*/ int mHits = 0;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is protected by 'this'.
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*package*/ Activity mLastActivity = null;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a new ActivityMonitor that looks for a particular kind of
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * intent to be started.
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param which The set of intents this monitor is responsible for.
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param result A canned result to return if the monitor is hit; can
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *               be null.
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param block Controls whether the monitor should block the activity
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              start (returning its canned result) or let the call
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              proceed.
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see Instrumentation#addMonitor
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityMonitor(
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentFilter which, ActivityResult result, boolean block) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhich = which;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mClass = null;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResult = result;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlock = block;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a new ActivityMonitor that looks for a specific activity
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * class to be started.
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cls The activity class this monitor is responsible for.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param result A canned result to return if the monitor is hit; can
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *               be null.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param block Controls whether the monitor should block the activity
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              start (returning its canned result) or let the call
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *              proceed.
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see Instrumentation#addMonitor
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityMonitor(
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cls, ActivityResult result, boolean block) {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhich = null;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mClass = cls;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResult = result;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlock = block;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the filter associated with this ActivityMonitor.
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final IntentFilter getFilter() {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWhich;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the result associated with this ActivityMonitor, or null if
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * none.
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ActivityResult getResult() {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mResult;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Check whether this monitor blocks activity starts (not allowing the
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * actual activity to run) or allows them to execute normally.
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final boolean isBlocking() {
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mBlock;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the number of times the monitor has been hit so far.
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int getHits() {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mHits;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the most recent activity class that was seen by this
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * monitor.
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity getLastActivity() {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mLastActivity;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Block until an Activity is created that matches this monitor,
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * returning the resulting activity.
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Activity
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity waitForActivity() {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (mLastActivity == null) {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wait();
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity res = mLastActivity;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastActivity = null;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Block until an Activity is created that matches this monitor,
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * returning the resulting activity or till the timeOut period expires.
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If the timeOut expires before the activity is started, return null.
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timeOut Time to wait before the activity is created.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Activity
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity waitForActivityWithTimeout(long timeOut) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
553b0935343e835b7cbd785e8b888e3909d5932bdd1Costin Manolache                if (mLastActivity == null) {
554b0935343e835b7cbd785e8b888e3909d5932bdd1Costin Manolache                    try {
555b0935343e835b7cbd785e8b888e3909d5932bdd1Costin Manolache                        wait(timeOut);
556b0935343e835b7cbd785e8b888e3909d5932bdd1Costin Manolache                    } catch (InterruptedException e) {
557b0935343e835b7cbd785e8b888e3909d5932bdd1Costin Manolache                    }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mLastActivity == null) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Activity res = mLastActivity;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastActivity = null;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return res;
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean match(Context who,
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Activity activity,
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Intent intent) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWhich != null
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && mWhich.match(who.getContentResolver(), intent,
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    true, "Instrumentation") < 0) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mClass != null) {
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String cls = null;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity != null) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cls = activity.getClass().getName();
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (intent.getComponent() != null) {
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cls = intent.getComponent().getClassName();
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cls == null || !mClass.equals(cls)) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (activity != null) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastActivity = activity;
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifyAll();
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a new {@link ActivityMonitor} that will be checked whenever an
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity is started.  The monitor is added
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after any existing ones; the monitor will be hit only if none of the
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * existing monitors can themselves handle the Intent.
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The new ActivityMonitor to see.
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor(IntentFilter, ActivityResult, boolean)
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #checkMonitorHit
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addMonitor(ActivityMonitor monitor) {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mActivityMonitors == null) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActivityMonitors = new ArrayList();
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.add(monitor);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A convenience wrapper for {@link #addMonitor(ActivityMonitor)} that
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creates an intent filter matching {@link ActivityMonitor} for you and
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns it.
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param filter The set of intents this monitor is responsible for.
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param result A canned result to return if the monitor is hit; can
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               be null.
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param block Controls whether the monitor should block the activity
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              start (returning its canned result) or let the call
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              proceed.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly created and added activity monitor.
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor(ActivityMonitor)
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #checkMonitorHit
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityMonitor addMonitor(
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IntentFilter filter, ActivityResult result, boolean block) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityMonitor am = new ActivityMonitor(filter, result, block);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addMonitor(am);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return am;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A convenience wrapper for {@link #addMonitor(ActivityMonitor)} that
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * creates a class matching {@link ActivityMonitor} for you and returns it.
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cls The activity class this monitor is responsible for.
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param result A canned result to return if the monitor is hit; can
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               be null.
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param block Controls whether the monitor should block the activity
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              start (returning its canned result) or let the call
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              proceed.
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly created and added activity monitor.
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor(ActivityMonitor)
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #checkMonitorHit
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityMonitor addMonitor(
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls, ActivityResult result, boolean block) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityMonitor am = new ActivityMonitor(cls, result, block);
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addMonitor(am);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return am;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Test whether an existing {@link ActivityMonitor} has been hit.  If the
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * monitor has been hit at least <var>minHits</var> times, then it will be
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * removed from the activity monitor list and true returned.  Otherwise it
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is left as-is and false is returned.
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The ActivityMonitor to check.
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param minHits The minimum number of hits required.
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the hit count has been reached, else false.
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean checkMonitorHit(ActivityMonitor monitor, int minHits) {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForIdleSync();
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (monitor.getHits() < minHits) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wait for an existing {@link ActivityMonitor} to be hit.  Once the
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * monitor has been hit, it is removed from the activity monitor list and
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the first created Activity object that matched it is returned.
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The ActivityMonitor to wait for.
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Activity object that matched the monitor.
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity waitForMonitor(ActivityMonitor monitor) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity activity = monitor.waitForActivity();
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return activity;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wait for an existing {@link ActivityMonitor} to be hit till the timeout
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * expires.  Once the monitor has been hit, it is removed from the activity
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * monitor list and the first created Activity object that matched it is
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned.  If the timeout expires, a null object is returned.
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The ActivityMonitor to wait for.
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param timeOut The timeout value in secs.
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The Activity object that matched the monitor.
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity waitForMonitorWithTimeout(ActivityMonitor monitor, long timeOut) {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity activity = monitor.waitForActivityWithTimeout(timeOut);
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return activity;
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove an {@link ActivityMonitor} that was previously added with
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #addMonitor}.
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param monitor The monitor to remove.
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #addMonitor
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeMonitor(ActivityMonitor monitor) {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityMonitors.remove(monitor);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a particular menu item.
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param targetActivity The activity in question.
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The identifier associated with the menu item.
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flag Additional flags, if any.
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the invocation was successful (for example, it could be
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false if item is disabled).
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean invokeMenuActionSync(Activity targetActivity,
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int id, int flag) {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class MenuRunnable implements Runnable {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final Activity activity;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int identifier;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int flags;
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean returnValue;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public MenuRunnable(Activity _activity, int _identifier,
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int _flags) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activity = _activity;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                identifier = _identifier;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flags = _flags;
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Window win = activity.getWindow();
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                returnValue = win.performPanelIdentifierAction(
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Window.FEATURE_OPTIONS_PANEL,
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            identifier,
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            flags);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MenuRunnable mr = new MenuRunnable(targetActivity, id, flag);
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        runOnMainSync(mr);
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mr.returnValue;
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show the context menu for the currently focused view and executes a
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * particular context menu item.
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param targetActivity The activity in question.
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The identifier associated with the context menu item.
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flag Additional flags, if any.
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the invocation was successful (for example, it could be
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false if item is disabled).
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean invokeContextMenuAction(Activity targetActivity, int id, int flag) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Bring up context menu for current focus.
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // It'd be nice to do this through code, but currently ListView depends on
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //   long press to set metadata for its selected child
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent downEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(downEvent);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Need to wait for long press
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForIdleSync();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(ViewConfiguration.getLongPressTimeout());
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "Could not sleep for long press timeout", e);
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent upEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(upEvent);
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Wait for context menu to appear
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        waitForIdleSync();
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class ContextMenuRunnable implements Runnable {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final Activity activity;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int identifier;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private final int flags;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean returnValue;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public ContextMenuRunnable(Activity _activity, int _identifier,
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int _flags) {
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activity = _activity;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                identifier = _identifier;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flags = _flags;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Window win = activity.getWindow();
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                returnValue = win.performContextMenuIdentifierAction(
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
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContextMenuRunnable cmr = new ContextMenuRunnable(targetActivity, id, flag);
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        runOnMainSync(cmr);
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cmr.returnValue;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends the key events corresponding to the text to the app being
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instrumented.
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The text to be sent.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendStringSync(String text) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (text == null) {
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8506b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
851c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganov
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyEvent[] events = keyCharacterMap.getEvents(text.toCharArray());
853c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganov
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (events != null) {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < events.length; i++) {
856f434e37945c752a3f92fe6e9941805d612159bdbSvetoslav Ganov                // We have to change the time of an event before injecting it because
857f434e37945c752a3f92fe6e9941805d612159bdbSvetoslav Ganov                // all KeyEvents returned by KeyCharacterMap.getEvents() have the same
858f434e37945c752a3f92fe6e9941805d612159bdbSvetoslav Ganov                // time stamp and the system rejects too old events. Hence, it is
859f434e37945c752a3f92fe6e9941805d612159bdbSvetoslav Ganov                // possible for an event to become stale before it is injected if it
860f434e37945c752a3f92fe6e9941805d612159bdbSvetoslav Ganov                // takes too long to inject the preceding ones.
861c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganov                sendKeySync(KeyEvent.changeTimeRepeat(events[i], SystemClock.uptimeMillis(), 0));
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
863c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganov        }
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
865c350f1604f348dceec28ba0d7e4cfc293333f797Svetoslav Ganov
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send a key event to the currently focused window/view and wait for it to
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be processed.  Finished at some point after the recipient has returned
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from its event processing, though it may <em>not</em> have completely
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finished reacting from the event -- for example, if it needs to update
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its display as a result, it may still be in the process of doing that.
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The event to send to the current focus.
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendKeySync(KeyEvent event) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
877ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown
878ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        long downTime = event.getDownTime();
879ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        long eventTime = event.getEventTime();
880ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int action = event.getAction();
881ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int code = event.getKeyCode();
882ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int repeatCount = event.getRepeatCount();
883ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int metaState = event.getMetaState();
884ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int deviceId = event.getDeviceId();
885ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int scancode = event.getScanCode();
886ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int source = event.getSource();
887ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        int flags = event.getFlags();
888ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        if (source == InputDevice.SOURCE_UNKNOWN) {
889ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown            source = InputDevice.SOURCE_KEYBOARD;
890ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        }
891ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        if (eventTime == 0) {
892ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown            eventTime = SystemClock.uptimeMillis();
893ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        }
894ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        if (downTime == 0) {
895ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown            downTime = eventTime;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
897ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
898ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown                deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source);
8999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        InputManager.getInstance().injectInputEvent(newEvent,
900ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown                InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends an up and down key event sync to the currently focused window.
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param key The integer keycode for the event.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendKeyDownUpSync(int key) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, key));
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, key));
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Higher-level method for sending both the down and up key events for a
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * particular character key code.  Equivalent to creating both KeyEvent
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * objects by hand and calling {@link #sendKeySync}.  The event appears
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as if it came from keyboard 0, the built in one.
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyCode The key code of the character to send.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendCharacterSync(int keyCode) {
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, keyCode));
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, keyCode));
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch a pointer event. Finished at some point after the recipient has
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned from its event processing, though it may <em>not</em> have
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finished reacting from the event -- for example, if it needs
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to update its display as a result, it may still be in the process of
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * doing that.
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event A motion event describing the pointer action.  (As noted in
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendPointerSync(MotionEvent event) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
939ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
940ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown            event.setSource(InputDevice.SOURCE_TOUCHSCREEN);
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        InputManager.getInstance().injectInputEvent(event,
9439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch a trackball event. Finished at some point after the recipient has
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned from its event processing, though it may <em>not</em> have
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * completely finished reacting from the event -- for example, if it needs
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to update its display as a result, it may still be in the process of
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * doing that.
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event A motion event describing the trackball action.  (As noted in
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendTrackballEventSync(MotionEvent event) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        validateNotAppThread();
959ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown        if ((event.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) {
960ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brown            event.setSource(InputDevice.SOURCE_TRACKBALL);
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        InputManager.getInstance().injectInputEvent(event,
9639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of the process's {@link Application} object.  The
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation provides the normal system behavior.
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cl The ClassLoader with which to instantiate the object.
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param className The name of the class implementing the Application
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  object.
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context to initialize the application with
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly instantiated Application object.
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Application newApplication(ClassLoader cl, String className, Context context)
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws InstantiationException, IllegalAccessException,
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassNotFoundException {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return newApplication(cl.loadClass(className), context);
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of the process's {@link Application} object.  The
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation provides the normal system behavior.
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param clazz The class used to create an Application object from.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context to initialize the application with
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly instantiated Application object.
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Application newApplication(Class<?> clazz, Context context)
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws InstantiationException, IllegalAccessException,
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassNotFoundException {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Application app = (Application)clazz.newInstance();
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        app.attach(context);
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return app;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of the application's {@link Application#onCreate}
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
10036ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn     *
10046ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn     * <p>Note: This method will be called immediately after {@link #onCreate(Bundle)}.
10056ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn     * Often instrumentation tests start their test thread in onCreate(); you
10066ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn     * need to be careful of races between these.  (Well between it and
10076ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn     * everything else, but let's start here.)
10086ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn     *
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param app The application being created.
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callApplicationOnCreate(Application app) {
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        app.onCreate();
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of an {@link Activity} object.  This method is intended for use with
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unit tests, such as android.test.ActivityUnitTestCase.  The activity will be useable
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * locally but will be missing some of the linkages necessary for use within the sytem.
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param clazz The Class of the desired Activity
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The base context for the activity to use
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param token The token for this activity to communicate with
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param application The application object (if any)
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The intent that started this Activity
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param info ActivityInfo from the manifest
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param title The title, typically retrieved from the ActivityInfo record
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parent The parent Activity (if any)
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The embedded Id (if any)
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param lastNonConfigurationInstance Arbitrary object that will be
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * available via {@link Activity#getLastNonConfigurationInstance()
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity.getLastNonConfigurationInstance()}.
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the instantiated activity
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws InstantiationException
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalAccessException
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity newActivity(Class<?> clazz, Context context,
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder token, Application application, Intent intent, ActivityInfo info,
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence title, Activity parent, String id,
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Object lastNonConfigurationInstance) throws InstantiationException,
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IllegalAccessException {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity activity = (Activity)clazz.newInstance();
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityThread aThread = null;
1043233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner        activity.attach(context, aThread, this, token, 0, application, intent,
1044b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                info, title, parent, id,
1045b4bc78b16a05554c57508b488e21dd8eca4e13e6Dianne Hackborn                (Activity.NonConfigurationInstances)lastNonConfigurationInstance,
104685d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                new Configuration(), null, null);
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return activity;
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform instantiation of the process's {@link Activity} object.  The
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation provides the normal system behavior.
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cl The ClassLoader with which to instantiate the object.
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param className The name of the class implementing the Activity
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  object.
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The Intent object that specified the activity class being
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               instantiated.
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The newly instantiated Activity object.
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Activity newActivity(ClassLoader cl, String className,
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent intent)
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws InstantiationException, IllegalAccessException,
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ClassNotFoundException {
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (Activity)cl.loadClass(className).newInstance();
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069a002604af0c9b1204556610537b85685d7055996Craig Mautner    private void prePerformCreate(Activity activity) {
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWaitingActivities != null) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mWaitingActivities.size();
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityWaiter aw = mWaitingActivities.get(i);
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Intent intent = aw.intent;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (intent.filterEquals(activity.getIntent())) {
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        aw.activity = activity;
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mMessageQueue.addIdleHandler(new ActivityGoing(aw));
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1083a002604af0c9b1204556610537b85685d7055996Craig Mautner    }
1084a002604af0c9b1204556610537b85685d7055996Craig Mautner
1085a002604af0c9b1204556610537b85685d7055996Craig Mautner    private void postPerformCreate(Activity activity) {
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityMonitors != null) {
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mActivityMonitors.size();
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityMonitor am = mActivityMonitors.get(i);
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    am.match(activity, activity, activity.getIntent());
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1096a002604af0c9b1204556610537b85685d7055996Craig Mautner
1097a002604af0c9b1204556610537b85685d7055996Craig Mautner    /**
1098a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Perform calling of an activity's {@link Activity#onCreate}
1099a002604af0c9b1204556610537b85685d7055996Craig Mautner     * method.  The default implementation simply calls through to that method.
1100a002604af0c9b1204556610537b85685d7055996Craig Mautner     *
1101a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param activity The activity being created.
1102a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param icicle The previously frozen state (or null) to pass through to onCreate().
1103a002604af0c9b1204556610537b85685d7055996Craig Mautner     */
1104a002604af0c9b1204556610537b85685d7055996Craig Mautner    public void callActivityOnCreate(Activity activity, Bundle icicle) {
1105a002604af0c9b1204556610537b85685d7055996Craig Mautner        prePerformCreate(activity);
1106a002604af0c9b1204556610537b85685d7055996Craig Mautner        activity.performCreate(icicle);
1107a002604af0c9b1204556610537b85685d7055996Craig Mautner        postPerformCreate(activity);
1108a002604af0c9b1204556610537b85685d7055996Craig Mautner    }
1109a002604af0c9b1204556610537b85685d7055996Craig Mautner
1110a002604af0c9b1204556610537b85685d7055996Craig Mautner    /**
1111a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Perform calling of an activity's {@link Activity#onCreate}
1112a002604af0c9b1204556610537b85685d7055996Craig Mautner     * method.  The default implementation simply calls through to that method.
1113a002604af0c9b1204556610537b85685d7055996Craig Mautner     *  @param activity The activity being created.
1114a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param icicle The previously frozen state (or null) to pass through to
1115a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param persistentState The previously persisted state (or null)
1116a002604af0c9b1204556610537b85685d7055996Craig Mautner     */
1117a002604af0c9b1204556610537b85685d7055996Craig Mautner    public void callActivityOnCreate(Activity activity, Bundle icicle,
1118a002604af0c9b1204556610537b85685d7055996Craig Mautner            PersistableBundle persistentState) {
1119a002604af0c9b1204556610537b85685d7055996Craig Mautner        prePerformCreate(activity);
1120a002604af0c9b1204556610537b85685d7055996Craig Mautner        activity.performCreate(icicle, persistentState);
1121a002604af0c9b1204556610537b85685d7055996Craig Mautner        postPerformCreate(activity);
1122a002604af0c9b1204556610537b85685d7055996Craig Mautner    }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnDestroy(Activity activity) {
112518f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot      // TODO: the following block causes intermittent hangs when using startActivity
112618f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot      // temporarily comment out until root cause is fixed (bug 2630683)
112718f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//      if (mWaitingActivities != null) {
112818f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//          synchronized (mSync) {
112918f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//              final int N = mWaitingActivities.size();
113018f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//              for (int i=0; i<N; i++) {
113118f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//                  final ActivityWaiter aw = mWaitingActivities.get(i);
113218f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//                  final Intent intent = aw.intent;
113318f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//                  if (intent.filterEquals(activity.getIntent())) {
113418f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//                      aw.activity = activity;
113518f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//                      mMessageQueue.addIdleHandler(new ActivityGoing(aw));
113618f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//                  }
113718f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//              }
113818f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//          }
113918f9ce0dc12f5a3bb113f25cb4c14e646a064a2fBrett Chabot//      }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11412dedce6e84679ead961a485c7fe4b0f77c713b6aDianne Hackborn      activity.performDestroy();
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      if (mActivityMonitors != null) {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          synchronized (mSync) {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              final int N = mActivityMonitors.size();
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              for (int i=0; i<N; i++) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  final ActivityMonitor am = mActivityMonitors.get(i);
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                  am.match(activity, activity, activity.getIntent());
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      }
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onRestoreInstanceState}
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
1157a002604af0c9b1204556610537b85685d7055996Craig Mautner     *
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being restored.
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param savedInstanceState The previously saved state being restored.
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnRestoreInstanceState(Activity activity, Bundle savedInstanceState) {
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performRestoreInstanceState(savedInstanceState);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1166a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Perform calling of an activity's {@link Activity#onRestoreInstanceState}
1167a002604af0c9b1204556610537b85685d7055996Craig Mautner     * method.  The default implementation simply calls through to that method.
1168a002604af0c9b1204556610537b85685d7055996Craig Mautner     *
1169a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param activity The activity being restored.
1170a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param savedInstanceState The previously saved state being restored.
1171a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param persistentState The previously persisted state (or null)
1172a002604af0c9b1204556610537b85685d7055996Craig Mautner     */
1173a002604af0c9b1204556610537b85685d7055996Craig Mautner    public void callActivityOnRestoreInstanceState(Activity activity, Bundle savedInstanceState,
1174a002604af0c9b1204556610537b85685d7055996Craig Mautner            PersistableBundle persistentState) {
1175a002604af0c9b1204556610537b85685d7055996Craig Mautner        activity.performRestoreInstanceState(savedInstanceState, persistentState);
1176a002604af0c9b1204556610537b85685d7055996Craig Mautner    }
1177a002604af0c9b1204556610537b85685d7055996Craig Mautner
1178a002604af0c9b1204556610537b85685d7055996Craig Mautner    /**
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onPostCreate} method.
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply calls through to that method.
1181a002604af0c9b1204556610537b85685d7055996Craig Mautner     *
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being created.
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param icicle The previously frozen state (or null) to pass through to
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               onPostCreate().
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnPostCreate(Activity activity, Bundle icicle) {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onPostCreate(icicle);
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1191a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Perform calling of an activity's {@link Activity#onPostCreate} method.
1192a002604af0c9b1204556610537b85685d7055996Craig Mautner     * The default implementation simply calls through to that method.
1193a002604af0c9b1204556610537b85685d7055996Craig Mautner     *
1194a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param activity The activity being created.
1195a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param icicle The previously frozen state (or null) to pass through to
1196a002604af0c9b1204556610537b85685d7055996Craig Mautner     *               onPostCreate().
1197a002604af0c9b1204556610537b85685d7055996Craig Mautner     */
1198a002604af0c9b1204556610537b85685d7055996Craig Mautner    public void callActivityOnPostCreate(Activity activity, Bundle icicle,
1199a002604af0c9b1204556610537b85685d7055996Craig Mautner            PersistableBundle persistentState) {
1200a002604af0c9b1204556610537b85685d7055996Craig Mautner        activity.onPostCreate(icicle, persistentState);
1201a002604af0c9b1204556610537b85685d7055996Craig Mautner    }
1202a002604af0c9b1204556610537b85685d7055996Craig Mautner
1203a002604af0c9b1204556610537b85685d7055996Craig Mautner    /**
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onNewIntent}
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity receiving a new Intent.
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The new intent being received.
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnNewIntent(Activity activity, Intent intent) {
1211a01a0faebfbe6a8bd2ae52c54268ecedd280509bDianne Hackborn        activity.onNewIntent(intent);
1212a01a0faebfbe6a8bd2ae52c54268ecedd280509bDianne Hackborn    }
1213a01a0faebfbe6a8bd2ae52c54268ecedd280509bDianne Hackborn
1214a01a0faebfbe6a8bd2ae52c54268ecedd280509bDianne Hackborn    /**
1215a01a0faebfbe6a8bd2ae52c54268ecedd280509bDianne Hackborn     * @hide
1216a01a0faebfbe6a8bd2ae52c54268ecedd280509bDianne Hackborn     */
1217a01a0faebfbe6a8bd2ae52c54268ecedd280509bDianne Hackborn    public void callActivityOnNewIntent(Activity activity, ReferrerIntent intent) {
121885d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn        final String oldReferrer = activity.mReferrer;
121985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn        try {
122080b1c5608ec9cbb43c696d772eb69a2e220ef819Dianne Hackborn            if (intent != null) {
122180b1c5608ec9cbb43c696d772eb69a2e220ef819Dianne Hackborn                activity.mReferrer = intent.mReferrer;
122280b1c5608ec9cbb43c696d772eb69a2e220ef819Dianne Hackborn            }
122380b1c5608ec9cbb43c696d772eb69a2e220ef819Dianne Hackborn            callActivityOnNewIntent(activity, intent != null ? new Intent(intent) : null);
122485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn        } finally {
122585d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn            activity.mReferrer = oldReferrer;
122685d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn        }
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onStart}
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being started.
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnStart(Activity activity) {
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onStart();
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onRestart}
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being restarted.
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnRestart(Activity activity) {
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onRestart();
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onResume} method.  The
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply calls through to that method.
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being resumed.
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnResume(Activity activity) {
125652d3203ef69d4babbc4dd030a15c08c0b8d1d226Jeff Hamilton        activity.mResumed = true;
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onResume();
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityMonitors != null) {
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mActivityMonitors.size();
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityMonitor am = mActivityMonitors.get(i);
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    am.match(activity, activity, activity.getIntent());
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onStop}
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method.  The default implementation simply calls through to that method.
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being stopped.
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnStop(Activity activity) {
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.onStop();
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1281c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen     * Perform calling of an activity's {@link Activity#onSaveInstanceState}
1282c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen     * method.  The default implementation simply calls through to that method.
1283a002604af0c9b1204556610537b85685d7055996Craig Mautner     *
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being saved.
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outState The bundle to pass to the call.
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnSaveInstanceState(Activity activity, Bundle outState) {
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performSaveInstanceState(outState);
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1292a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Perform calling of an activity's {@link Activity#onSaveInstanceState}
1293a002604af0c9b1204556610537b85685d7055996Craig Mautner     * method.  The default implementation simply calls through to that method.
1294a002604af0c9b1204556610537b85685d7055996Craig Mautner     *  @param activity The activity being saved.
1295a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param outState The bundle to pass to the call.
1296a002604af0c9b1204556610537b85685d7055996Craig Mautner     * @param outPersistentState The persistent bundle to pass to the call.
1297a002604af0c9b1204556610537b85685d7055996Craig Mautner     */
1298a002604af0c9b1204556610537b85685d7055996Craig Mautner    public void callActivityOnSaveInstanceState(Activity activity, Bundle outState,
1299a002604af0c9b1204556610537b85685d7055996Craig Mautner            PersistableBundle outPersistentState) {
1300a002604af0c9b1204556610537b85685d7055996Craig Mautner        activity.performSaveInstanceState(outState, outPersistentState);
1301a002604af0c9b1204556610537b85685d7055996Craig Mautner    }
1302a002604af0c9b1204556610537b85685d7055996Craig Mautner
1303a002604af0c9b1204556610537b85685d7055996Craig Mautner    /**
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onPause} method.  The
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * default implementation simply calls through to that method.
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being paused.
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnPause(Activity activity) {
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performPause();
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform calling of an activity's {@link Activity#onUserLeaveHint} method.
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation simply calls through to that method.
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param activity The activity being notified that the user has navigated away
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void callActivityOnUserLeaving(Activity activity) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        activity.performUserLeaving();
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts allocation counting. This triggers a gc and resets the counts.
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAllocCounting() {
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Before we start trigger a GC and reset the debug counts. Run the
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // finalizers and another GC before starting and stopping the alloc
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // counts. This will free up any objects that were just sitting around
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // waiting for their finalizers to be run.
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().runFinalization();
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Debug.resetAllCounts();
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // start the counts
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Debug.startAllocCounting();
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops allocation counting.
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopAllocCounting() {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().runFinalization();
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Runtime.getRuntime().gc();
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Debug.stopAllocCounting();
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If Results already contains Key, it appends Value to the key's ArrayList
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the key. If the key doesn't already exist in results, it
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * adds the key/value pair to results.
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addValue(String key, int value, Bundle results) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (results.containsKey(key)) {
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<Integer> list = results.getIntegerArrayList(key);
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (list != null) {
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                list.add(value);
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<Integer> list = new ArrayList<Integer>();
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            list.add(value);
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.putIntegerArrayList(key, list);
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a bundle with the current results from the allocation counting.
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Bundle getAllocCounts() {
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle results = new Bundle();
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_alloc_count", Debug.getGlobalAllocCount());
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_alloc_size", Debug.getGlobalAllocSize());
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_freed_count", Debug.getGlobalFreedCount());
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("global_freed_size", Debug.getGlobalFreedSize());
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("gc_invocation_count", Debug.getGlobalGcInvocationCount());
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return results;
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a bundle with the counts for various binder counts for this process. Currently the only two that are
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reported are the number of send and the number of received transactions.
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Bundle getBinderCounts() {
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle results = new Bundle();
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("sent_transactions", Debug.getBinderSentTransactions());
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        results.putLong("received_transactions", Debug.getBinderReceivedTransactions());
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return results;
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Description of a Activity execution result to return to the original
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity.
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class ActivityResult {
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a new activity result.  See {@link Activity#setResult} for
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * more information.
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param resultCode The result code to propagate back to the
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * originating activity, often RESULT_CANCELED or RESULT_OK
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param resultData The data to propagate back to the originating
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * activity.
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityResult(int resultCode, Intent resultData) {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultCode = resultCode;
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResultData = resultData;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the result code contained in this result.
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getResultCode() {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mResultCode;
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the data contained in this result.
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Intent getResultData() {
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mResultData;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int mResultCode;
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Intent mResultData;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute a startActivity call made by the application.  The default
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * implementation takes care of updating any active {@link ActivityMonitor}
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * objects and dispatches this call to the system activity manager; you can
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * override this to watch for the application to start an activity, and
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modify what happens when it does.
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method returns an {@link ActivityResult} object, which you can
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use when intercepting application calls to avoid performing the start
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity action but still return the result the application is
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * expecting.  To do this, override this method to catch the call to start
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activity so that it returns a new ActivityResult containing the results
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you would like the application to see, and don't call up to the super
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * class.  Note that an application is only expecting a result if
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <var>requestCode</var> is &gt;= 0.
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This method throws {@link android.content.ActivityNotFoundException}
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if there was no Activity found to run the given Intent.
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param who The Context from which the activity is being started.
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param contextThread The main thread of the Context from which the activity
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                      is being started.
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param token Internal token identifying to the system who is starting
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              the activity; may be null.
14546e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param target Which activity is performing the start (and thus receiving
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               any result); may be null if this call is not being made
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               from an activity.
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The actual Intent to start.
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param requestCode Identifier for this request's result; less than zero
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    if the caller is not expecting a result.
1460a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn     * @param options Addition options.
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return To force the return of a particular result, return an
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         ActivityResult object containing the desired data; otherwise
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         return null.  The default implementation always returns null.
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws android.content.ActivityNotFoundException
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Activity#startActivity(Intent)
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Activity#startActivityForResult(Intent, int)
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Activity#startActivityFromChild
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityResult execStartActivity(
1475621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            Context who, IBinder contextThread, IBinder token, Activity target,
1476a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            Intent intent, int requestCode, Bundle options) {
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IApplicationThread whoThread = (IApplicationThread) contextThread;
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mActivityMonitors != null) {
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = mActivityMonitors.size();
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ActivityMonitor am = mActivityMonitors.get(i);
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (am.match(who, null, intent)) {
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        am.mHits++;
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (am.isBlocking()) {
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return requestCode >= 0 ? am.getResult() : null;
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1494678d04f1b6d189b2d867d518065f90dce7292863Jeff Sharkey            intent.migrateExtraStreamToClipData();
1495a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int result = ActivityManagerNative.getDefault()
1497f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn                .startActivity(whoThread, who.getBasePackageName(), intent,
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.resolveTypeIfNeeded(who.getContentResolver()),
1499a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        token, target != null ? target.mEmbeddedID : null,
15001b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                        requestCode, 0, null, options);
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkStartActivityResult(result, intent);
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    /**
1508a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Like {@link #execStartActivity(Context, IBinder, IBinder, Activity, Intent, int, Bundle)},
1509621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * but accepts an array of activities to be started.  Note that active
1510621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * {@link ActivityMonitor} objects only match against the first activity in
1511621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * the array.
1512621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     *
1513621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     * {@hide}
1514621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn     */
1515621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    public void execStartActivities(Context who, IBinder contextThread,
1516a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            IBinder token, Activity target, Intent[] intents, Bundle options) {
1517ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani        execStartActivitiesAsUser(who, contextThread, token, target, intents, options,
1518ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani                UserHandle.myUserId());
1519ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    }
1520ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani
1521ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    /**
1522a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Like {@link #execStartActivity(Context, IBinder, IBinder, Activity, Intent, int, Bundle)},
1523ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani     * but accepts an array of activities to be started.  Note that active
1524ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani     * {@link ActivityMonitor} objects only match against the first activity in
1525ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani     * the array.
1526ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani     *
1527ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani     * {@hide}
1528ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani     */
1529ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani    public void execStartActivitiesAsUser(Context who, IBinder contextThread,
1530ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            IBinder token, Activity target, Intent[] intents, Bundle options,
1531ea7e91514ee1968d15713e82a5cca745e2c46a05Amith Yamasani            int userId) {
1532621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        IApplicationThread whoThread = (IApplicationThread) contextThread;
1533621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        if (mActivityMonitors != null) {
1534621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            synchronized (mSync) {
1535621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                final int N = mActivityMonitors.size();
1536621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                for (int i=0; i<N; i++) {
1537621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    final ActivityMonitor am = mActivityMonitors.get(i);
1538621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    if (am.match(who, null, intents[0])) {
1539621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        am.mHits++;
1540621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        if (am.isBlocking()) {
1541621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                            return;
1542621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        }
1543621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                        break;
1544621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                    }
1545621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                }
1546621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
1547621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
1548621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        try {
1549621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            String[] resolvedTypes = new String[intents.length];
1550621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            for (int i=0; i<intents.length; i++) {
1551a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey                intents[i].migrateExtraStreamToClipData();
1552a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey                intents[i].prepareToLeaveProcess();
1553621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn                resolvedTypes[i] = intents[i].resolveTypeIfNeeded(who.getContentResolver());
1554621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            }
1555621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            int result = ActivityManagerNative.getDefault()
1556f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn                .startActivities(whoThread, who.getBasePackageName(), intents, resolvedTypes,
1557f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn                        token, options, userId);
1558621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn            checkStartActivityResult(result, intents[0]);
1559621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        } catch (RemoteException e) {
1560621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn        }
1561621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    }
1562621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn
1563621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn    /**
1564f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * Like {@link #execStartActivity(android.content.Context, android.os.IBinder,
1565f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * android.os.IBinder, Fragment, android.content.Intent, int, android.os.Bundle)},
15666e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * but for calls from a {#link Fragment}.
15676e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
15686e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param who The Context from which the activity is being started.
15696e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param contextThread The main thread of the Context from which the activity
15706e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *                      is being started.
15716e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param token Internal token identifying to the system who is starting
15726e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *              the activity; may be null.
15736e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param target Which fragment is performing the start (and thus receiving
15746e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *               any result).
15756e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param intent The actual Intent to start.
15766e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @param requestCode Identifier for this request's result; less than zero
15776e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *                    if the caller is not expecting a result.
15786e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
15796e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @return To force the return of a particular result, return an
15806e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *         ActivityResult object containing the desired data; otherwise
15816e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *         return null.  The default implementation always returns null.
15826e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
15836e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @throws android.content.ActivityNotFoundException
15846e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
15856e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Activity#startActivity(Intent)
15866e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Activity#startActivityForResult(Intent, int)
15876e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * @see Activity#startActivityFromChild
15886e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     *
15896e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     * {@hide}
15906e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn     */
15916e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    public ActivityResult execStartActivity(
15926e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        Context who, IBinder contextThread, IBinder token, Fragment target,
1593a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        Intent intent, int requestCode, Bundle options) {
15946e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        IApplicationThread whoThread = (IApplicationThread) contextThread;
15956e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        if (mActivityMonitors != null) {
15966e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            synchronized (mSync) {
15976e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                final int N = mActivityMonitors.size();
15986e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                for (int i=0; i<N; i++) {
15996e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    final ActivityMonitor am = mActivityMonitors.get(i);
16006e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    if (am.match(who, null, intent)) {
16016e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        am.mHits++;
16026e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        if (am.isBlocking()) {
16036e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                            return requestCode >= 0 ? am.getResult() : null;
16046e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        }
16056e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        break;
16066e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                    }
16076e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                }
16086e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            }
16096e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
16106e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        try {
1611678d04f1b6d189b2d867d518065f90dce7292863Jeff Sharkey            intent.migrateExtraStreamToClipData();
1612a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
16136e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            int result = ActivityManagerNative.getDefault()
1614f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn                .startActivity(whoThread, who.getBasePackageName(), intent,
16156e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn                        intent.resolveTypeIfNeeded(who.getContentResolver()),
1616a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn                        token, target != null ? target.mWho : null,
16171b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                        requestCode, 0, null, options);
16186e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn            checkStartActivityResult(result, intent);
16196e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        } catch (RemoteException e) {
16206e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        }
16216e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn        return null;
16226e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn    }
16236e8304e57ec533e257a2496183125f257be1ff60Dianne Hackborn
1624f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    /**
1625a002604af0c9b1204556610537b85685d7055996Craig Mautner     * Like {@link #execStartActivity(Context, IBinder, IBinder, Activity, Intent, int, Bundle)},
1626a002604af0c9b1204556610537b85685d7055996Craig Mautner     * but for starting as a particular user.
1627f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *
1628f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @param who The Context from which the activity is being started.
1629f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @param contextThread The main thread of the Context from which the activity
1630f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *                      is being started.
1631f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @param token Internal token identifying to the system who is starting
1632f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *              the activity; may be null.
1633f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @param target Which fragment is performing the start (and thus receiving
1634f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *               any result).
1635f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @param intent The actual Intent to start.
1636f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @param requestCode Identifier for this request's result; less than zero
1637f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *                    if the caller is not expecting a result.
1638f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *
1639f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @return To force the return of a particular result, return an
1640f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *         ActivityResult object containing the desired data; otherwise
1641f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *         return null.  The default implementation always returns null.
1642f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *
1643f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @throws android.content.ActivityNotFoundException
1644f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *
1645f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @see Activity#startActivity(Intent)
1646f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @see Activity#startActivityForResult(Intent, int)
1647f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * @see Activity#startActivityFromChild
1648f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     *
1649f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     * {@hide}
1650f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn     */
1651f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    public ActivityResult execStartActivity(
1652f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            Context who, IBinder contextThread, IBinder token, Activity target,
1653f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            Intent intent, int requestCode, Bundle options, UserHandle user) {
1654f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        IApplicationThread whoThread = (IApplicationThread) contextThread;
1655f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        if (mActivityMonitors != null) {
1656f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            synchronized (mSync) {
1657f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                final int N = mActivityMonitors.size();
1658f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                for (int i=0; i<N; i++) {
1659f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                    final ActivityMonitor am = mActivityMonitors.get(i);
1660f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                    if (am.match(who, null, intent)) {
1661f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        am.mHits++;
1662f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        if (am.isBlocking()) {
1663f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                            return requestCode >= 0 ? am.getResult() : null;
1664f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        }
1665f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        break;
1666f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                    }
1667f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                }
1668f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            }
1669f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        }
1670f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        try {
1671f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            intent.migrateExtraStreamToClipData();
1672a14acd20b8d563319ea1a5974dca0e9a29f0aaefJeff Sharkey            intent.prepareToLeaveProcess();
1673f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            int result = ActivityManagerNative.getDefault()
1674f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn                .startActivityAsUser(whoThread, who.getBasePackageName(), intent,
1675f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        intent.resolveTypeIfNeeded(who.getContentResolver()),
1676f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn                        token, target != null ? target.mEmbeddedID : null,
16771b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                        requestCode, 0, null, options, user.getIdentifier());
1678f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn            checkStartActivityResult(result, intent);
1679f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        } catch (RemoteException e) {
1680f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        }
1681f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn        return null;
1682f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn    }
1683f1c26e2fd03e9765fde519e238fc23d4e3d06df2Dianne Hackborn
1684028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn    /**
1685028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn     * Special version!
1686028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn     * @hide
1687028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn     */
1688028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn    public ActivityResult execStartActivityAsCaller(
1689028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn            Context who, IBinder contextThread, IBinder token, Activity target,
16909797880808320e3a7bae1f59bc7e0c5a13189e5fJeff Sharkey            Intent intent, int requestCode, Bundle options, int userId) {
1691028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn        IApplicationThread whoThread = (IApplicationThread) contextThread;
1692028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn        if (mActivityMonitors != null) {
1693028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn            synchronized (mSync) {
1694028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                final int N = mActivityMonitors.size();
1695028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                for (int i=0; i<N; i++) {
1696028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                    final ActivityMonitor am = mActivityMonitors.get(i);
1697028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                    if (am.match(who, null, intent)) {
1698028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                        am.mHits++;
1699028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                        if (am.isBlocking()) {
1700028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                            return requestCode >= 0 ? am.getResult() : null;
1701028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                        }
1702028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                        break;
1703028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                    }
1704028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                }
1705028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn            }
1706028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn        }
1707028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn        try {
1708028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn            intent.migrateExtraStreamToClipData();
1709028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn            intent.prepareToLeaveProcess();
1710028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn            int result = ActivityManagerNative.getDefault()
1711028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                .startActivityAsCaller(whoThread, who.getBasePackageName(), intent,
1712028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                        intent.resolveTypeIfNeeded(who.getContentResolver()),
1713028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn                        token, target != null ? target.mEmbeddedID : null,
17149797880808320e3a7bae1f59bc7e0c5a13189e5fJeff Sharkey                        requestCode, 0, null, options, userId);
1715028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn            checkStartActivityResult(result, intent);
1716028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn        } catch (RemoteException e) {
1717028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn        }
1718028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn        return null;
1719028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn    }
1720028ceeb472801bcfa5844fc89ed0da8463098824Dianne Hackborn
172189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    /**
172289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn     * Special version!
172389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn     * @hide
172489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn     */
172589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    public void execStartActivityFromAppTask(
172689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            Context who, IBinder contextThread, IAppTask appTask,
172789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            Intent intent, Bundle options) {
172889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        IApplicationThread whoThread = (IApplicationThread) contextThread;
172989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if (mActivityMonitors != null) {
173089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            synchronized (mSync) {
173189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                final int N = mActivityMonitors.size();
173289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                for (int i=0; i<N; i++) {
173389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    final ActivityMonitor am = mActivityMonitors.get(i);
173489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    if (am.match(who, null, intent)) {
173589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        am.mHits++;
173689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        if (am.isBlocking()) {
173789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                            return;
173889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        }
173989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        break;
174089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    }
174189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
174289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
174389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
174489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        try {
174589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            intent.migrateExtraStreamToClipData();
174689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            intent.prepareToLeaveProcess();
174789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            int result = appTask.startActivity(whoThread.asBinder(), who.getBasePackageName(),
174889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    intent, intent.resolveTypeIfNeeded(who.getContentResolver()), options);
174989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            checkStartActivityResult(result, intent);
175089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        } catch (RemoteException e) {
175189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
175289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        return;
175389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    }
175489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ final void init(ActivityThread thread,
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Context instrContext, Context appContext, ComponentName component,
175780943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov            IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection) {
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread = thread;
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageQueue = mThread.getLooper().myQueue();
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInstrContext = instrContext;
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAppContext = appContext;
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mComponent = component;
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWatcher = watcher;
176480943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov        mUiAutomationConnection = uiAutomationConnection;
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
176791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    /** @hide */
176891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn    public static void checkStartActivityResult(int res, Object intent) {
1769a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn        if (res >= ActivityManager.START_SUCCESS) {
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (res) {
1774a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            case ActivityManager.START_INTENT_NOT_RESOLVED:
1775a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            case ActivityManager.START_CLASS_NOT_FOUND:
1776bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                if (intent instanceof Intent && ((Intent)intent).getComponent() != null)
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new ActivityNotFoundException(
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Unable to find explicit activity class "
1779bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            + ((Intent)intent).getComponent().toShortString()
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "; have you declared this activity in your AndroidManifest.xml?");
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ActivityNotFoundException(
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "No Activity found to handle " + intent);
1783a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            case ActivityManager.START_PERMISSION_DENIED:
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new SecurityException("Not allowed to start activity "
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + intent);
1786a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            case ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new AndroidRuntimeException(
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "FORWARD_RESULT_FLAG used while also requesting a result");
1789a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn            case ActivityManager.START_NOT_ACTIVITY:
1790bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                throw new IllegalArgumentException(
1791bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        "PendingIntent is not an activity");
179291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            case ActivityManager.START_NOT_VOICE_COMPATIBLE:
179391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                throw new SecurityException(
179491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        "Starting under voice control not allowed for: " + intent);
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new AndroidRuntimeException("Unknown error code "
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + res + " when starting " + intent);
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void validateNotAppThread() {
18020a30328c10367f57834d7e8597832b6af00f5240Kristian Monsen        if (Looper.myLooper() == Looper.getMainLooper()) {
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "This method can not be called from the main application thread");
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
180880943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov    /**
180980943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * Gets the {@link UiAutomation} instance.
181080943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * <p>
181180943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * <strong>Note:</strong> The APIs exposed via the returned {@link UiAutomation}
181280943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * work across application boundaries while the APIs exposed by the instrumentation
181380943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * do not. For example, {@link Instrumentation#sendPointerSync(MotionEvent)} will
181480943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * not allow you to inject the event in an app different from the instrumentation
181580943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * target, while {@link UiAutomation#injectInputEvent(android.view.InputEvent, boolean)}
181680943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * will work regardless of the current application.
181780943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * </p>
181880943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * <p>
181980943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * A typical test case should be using either the {@link UiAutomation} or
182080943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * {@link Instrumentation} APIs. Using both APIs at the same time is not
182180943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * a mistake by itself but a client has to be aware of the APIs limitations.
182280943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * </p>
182380943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * @return The UI automation instance.
182480943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     *
182580943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     * @see UiAutomation
182680943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov     */
182780943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov    public UiAutomation getUiAutomation() {
182880943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov        if (mUiAutomationConnection != null) {
182980943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov            if (mUiAutomation == null) {
183080943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov                mUiAutomation = new UiAutomation(getTargetContext().getMainLooper(),
183180943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov                        mUiAutomationConnection);
183280943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov                mUiAutomation.connect();
183380943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov            }
183480943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov            return mUiAutomation;
183580943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov        }
183680943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov        return null;
183780943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov    }
183880943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final class InstrumentationThread extends Thread {
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public InstrumentationThread(String name) {
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(name);
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_DISPLAY);
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RuntimeException e) {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Exception setting priority of instrumentation thread "
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + Process.myTid(), e);
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAutomaticPerformanceSnapshots) {
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                startPerformanceSnapshot();
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onStart();
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
185680943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class EmptyRunnable implements Runnable {
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class SyncRunnable implements Runnable {
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Runnable mTarget;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mComplete;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public SyncRunnable(Runnable target) {
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTarget = target;
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTarget.run();
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mComplete = true;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void waitForComplete() {
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (!mComplete) {
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wait();
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ActivityWaiter {
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Intent intent;
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Activity activity;
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityWaiter(Intent _intent) {
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent = _intent;
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final class ActivityGoing implements MessageQueue.IdleHandler {
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ActivityWaiter mWaiter;
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityGoing(ActivityWaiter waiter) {
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWaiter = waiter;
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final boolean queueIdle() {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWaitingActivities.remove(mWaiter);
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSync.notifyAll();
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class Idler implements MessageQueue.IdleHandler {
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Runnable mCallback;
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mIdle;
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Idler(Runnable callback) {
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallback = callback;
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIdle = false;
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final boolean queueIdle() {
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCallback != null) {
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCallback.run();
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIdle = true;
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void waitForIdle() {
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (!mIdle) {
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wait();
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1947