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 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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}. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If you prefer a functional test, see {@link android.test.ActivityInstrumentationTestCase}. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It must be noted that, as a true unit test, your Activity will not be running in the 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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> 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following methods may be called but will not do anything. For test purposes, you can use 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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 * 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following methods may be called but will not do anything. For test purposes, you can use 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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 * 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class ActivityUnitTestCase<T extends Activity> 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extends ActivityTestCase { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski private static final String TAG = "ActivityUnitTestCase"; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Class<T> mActivityClass; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mActivityContext; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Application mApplication; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MockParent mMockParent; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAttached = false; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mCreated = false; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityUnitTestCase(Class<T> activityClass) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityClass = activityClass; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public T getActivity() { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (T) super.getActivity(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setUp() throws Exception { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setUp(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // default value for target context, as a default 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityContext = getInstrumentation().getTargetContext(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Start the activity under test, in the same way as if it was started by 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#startActivity Context.startActivity()}, providing the 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * arguments it supplied. When you use this method to start the activity, it will automatically 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be stopped by {@link #tearDown}. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This method will call onCreate(), but if you wish to further exercise Activity life 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cycle methods, you must call them yourself from your test case. 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><i>Do not call from your setUp() method. You must call this method from each of your 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * test methods.</i> 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The Intent as if supplied to {@link android.content.Context#startActivity}. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param savedInstanceState The instance state, if you are simulating this part of the life 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cycle. Typically null. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param lastNonConfigurationInstance This Object will be available to the 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity if it calls {@link android.app.Activity#getLastNonConfigurationInstance()}. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Typically null. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the Activity that was created 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected T startActivity(Intent intent, Bundle savedInstanceState, 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object lastNonConfigurationInstance) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertFalse("Activity already created", mCreated); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAttached) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertNotNull(mActivityClass); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivity(null); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T newActivity = null; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mApplication == null) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setApplication(new MockApplication()); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 139bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski ComponentName cn = new ComponentName(mActivityClass.getPackage().getName(), 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityClass.getName()); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setComponent(cn); 142ff51fe211d87fd97377f7ac1afb783ea154dba6eBrett Chabot ActivityInfo info = new ActivityInfo(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence title = mActivityClass.getName(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMockParent = new MockParent(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String id = null; 146bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newActivity = (T) getInstrumentation().newActivity(mActivityClass, mActivityContext, 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token, mApplication, intent, info, title, mMockParent, id, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastNonConfigurationInstance); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 151bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski Log.w(TAG, "Catching exception", e); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertNotNull(newActivity); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 154bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assertNotNull(newActivity); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivity(newActivity); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttached = true; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 160bc7f4f0e1275fca1484c02ba465fce907c6692f7Filip Gruszczynski 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T result = getActivity(); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result != null) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getInstrumentation().callActivityOnCreate(getActivity(), savedInstanceState); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCreated = true; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void tearDown() throws Exception { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setActivity(null); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Scrub out members - protects against memory leaks in the case where someone 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // creates a non-static inner class (thus referencing the test case) and gives it to 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // someone else to hold onto 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scrubClass(ActivityInstrumentationTestCase.class); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.tearDown(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the application for use during the test. You must call this function before calling 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startActivity}. If your test does not call this method, 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param application The Application object that will be injected into the Activity under test. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setApplication(Application application) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mApplication = application; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you wish to inject a Mock, Isolated, or otherwise altered context, you can do so 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * here. You must call this function before calling {@link #startActivity}. If you wish to 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtain a real Context, as a building block, use getInstrumentation().getTargetContext(). 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setActivityContext(Context activityContext) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityContext = activityContext; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will return the value if your Activity under test calls 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#setRequestedOrientation}. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRequestedOrientation() { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mRequestedOrientation; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will return the launch intent if your Activity under test calls 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivity(Intent)} or 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The Intent provided in the start call, or null if no start call was made. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent getStartedActivityIntent() { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mStartedActivityIntent; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will return the launch request code if your Activity under test calls 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startActivityForResult(Intent, int)}. 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The request code provided in the start call, or -1 if no start call was made. 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartedActivityRequest() { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mStartedActivityRequest; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will notify you if the Activity under test called 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#finish()}, 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#finishFromChild(Activity)}, or 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#finishActivity(int)}. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if one of the listed finish methods was called. 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isFinishCalled() { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mFinished; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method will return the request code if the Activity under test called 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#finishActivity(int)}. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The request code provided in the start call, or -1 if no finish call was made. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getFinishedActivityRequest() { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMockParent != null) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMockParent.mFinishedActivityRequest; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This mock Activity represents the "parent" activity. By injecting this, we allow the user 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to call a few more Activity methods, including: 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#getRequestedOrientation()}</li> 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#setRequestedOrientation(int)}</li> 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finish()}</li> 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishActivity(int requestCode)}</li> 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishFromChild(Activity child)}</li> 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Make this overrideable, and the unit test can look for calls to other methods 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class MockParent extends Activity { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mRequestedOrientation = 0; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent mStartedActivityIntent = null; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mStartedActivityRequest = -1; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean mFinished = false; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mFinishedActivityRequest = -1; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implementing in the parent allows the user to call this function on the tested activity. 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRequestedOrientation(int requestedOrientation) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedOrientation = requestedOrientation; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implementing in the parent allows the user to call this function on the tested activity. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRequestedOrientation() { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRequestedOrientation; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By returning null here, we inhibit the creation of any "container" for the window. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Window getWindow() { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By defining this in the parent, we allow the tested activity to call 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivity(Intent)}</li> 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#startActivityForResult(Intent, int)}</li> 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startActivityFromChild(Activity child, Intent intent, int requestCode) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartedActivityIntent = intent; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartedActivityRequest = requestCode; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By defining this in the parent, we allow the tested activity to call 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finish()}</li> 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishFromChild(Activity child)}</li> 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishFromChild(Activity child) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By defining this in the parent, we allow the tested activity to call 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link android.app.Activity#finishActivity(int requestCode)}</li> 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishActivityFromChild(Activity child, int requestCode) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinishedActivityRequest = requestCode; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 345