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 >= 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