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