19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 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.test; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Activity; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Application; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.mock.MockApplication; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window; 29bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynskiimport android.util.Log; 30bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 31bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides isolated testing of a single activity. The activity under test will 35b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * be created with minimal connection to the system infrastructure, and you can inject mocked or 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wrappered versions of many of Activity's dependencies. Most of the work is handled 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically here by {@link #setUp} and {@link #tearDown}. 38b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If you prefer a functional test, see {@link android.test.ActivityInstrumentationTestCase}. 40b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It must be noted that, as a true unit test, your Activity will not be running in the 42b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * normal system and will not participate in the normal interactions with other Activities. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following methods should not be called in this configuration - most of them will throw 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exceptions: 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#createPendingResult(int, Intent, int)}</li> 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivityIfNeeded(Intent, int)}</li> 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivityFromChild(Activity, Intent, int)}</li> 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startNextMatchingActivity(Intent)}</li> 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#getCallingActivity()}</li> 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#getCallingPackage()}</li> 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#createPendingResult(int, Intent, int)}</li> 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#getTaskId()}</li> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#isTaskRoot()}</li> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#moveTaskToBack(boolean)}</li> 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 57b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * 58b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * <p>The following methods may be called but will not do anything. For test purposes, you can use 59b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * the methods {@link #getStartedActivityIntent()} and {@link #getStartedActivityRequest()} to 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inspect the parameters that they were called with. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivity(Intent)}</li> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivityForResult(Intent, int)}</li> 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 66b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * <p>The following methods may be called but will not do anything. For test purposes, you can use 67b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * the methods {@link #isFinishCalled()} and {@link #getFinishedActivityRequest()} to inspect the 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters that they were called with. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finish()}</li> 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishFromChild(Activity child)}</li> 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishActivity(int requestCode)}</li> 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 75b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * @deprecated Write 76b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * <a href="{@docRoot}training/testing/unit-testing/local-unit-tests.html">Local Unit Tests</a> 77b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * instead. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 79b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner@Deprecated 80b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linznerpublic abstract class ActivityUnitTestCase<T extends Activity> 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extends ActivityTestCase { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski private static final String TAG = "ActivityUnitTestCase"; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Class<T> mActivityClass; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mActivityContext; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Application mApplication; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MockParent mMockParent; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAttached = false; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mCreated = false; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityUnitTestCase(Class<T> activityClass) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityClass = activityClass; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public T getActivity() { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (T) super.getActivity(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setUp() throws Exception { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setUp(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // default value for target context, as a default 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityContext = getInstrumentation().getTargetContext(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 109b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start the activity under test, in the same way as if it was started by 112b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * {@link android.content.Context#startActivity Context.startActivity()}, providing the 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * arguments it supplied. When you use this method to start the activity, it will automatically 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be stopped by {@link #tearDown}. 115b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * 116b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * <p>This method will call onCreate(), but if you wish to further exercise Activity life 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cycle methods, you must call them yourself from your test case. 118b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><i>Do not call from your setUp() method. You must call this method from each of your 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * test methods.</i> 121b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The Intent as if supplied to {@link android.content.Context#startActivity}. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param savedInstanceState The instance state, if you are simulating this part of the life 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cycle. Typically null. 125b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * @param lastNonConfigurationInstance This Object will be available to the 126b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * Activity if it calls {@link android.app.Activity#getLastNonConfigurationInstance()}. 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Typically null. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the Activity that was created 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected T startActivity(Intent intent, Bundle savedInstanceState, 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object lastNonConfigurationInstance) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertFalse("Activity already created", mCreated); 133b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAttached) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertNotNull(mActivityClass); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivity(null); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T newActivity = null; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mApplication == null) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setApplication(new MockApplication()); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 143bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski ComponentName cn = new ComponentName(mActivityClass.getPackage().getName(), 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityClass.getName()); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setComponent(cn); 146ff51fe211d87fd97377f7ac1afb783ea154dba6eBrett Chabot ActivityInfo info = new ActivityInfo(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence title = mActivityClass.getName(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMockParent = new MockParent(); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String id = null; 150bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = (T) getInstrumentation().newActivity(mActivityClass, mActivityContext, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token, mApplication, intent, info, title, mMockParent, id, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastNonConfigurationInstance); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 155bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski Log.w(TAG, "Catching exception", e); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertNotNull(newActivity); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 158bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertNotNull(newActivity); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivity(newActivity); 161b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttached = true; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 164bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T result = getActivity(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != null) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getInstrumentation().callActivityOnCreate(getActivity(), savedInstanceState); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCreated = true; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 172b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void tearDown() throws Exception { 175b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivity(null); 177b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 178b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner // Scrub out members - protects against memory leaks in the case where someone 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // creates a non-static inner class (thus referencing the test case) and gives it to 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // someone else to hold onto 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scrubClass(ActivityInstrumentationTestCase.class); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.tearDown(); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 185b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 187b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * Set the application for use during the test. You must call this function before calling 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startActivity}. If your test does not call this method, 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param application The Application object that will be injected into the Activity under test. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setApplication(Application application) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mApplication = application; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you wish to inject a Mock, Isolated, or otherwise altered context, you can do so 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * here. You must call this function before calling {@link #startActivity}. If you wish to 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtain a real Context, as a building block, use getInstrumentation().getTargetContext(). 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setActivityContext(Context activityContext) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityContext = activityContext; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 205b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * This method will return the value if your Activity under test calls 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setRequestedOrientation}. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRequestedOrientation() { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mRequestedOrientation; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 214b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 216b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * This method will return the launch intent if your Activity under test calls 217b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * {@link android.app.Activity#startActivity(Intent)} or 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The Intent provided in the start call, or null if no start call was made. 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent getStartedActivityIntent() { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mStartedActivityIntent; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 227b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 229b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * This method will return the launch request code if your Activity under test calls 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The request code provided in the start call, or -1 if no start call was made. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartedActivityRequest() { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mStartedActivityRequest; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 241b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * This method will notify you if the Activity under test called 242b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * {@link android.app.Activity#finish()}, 243b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * {@link android.app.Activity#finishFromChild(Activity)}, or 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#finishActivity(int)}. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if one of the listed finish methods was called. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isFinishCalled() { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mFinished; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 253b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 255b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * This method will return the request code if the Activity under test called 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#finishActivity(int)}. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The request code provided in the start call, or -1 if no finish call was made. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getFinishedActivityRequest() { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mFinishedActivityRequest; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 265b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This mock Activity represents the "parent" activity. By injecting this, we allow the user 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to call a few more Activity methods, including: 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#getRequestedOrientation()}</li> 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#setRequestedOrientation(int)}</li> 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finish()}</li> 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishActivity(int requestCode)}</li> 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishFromChild(Activity child)}</li> 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 276b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner * 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Make this overrideable, and the unit test can look for calls to other methods 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class MockParent extends Activity { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mRequestedOrientation = 0; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent mStartedActivityIntent = null; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mStartedActivityRequest = -1; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean mFinished = false; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mFinishedActivityRequest = -1; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implementing in the parent allows the user to call this function on the tested activity. 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRequestedOrientation(int requestedOrientation) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedOrientation = requestedOrientation; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implementing in the parent allows the user to call this function on the tested activity. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRequestedOrientation() { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRequestedOrientation; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By returning null here, we inhibit the creation of any "container" for the window. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Window getWindow() { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 310b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By defining this in the parent, we allow the tested activity to call 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivity(Intent)}</li> 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivityForResult(Intent, int)}</li> 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startActivityFromChild(Activity child, Intent intent, int requestCode) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartedActivityIntent = intent; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartedActivityRequest = requestCode; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 323b51617f4668ef8cf0e6d8d0fc3284eae51dbd8caStephan Linzner 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By defining this in the parent, we allow the tested activity to call 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finish()}</li> 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishFromChild(Activity child)}</li> 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishFromChild(Activity child) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By defining this in the parent, we allow the tested activity to call 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishActivity(int requestCode)}</li> 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishActivityFromChild(Activity child, int requestCode) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinishedActivityRequest = requestCode; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 349