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