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