AI 147648: CTS: add test cases for android.app.Dialog

Automated import of CL 147648
diff --git a/tests/res/drawable/robot.png b/tests/res/drawable/robot.png
new file mode 100644
index 0000000..8a9e698
--- /dev/null
+++ b/tests/res/drawable/robot.png
Binary files differ
diff --git a/tests/src/android/app/cts/TestDialog.java b/tests/src/android/app/cts/TestDialog.java
index 12994f0..7effc79 100644
--- a/tests/src/android/app/cts/TestDialog.java
+++ b/tests/src/android/app/cts/TestDialog.java
@@ -18,22 +18,69 @@
 import android.app.Dialog;
 import android.content.Context;
 import android.os.Bundle;
+import android.view.ContextMenu;
 import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.MotionEvent;
+import android.view.View;
 import android.view.Window;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.WindowManager.LayoutParams;
 
 public class TestDialog extends Dialog {
-    public boolean mIsOnStartCalled;
-    public boolean mIsOnStopCalled;
-    public boolean mIsOnCreateCalled;
-    public boolean mIsRequestWindowFeature;
-    public boolean mIsOnContentChangedCalled;
-    public boolean mIsOnWindowFocusChangedCalled;
-    public boolean mIsOnTrackballEventCalled;
-    public boolean mIsOnKeyDownCalled;
-    public boolean mIsOnKeyUpCalled;
-    public boolean mIsOnKeyMultipleCalled;
-    public Window mWindow;
+    private static final int OPTIONS_MENU_ITEM_0 = Menu.FIRST;
+    private static final int OPTIONS_MENU_ITEM_1 = Menu.FIRST + 1;
+    private static final int OPTIONS_MENU_ITEM_2 = Menu.FIRST + 2;
+    private static final int OPTIONS_MENU_ITEM_3 = Menu.FIRST + 3;
+    private static final int OPTIONS_MENU_ITEM_4 = Menu.FIRST + 4;
+    private static final int OPTIONS_MENU_ITEM_5 = Menu.FIRST + 5;
+    private static final int OPTIONS_MENU_ITEM_6 = Menu.FIRST + 6;
+    private static final int CONTEXT_MENU_ITEM_0 = Menu.FIRST + 7;
+    private static final int CONTEXT_MENU_ITEM_1 = Menu.FIRST + 8;
+    private static final int CONTEXT_MENU_ITEM_2 = Menu.FIRST + 9;
+    public boolean isOnStartCalled;
+    public boolean isOnStopCalled;
+    public boolean isOnCreateCalled;
+    public boolean isRequestWindowFeature;
+    public boolean isOnContentChangedCalled;
+    public boolean isOnWindowFocusChangedCalled;
+    public boolean isOnTouchEventCalled;
+    public boolean isOnTrackballEventCalled;
+    public boolean isOnKeyDownCalled;
+    public boolean isOnKeyUpCalled;
+    public boolean isOnKeyMultipleCalled;
+    public boolean isOnSaveInstanceStateCalled;
+    public static boolean isOnRestoreInstanceStateCalled;
+    public boolean isOnWindowAttributesChangedCalled;
+    public boolean isOnCreatePanelMenuCalled;
+    public boolean isOnCreatePanelViewCalled;
+    public boolean isOnPreparePanelCalled;
+    public boolean isOnMenuOpenedCalled;
+    public boolean isOnMenuItemSelectedCalled;
+    public boolean isOnPanelClosedCalled;
+    public boolean isOnCreateOptionsMenuCalled;
+    public boolean isOnPrepareOptionsMenuCalled;
+    public boolean isOnOptionsItemSelectedCalled;
+    public boolean isOnOptionsMenuClosedCalled;
+    public boolean isOnContextItemSelectedCalled;
+    public boolean isOnContextMenuClosedCalled;
+    public boolean isOnCreateContextMenuCalled;
+    public boolean isOnSearchRequestedCalled;
+    public boolean onKeyDownReturn;
+    public boolean onKeyMultipleReturn;
+    public boolean dispatchTouchEventResult;
+    public boolean dispatchKeyEventResult;
+    public int keyDownCode = -1;
+    public Window window;
+    public Bundle saveInstanceState;
+    public Bundle savedInstanceState;
+    public KeyEvent keyEvent;
+    public MotionEvent touchEvent;
+    public MotionEvent trackballEvent;
+    public MotionEvent onTrackballEvent;
+    public MotionEvent onTouchEvent;
+    public KeyEvent keyMultipleEvent;
 
     public TestDialog(Context context) {
         super(context);
@@ -50,61 +97,224 @@
     @Override
     protected void onStart() {
         super.onStart();
-        mIsOnStartCalled = true;
+        isOnStartCalled = true;
     }
 
     @Override
     protected void onStop() {
         super.onStop();
-        mIsOnStopCalled = true;
+        isOnStopCalled = true;
     }
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
-        mIsRequestWindowFeature = requestWindowFeature(Window.FEATURE_NO_TITLE);
+        isRequestWindowFeature = requestWindowFeature(Window.FEATURE_LEFT_ICON);
         super.onCreate(savedInstanceState);
-        mIsOnCreateCalled = true;
+        isOnCreateCalled = true;
     }
 
     @Override
     public void onContentChanged() {
         super.onContentChanged();
 
-        mIsOnContentChangedCalled = true;
+        isOnContentChangedCalled = true;
     }
 
     @Override
-    public void onWindowFocusChanged(boolean hasFocus){
+    public void onWindowFocusChanged(boolean hasFocus) {
         super.onWindowFocusChanged(hasFocus);
 
-        mIsOnWindowFocusChangedCalled = true;
+        isOnWindowFocusChangedCalled = true;
     }
 
     @Override
-    public boolean onTrackballEvent(MotionEvent event){
-        mIsOnTrackballEventCalled = true;
+    public boolean onTouchEvent(MotionEvent event) {
+        isOnTouchEventCalled = true;
+        onTouchEvent = event;
+        return super.onTouchEvent(event);
+    }
 
+    @Override
+    public boolean onTrackballEvent(MotionEvent event) {
+        isOnTrackballEventCalled = true;
+        onTrackballEvent = event;
         return super.onTrackballEvent(event);
     }
 
     @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event){
-        mIsOnKeyDownCalled = true;
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        isOnKeyDownCalled = true;
+        keyDownCode = keyCode;
+        onKeyDownReturn = super.onKeyDown(keyCode, event);
 
-        return super.onKeyDown(keyCode, event);
+        return onKeyDownReturn;
     }
 
     @Override
-    public boolean onKeyUp(int keyCode, KeyEvent event){
-        mIsOnKeyUpCalled = true;
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        isOnKeyUpCalled = true;
 
-        return super.onKeyDown(keyCode, event);
+        return super.onKeyUp(keyCode, event);
     }
 
     @Override
-    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){
-        mIsOnKeyMultipleCalled = true;
+    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
+        isOnKeyMultipleCalled = true;
+        onKeyMultipleReturn = super.onKeyMultiple(keyCode, repeatCount, event);
+        keyMultipleEvent = event;
+        return onKeyMultipleReturn;
+    }
 
-        return super.onKeyMultiple(keyCode, repeatCount, event);
+    @Override
+    public Bundle onSaveInstanceState() {
+        isOnSaveInstanceStateCalled = true;
+        saveInstanceState = super.onSaveInstanceState();
+        return saveInstanceState;
+    }
+
+    @Override
+    public void onRestoreInstanceState(Bundle savedInstanceState) {
+        isOnRestoreInstanceStateCalled = true;
+        this.savedInstanceState = savedInstanceState;
+
+        super.onRestoreInstanceState(savedInstanceState);
+    }
+
+    @Override
+    public void onWindowAttributesChanged(LayoutParams params) {
+        isOnWindowAttributesChangedCalled = true;
+        super.onWindowAttributesChanged(params);
+    }
+
+    @Override
+    public boolean onCreatePanelMenu(int featureId, Menu menu) {
+        isOnCreatePanelMenuCalled = true;
+        return super.onCreatePanelMenu(featureId, menu);
+    }
+
+    @Override
+    public View onCreatePanelView(int featureId) {
+        isOnCreatePanelViewCalled = true;
+        return super.onCreatePanelView(featureId);
+    }
+
+    @Override
+    public boolean onPreparePanel(int featureId, View view, Menu menu) {
+        isOnPreparePanelCalled = true;
+        return super.onPreparePanel(featureId, view, menu);
+    }
+
+    @Override
+    public boolean onMenuItemSelected(int featureId, MenuItem item) {
+        isOnMenuItemSelectedCalled = true;
+        return super.onMenuItemSelected(featureId, item);
+    }
+
+    @Override
+    public boolean onMenuOpened(int featureId, Menu menu) {
+        isOnMenuOpenedCalled = true;
+        return super.onMenuOpened(featureId, menu);
+    }
+
+    @Override
+    public void onPanelClosed(int featureId, Menu menu) {
+        isOnPanelClosedCalled = true;
+        super.onPanelClosed(featureId, menu);
+    }
+
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        isOnPrepareOptionsMenuCalled = true;
+        return super.onPrepareOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        menu.add(0, OPTIONS_MENU_ITEM_0, 0, "OptionsMenuItem0");
+        menu.add(0, OPTIONS_MENU_ITEM_1, 0, "OptionsMenuItem1");
+        menu.add(0, OPTIONS_MENU_ITEM_2, 0, "OptionsMenuItem2");
+        menu.add(0, OPTIONS_MENU_ITEM_3, 0, "OptionsMenuItem3");
+        menu.add(0, OPTIONS_MENU_ITEM_4, 0, "OptionsMenuItem4");
+        menu.add(0, OPTIONS_MENU_ITEM_5, 0, "OptionsMenuItem5");
+        menu.add(0, OPTIONS_MENU_ITEM_6, 0, "OptionsMenuItem6");
+        isOnCreateOptionsMenuCalled = true;
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        isOnOptionsItemSelectedCalled = true;
+        switch (item.getItemId()) {
+            case OPTIONS_MENU_ITEM_0:
+            case OPTIONS_MENU_ITEM_1:
+            case OPTIONS_MENU_ITEM_2:
+            case OPTIONS_MENU_ITEM_3:
+            case OPTIONS_MENU_ITEM_4:
+            case OPTIONS_MENU_ITEM_5:
+            case OPTIONS_MENU_ITEM_6:
+                return true;
+            default:
+                return super.onOptionsItemSelected(item);
+        }
+    }
+
+    @Override
+    public void onOptionsMenuClosed(Menu menu) {
+        isOnOptionsMenuClosedCalled = true;
+        super.onOptionsMenuClosed(menu);
+    }
+
+    @Override
+    public boolean onContextItemSelected(MenuItem item) {
+        isOnContextItemSelectedCalled = true;
+        switch (item.getItemId()) {
+            case CONTEXT_MENU_ITEM_0:
+            case CONTEXT_MENU_ITEM_1:
+            case CONTEXT_MENU_ITEM_2:
+                return true;
+            default:
+                return super.onContextItemSelected(item);
+        }
+    }
+
+    @Override
+    public void onContextMenuClosed(Menu menu) {
+        isOnContextMenuClosedCalled = true;
+        super.onContextMenuClosed(menu);
+    }
+
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+        menu.add(0, CONTEXT_MENU_ITEM_0, 0, "ContextMenuItem0");
+        menu.add(0, CONTEXT_MENU_ITEM_1, 0, "ContextMenuItem1");
+        menu.add(0, CONTEXT_MENU_ITEM_2, 0, "ContextMenuItem2");
+        isOnCreateContextMenuCalled = true;
+    }
+
+    @Override
+    public boolean onSearchRequested() {
+        isOnSearchRequestedCalled = true;
+        return super.onSearchRequested();
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        keyEvent = event;
+        dispatchKeyEventResult = super.dispatchKeyEvent(event);
+        return dispatchKeyEventResult;
+    }
+
+    @Override
+    public boolean dispatchTrackballEvent(MotionEvent ev) {
+        trackballEvent = ev;
+        return super.dispatchTrackballEvent(ev);
+    }
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        touchEvent = ev;
+        dispatchTouchEventResult = super.dispatchTouchEvent(ev);
+        return dispatchTouchEventResult;
     }
 }
diff --git a/tests/tests/app/src/android/app/cts/DialogTest.java b/tests/tests/app/src/android/app/cts/DialogTest.java
new file mode 100644
index 0000000..b9d1ddc
--- /dev/null
+++ b/tests/tests/app/src/android/app/cts/DialogTest.java
@@ -0,0 +1,1373 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.app.cts;
+
+import java.lang.ref.WeakReference;
+import com.android.cts.stub.R;
+import android.app.Dialog;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnCancelListener;
+import android.content.DialogInterface.OnDismissListener;
+import android.content.DialogInterface.OnKeyListener;
+import android.content.pm.ActivityInfo;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
+
+@TestTargetClass(Dialog.class)
+public class DialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
+
+    protected static final long SLEEP_TIME = 200;
+    private static final long MOTION_DOWN_TIME = 0L;
+    private static final long MOTION_EVENT_TIME = 0L;
+    private static final float MOTION_X = -20.0f;
+    private static final float MOTION_Y = -20.0f;
+    private static final String STUB_ACTIVITY_PACKAGE = "com.android.cts.stub";
+
+    /**
+     *  please refer to Dialog
+     */
+    private static final int DISMISS = 0x43;
+    private static final int CANCEL = 0x44;
+
+    private boolean mCalledCallback;
+    private boolean mIsKey0Listened;
+    private boolean mIsKey1Listened;
+    private boolean mOnCancelListenerCalled;
+
+    private Instrumentation mInstrumentation;
+    private Context mContext;
+    private DialogStubActivity mActivity;
+
+
+    public DialogTest() {
+        super(STUB_ACTIVITY_PACKAGE, DialogStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mInstrumentation = getInstrumentation();
+        mContext = mInstrumentation.getContext();
+        mActivity = getActivity();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        if (mActivity != null) {
+            mActivity.finish();
+        }
+    }
+
+    protected void popDialog(int index) {
+        assertTrue(index >= 0);
+
+        while (index != 0) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+            index--;
+        }
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "Dialog",
+            args = {android.content.Context.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "Dialog",
+            args = {android.content.Context.class, int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            notes = "test Dialog protected Constructors through mock dialog",
+            method = "Dialog",
+            args = {android.content.Context.class, boolean.class,
+                    android.content.DialogInterface.OnCancelListener.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getContext",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getWindow",
+            args = {}
+        )
+    })
+    public void testDialog(){
+        new Dialog(mContext);
+        Dialog d = new Dialog(mContext, 0);
+        // According to javadoc of constructors, it will set theme to system default theme,
+        // when we set no theme id or set it theme id to 0.
+        // But CTS can no assert dialog theme equals system internal theme.
+
+        d = new Dialog(mContext, R.style.TextAppearance);
+        TypedArray ta =
+            d.getContext().getTheme().obtainStyledAttributes(R.styleable.TextAppearance);
+        assertTextAppearanceStyle(ta);
+
+        final Window w = d.getWindow();
+        ta = w.getContext().getTheme().obtainStyledAttributes(R.styleable.TextAppearance);
+        assertTextAppearanceStyle(ta);
+
+        // test protected constructor
+        // Dialog(Context context, boolean cancelable, OnCancelListener cancelListener)
+        mActivity.onCancelListenerCalled = false;
+        popDialog(DialogStubActivity.TEST_PROTECTED_CANCELABLE);
+        sendKeys(KeyEvent.KEYCODE_BACK);
+        assertTrue(mActivity.onCancelListenerCalled);
+
+        // open DialogStubActivity.TEST_PROTECTED_NOT_CANCELABLE
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
+        mActivity.onCancelListenerCalled = false;
+        sendKeys(KeyEvent.KEYCODE_BACK);
+        assertFalse(mActivity.onCancelListenerCalled);
+    }
+
+    private void assertTextAppearanceStyle(TypedArray ta) {
+        final int defValue = -1;
+        // get Theme and assert
+        final Resources.Theme expected = mContext.getResources().newTheme();
+        expected.setTo(mContext.getTheme());
+        expected.applyStyle(R.style.TextAppearance, true);
+        TypedArray expectedTa = expected.obtainStyledAttributes(R.styleable.TextAppearance);
+        assertEquals(expectedTa.getIndexCount(), ta.getIndexCount());
+        assertEquals(expectedTa.getColor(R.styleable.TextAppearance_textColor, defValue),
+                ta.getColor(R.styleable.TextAppearance_textColor, defValue));
+        assertEquals(expectedTa.getColor(R.styleable.TextAppearance_textColorHint, defValue),
+                ta.getColor(R.styleable.TextAppearance_textColorHint, defValue));
+        assertEquals(expectedTa.getColor(R.styleable.TextAppearance_textColorLink, defValue),
+                ta.getColor(R.styleable.TextAppearance_textColorLink, defValue));
+        assertEquals(expectedTa.getColor(R.styleable.TextAppearance_textColorHighlight, defValue),
+                ta.getColor(R.styleable.TextAppearance_textColorHighlight, defValue));
+        assertEquals(expectedTa.getDimension(R.styleable.TextAppearance_textSize, defValue),
+                ta.getDimension(R.styleable.TextAppearance_textSize, defValue));
+        assertEquals(expectedTa.getInt(R.styleable.TextAppearance_textStyle, defValue),
+                ta.getInt(R.styleable.TextAppearance_textStyle, defValue));
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onStart",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onCreate",
+            args = {android.os.Bundle.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onStop",
+            args = {}
+        )
+    })
+    public void testOnStartCreateStop(){
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+
+        assertTrue(d.isOnStartCalled);
+        assertTrue(d.isOnCreateCalled);
+
+        assertFalse(d.isOnStopCalled);
+        sendKeys(KeyEvent.KEYCODE_BACK);
+        assertTrue(d.isOnStopCalled);
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setOwnerActivity",
+            args = {android.app.Activity.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getOwnerActivity",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setVolumeControlStream",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getVolumeControlStream",
+            args = {}
+        )
+    })
+    public void testAccessOwnerActivity() {
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        Dialog d = mActivity.getDialog();
+        assertNotNull(d);
+        assertSame(mActivity, d.getOwnerActivity());
+        d.setVolumeControlStream(d.getVolumeControlStream() + 1);
+        assertEquals(d.getOwnerActivity().getVolumeControlStream() + 1, d.getVolumeControlStream());
+
+        try {
+            d.setOwnerActivity(null);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        d = new Dialog(mContext);
+        assertNull(d.getOwnerActivity());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "show",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "hide",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "isShowing",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "dismiss",
+            args = {}
+        )
+    })
+    public void testShow() throws Throwable {
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        final Dialog d = mActivity.getDialog();
+        final View decor = d.getWindow().getDecorView();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.hide();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertEquals(View.GONE, decor.getVisibility());
+        assertTrue(d.isShowing());
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.show();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertEquals(View.VISIBLE, decor.getVisibility());
+        assertTrue(d.isShowing());
+        dialogDismiss(d);
+        assertFalse(d.isShowing());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onRestoreInstanceState",
+            args = {android.os.Bundle.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onSaveInstanceState",
+            args = {}
+        )
+    })
+    public void testOnSaveInstanceState() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+        mInstrumentation.waitForIdleSync();
+        mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        mInstrumentation.waitForIdleSync();
+        assertTrue(d.isOnSaveInstanceStateCalled);
+        assertTrue(TestDialog.isOnRestoreInstanceStateCalled);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getCurrentFocus",
+        args = {}
+    )
+    public void testGetCurrentFocus() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        assertNull(d.getCurrentFocus());
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.takeKeyEvents(true);
+                d.setContentView(R.layout.alert_dialog_text_entry);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        sendKeys(KeyEvent.KEYCODE_0);
+        // When mWindow is not null getCUrrentFocus is the view in dialog
+        assertEquals(d.getWindow().getCurrentFocus(), d.getCurrentFocus());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setContentView",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setContentView",
+            args = {android.view.View.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setContentView",
+            args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "findViewById",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "addContentView",
+            args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
+        )
+    })
+    public void testSetContentView() throws Throwable {
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        final Dialog d = mActivity.getDialog();
+        assertNotNull(d);
+
+        // set content view to a four elements layout
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.setContentView(R.layout.alert_dialog_text_entry);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // check if four elements are right there
+        assertNotNull(d.findViewById(R.id.username_view));
+        assertNotNull(d.findViewById(R.id.username_edit));
+        assertNotNull(d.findViewById(R.id.password_view));
+        assertNotNull(d.findViewById(R.id.password_edit));
+
+        final LayoutInflater inflate1 = d.getLayoutInflater();
+
+        // set content view to a two elements layout
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.setContentView(inflate1.inflate(R.layout.alert_dialog_text_entry_2, null));
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // check if only two elements are right there
+        assertNotNull(d.findViewById(R.id.username_view));
+        assertNotNull(d.findViewById(R.id.username_edit));
+        assertNull(d.findViewById(R.id.password_view));
+        assertNull(d.findViewById(R.id.password_edit));
+
+        final WindowManager.LayoutParams lp = d.getWindow().getAttributes();
+        final LayoutInflater inflate2 = mActivity.getLayoutInflater();
+
+        // set content view to a four elements layout
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.setContentView(inflate2.inflate(R.layout.alert_dialog_text_entry, null), lp);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // check if four elements are right there
+        assertNotNull(d.findViewById(R.id.username_view));
+        assertNotNull(d.findViewById(R.id.username_edit));
+        assertNotNull(d.findViewById(R.id.password_view));
+        assertNotNull(d.findViewById(R.id.password_edit));
+
+        final WindowManager.LayoutParams lp2 = d.getWindow().getAttributes();
+        final LayoutInflater inflate3 = mActivity.getLayoutInflater();
+        lp2.height = ViewGroup.LayoutParams.WRAP_CONTENT;
+        lp2.width = ViewGroup.LayoutParams.WRAP_CONTENT;
+
+        // add a check box view
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.addContentView(inflate3.inflate(R.layout.checkbox_layout, null), lp2);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // check if four elements are right there, and new add view there.
+        assertNotNull(d.findViewById(R.id.check_box));
+        assertNotNull(d.findViewById(R.id.username_view));
+        assertNotNull(d.findViewById(R.id.username_edit));
+        assertNotNull(d.findViewById(R.id.password_view));
+        assertNotNull(d.findViewById(R.id.password_edit));
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setTitle",
+            args = {java.lang.CharSequence.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setTitle",
+            args = {int.class}
+        )
+    })
+    public void testSetTitle() {
+        final String expectedTitle = "Test Dialog Without theme";
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+
+        assertNotNull(mActivity.getDialog());
+        mActivity.setUpTitle(expectedTitle);
+        mInstrumentation.waitForIdleSync();
+
+        final Dialog d = mActivity.getDialog();
+        assertEquals(expectedTitle, (String) d.getWindow().getAttributes().getTitle());
+
+        mActivity.setUpTitle(R.string.hello_android);
+        mInstrumentation.waitForIdleSync();
+        assertEquals(mActivity.getResources().getString(R.string.hello_android),
+                (String) d.getWindow().getAttributes().getTitle());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onKeyDown",
+            args = {int.class, android.view.KeyEvent.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onKeyUp",
+            args = {int.class, android.view.KeyEvent.class}
+        )
+    })
+    public void testOnKeyDownKeyUp() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        assertFalse(d.isOnKeyDownCalled);
+        assertFalse(d.isOnKeyUpCalled);
+
+        // send key 0 down and up events, onKeyDown return false
+        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_0);
+        assertTrue(d.isOnKeyDownCalled);
+        assertTrue(d.isOnKeyUpCalled);
+        assertEquals(KeyEvent.KEYCODE_0, d.keyDownCode);
+        assertFalse(d.onKeyDownReturn);
+
+        // send key back down and up events, onKeyDown return true
+        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+        assertEquals(KeyEvent.KEYCODE_BACK, d.keyDownCode);
+        assertTrue(d.onKeyDownReturn);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onKeyMultiple",
+        args = {int.class, int.class, android.view.KeyEvent.class}
+    )
+    public void testOnKeyMultiple() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+
+        // System call onTouchEvent
+        assertNull(d.keyMultipleEvent);
+        mInstrumentation.sendKeySync(
+                new KeyEvent(KeyEvent.ACTION_MULTIPLE, KeyEvent.KEYCODE_UNKNOWN));
+        assertTrue(d.isOnKeyMultipleCalled);
+        assertFalse(d.onKeyMultipleReturn);
+        assertEquals(KeyEvent.KEYCODE_UNKNOWN, d.keyMultipleEvent.getKeyCode());
+        assertEquals(KeyEvent.ACTION_MULTIPLE, d.keyMultipleEvent.getAction());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onTouchEvent",
+            args = {android.view.MotionEvent.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setCanceledOnTouchOutside",
+            args = {boolean.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "dispatchTouchEvent",
+            args = {android.view.MotionEvent.class}
+        )
+    })
+    public void testTouchEvent() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+
+        assertNull(d.onTouchEvent);
+        assertNull(d.touchEvent);
+        assertFalse(d.isOnTouchEventCalled);
+
+        MotionEvent touchMotionEvent = MotionEvent.obtain(MOTION_DOWN_TIME,
+                MOTION_EVENT_TIME, MotionEvent.ACTION_DOWN,
+                MOTION_X, MOTION_Y, 0);
+        // send a touch motion event, and System will call onTouchEvent
+        mInstrumentation.sendPointerSync(touchMotionEvent);
+
+        assertFalse(d.dispatchTouchEventResult);
+        assertMotionEventEquals(touchMotionEvent, d.touchEvent);
+
+        assertTrue(d.isOnTouchEventCalled);
+        assertMotionEventEquals(touchMotionEvent, d.onTouchEvent);
+        d.isOnTouchEventCalled = false;
+        assertTrue(d.isShowing());
+
+        // set cancel on touch out side
+        d.setCanceledOnTouchOutside(true);
+        touchMotionEvent = MotionEvent.obtain(MOTION_DOWN_TIME + 1,
+                MOTION_EVENT_TIME, MotionEvent.ACTION_DOWN,
+                MOTION_X, MOTION_Y, 0);
+        // send a out side touch motion event, then the dialog will dismiss
+        mInstrumentation.sendPointerSync(touchMotionEvent);
+
+        assertTrue(d.dispatchTouchEventResult);
+        assertMotionEventEquals(touchMotionEvent, d.touchEvent);
+
+        assertTrue(d.isOnTouchEventCalled);
+        assertMotionEventEquals(touchMotionEvent, d.onTouchEvent);
+        assertFalse(d.isShowing());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onTrackballEvent",
+            args = {android.view.MotionEvent.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "dispatchTrackballEvent",
+            args = {android.view.MotionEvent.class}
+        )
+    })
+    public void testTrackballEvent() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        final MotionEvent trackBallEvent = MotionEvent.obtain(MOTION_DOWN_TIME, MOTION_EVENT_TIME,
+                MotionEvent.ACTION_DOWN, MOTION_X, MOTION_Y, 0);
+
+        assertNull(d.trackballEvent);
+        assertNull(d.onTrackballEvent);
+
+        assertFalse(d.isOnTrackballEventCalled);
+        mInstrumentation.sendTrackballEventSync(trackBallEvent);
+        assertTrue(d.isOnTrackballEventCalled);
+        assertMotionEventEquals(trackBallEvent, d.trackballEvent);
+        assertMotionEventEquals(trackBallEvent, d.onTrackballEvent);
+
+    }
+
+    private void assertMotionEventEquals(final MotionEvent expected, final MotionEvent actual) {
+        assertEquals(expected.getDownTime(), actual.getDownTime());
+        assertEquals(expected.getEventTime(), actual.getEventTime());
+        assertEquals(expected.getAction(), actual.getAction());
+        assertEquals(expected.getMetaState(), actual.getMetaState());
+        assertEquals(expected.getSize(), actual.getSize());
+        // As MotionEvent doc says the value of X and Y coordinate may have
+        // a fraction for input devices that are sub-pixel precise,
+        // so we won't assert them here.
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onWindowAttributesChanged",
+        args = {android.view.WindowManager.LayoutParams.class}
+    )
+    public void testOnWindowAttributesChanged() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+
+        assertTrue(d.isOnWindowAttributesChangedCalled);
+        d.isOnWindowAttributesChangedCalled = false;
+
+        final WindowManager.LayoutParams lp = d.getWindow().getAttributes();
+        lp.setTitle("test OnWindowAttributesChanged");
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.getWindow().setAttributes(lp);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(d.isOnWindowAttributesChangedCalled);
+        assertSame(lp, d.getWindow().getAttributes());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onContentChanged",
+        args = {}
+    )
+    public void testOnContentChanged() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        assertNotNull(d);
+
+        assertFalse(d.isOnContentChangedCalled);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.setContentView(R.layout.alert_dialog_text_entry);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(d.isOnContentChangedCalled);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "onWindowFocusChanged",
+        args = {boolean.class}
+    )
+    public void testOnWindowFocusChanged() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        assertTrue(d.isOnWindowFocusChangedCalled);
+        d.isOnWindowFocusChangedCalled = false;
+
+        // show a new dialog, the new dialog get focus
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.showDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(d.isOnWindowFocusChangedCalled);
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "dispatchKeyEvent",
+            args = {android.view.KeyEvent.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setOnKeyListener",
+            args = {android.content.DialogInterface.OnKeyListener.class}
+        )
+    })
+    public void testDispatchKeyEvent() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+
+        sendKeys(KeyEvent.KEYCODE_0);
+        assertFalse(d.dispatchKeyEventResult);
+        assertEquals(KeyEvent.KEYCODE_0, d.keyEvent.getKeyCode());
+
+        d.setOnKeyListener(new OnKeyListener() {
+            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
+                if (KeyEvent.ACTION_DOWN == event.getAction()) {
+                    if (KeyEvent.KEYCODE_0 == keyCode) {
+                        mIsKey0Listened = true;
+                        return true;
+                    }
+
+                    if (KeyEvent.KEYCODE_1 == keyCode) {
+                        mIsKey1Listened = true;
+                        return true;
+                    }
+                }
+
+                return false;
+            }
+        });
+
+        mIsKey1Listened = false;
+        sendKeys(KeyEvent.KEYCODE_1);
+        assertTrue(mIsKey1Listened);
+
+        mIsKey0Listened = false;
+        sendKeys(KeyEvent.KEYCODE_0);
+        assertTrue(mIsKey0Listened);
+    }
+
+    /*
+     * Test point
+     * 1. First open a option menu will make onMenuOpened onCreatePanelView onCreatePanelMenu
+     * and onPreparePanel to be called.
+     * 2. When first open the option menu onCreatePanelMenu will calls through to
+     * the new onCreateOptionsMenu method.
+     * 3. When open the option menu onPreparePanel will calls through to
+     * the new onPrepareOptionsMenu method.
+     * 4. Closed option menu will make onPanelClosed to be called,
+     * and onPanelClosed will calls through to the new onPanelClosed method.
+     * 5. Every time open option menu will make onCreatePanelView and  onPreparePanel to be called.
+     * 6. Selected a item on the option menu will make onMenuItemSelected to be called,
+     * and onMenuItemSelected will calls through to the new onOptionsItemSelected method.
+     */
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "openOptionsMenu",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "closeOptionsMenu",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onMenuOpened",
+            args = {int.class, android.view.Menu.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onCreatePanelView",
+            args = {int.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onCreatePanelMenu",
+            args = {int.class, android.view.Menu.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onCreateOptionsMenu",
+            args = {android.view.Menu.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onPreparePanel",
+            args = {int.class, android.view.View.class, android.view.Menu.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onPrepareOptionsMenu",
+            args = {android.view.Menu.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.PARTIAL,
+            method = "onPanelClosed",
+            args = {int.class, android.view.Menu.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.PARTIAL,
+            notes = "onOptionsMenuClosed should be called when onPanelClosed Called.",
+            method = "onOptionsMenuClosed",
+            args = {android.view.Menu.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.PARTIAL,
+            method = "onMenuItemSelected",
+            args = {int.class, android.view.MenuItem.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.PARTIAL,
+            method = "onOptionsItemSelected",
+            args = {MenuItem.class}
+        )
+    })
+    @ToBeFixed(bug = "1716918", explanation = "As Javadoc of onMenuItemSelected() and "
+            + "onPanelClosed(), onOptionsItemSelected() and onContextItemSelected() should be "
+            + "called in onMenuItemSelected() source code, onOptionMenuClosed() and "
+            + "onContextMenuClosed() should be called in onPanelClosed() source code, "
+            + "but now onMenuItemSelected() and onPanelClosed() method are empty, is this a bug?")
+    public void testOptionMenu() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        assertFalse(d.isOnMenuOpenedCalled);
+        assertFalse(d.isOnCreatePanelViewCalled);
+        assertFalse(d.isOnCreatePanelMenuCalled);
+        assertFalse(d.isOnCreateOptionsMenuCalled);
+        assertFalse(d.isOnPreparePanelCalled);
+        assertFalse(d.isOnPrepareOptionsMenuCalled);
+        // first open option menu
+        dialogOpenOptionMenu(d);
+
+        assertTrue(d.isOnMenuOpenedCalled);
+        assertTrue(d.isOnCreatePanelViewCalled);
+        assertTrue(d.isOnCreatePanelMenuCalled);
+        assertTrue(d.isOnCreateOptionsMenuCalled);
+        assertTrue(d.isOnPreparePanelCalled);
+        assertTrue(d.isOnPrepareOptionsMenuCalled);
+
+        assertFalse(d.isOnPanelClosedCalled);
+        // closed option menu
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.closeOptionsMenu();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(d.isOnPanelClosedCalled);
+
+        d.isOnCreatePanelViewCalled = false;
+        d.isOnCreatePanelMenuCalled = false;
+        d.isOnPreparePanelCalled = false;
+        assertFalse(d.isOnOptionsMenuClosedCalled);
+        // open option menu again
+        dialogOpenOptionMenu(d);
+
+        assertTrue(d.isOnCreatePanelViewCalled);
+        assertFalse(d.isOnCreatePanelMenuCalled);
+        assertTrue(d.isOnPreparePanelCalled);
+        // Here isOnOptionsMenuClosedCalled should be true, see bug 1716918.
+        assertFalse(d.isOnOptionsMenuClosedCalled);
+
+        assertFalse(d.isOnMenuItemSelectedCalled);
+        assertFalse(d.isOnOptionsItemSelectedCalled);
+        // selected a item of option menu
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        assertTrue(d.isOnMenuItemSelectedCalled);
+        // Here isOnOptionsItemSelectedCalled should be true, see bug 1716918.
+        assertFalse(d.isOnOptionsItemSelectedCalled);
+    }
+
+    private void dialogOpenOptionMenu(final Dialog d) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.openOptionsMenu();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    /*
+     * Test point
+     * 1. registerForContextMenu() will OnCreateContextMenuListener on the view to this activity,
+     * so onCreateContextMenu() will be called when it is time to show the context menu.
+     * 2. Close context menu will make onPanelClosed to be called,
+     * and onPanelClosed will calls through to the new onPanelClosed method.
+     * 3. unregisterForContextMenu() will remove the OnCreateContextMenuListener on the view,
+     * so onCreateContextMenu() will not be called when try to open context menu.
+     * 4. Selected a item of context menu will make onMenuItemSelected() to be called,
+     * and onMenuItemSelected will calls through to the new onContextItemSelected method.
+     * 5. onContextMenuClosed is called whenever the context menu is being closed (either by
+     * the user canceling the menu with the back/menu button, or when an item is selected).
+     */
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "registerForContextMenu",
+            args = {android.view.View.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "unregisterForContextMenu",
+            args = {android.view.View.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "onCreateContextMenu",
+            args = {android.view.ContextMenu.class, android.view.View.class,
+                    android.view.ContextMenu.ContextMenuInfo.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "openContextMenu",
+            args = {android.view.View.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.PARTIAL,
+            notes = "test method: onContextItemSelected",
+            method = "onContextItemSelected",
+            args = {android.view.MenuItem.class}
+         ),
+         @TestTargetNew(
+             level = TestLevel.COMPLETE,
+             notes = "test method: onContextMenuClosed",
+             method = "onContextMenuClosed",
+             args = {android.view.Menu.class}
+         )
+    })
+    @ToBeFixed(bug = "1716918", explanation = "As Javadoc of onMenuItemSelected() and "
+            + "onPanelClosed(), onOptionsItemSelected() and onContextItemSelected() should be "
+            + "called in onMenuItemSelected() source code, onOptionMenuClosed() and "
+            + "onContextMenuClosed() should be called in onPanelClosed() source code, "
+            + "but now onMenuItemSelected() and onPanelClosed() method are empty, is this a bug?")
+    public void testContextMenu() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        final LinearLayout parent = new LinearLayout(mContext);
+        final MockView v = new MockView(mContext);
+        parent.addView(v);
+        assertFalse(v.isShowContextMenuCalled);
+        // Register for context menu and open it
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.addContentView(parent, new LinearLayout.LayoutParams(
+                        ViewGroup.LayoutParams.FILL_PARENT,
+                        ViewGroup.LayoutParams.WRAP_CONTENT));
+                d.registerForContextMenu(v);
+                d.openContextMenu(v);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(v.isShowContextMenuCalled);
+        assertTrue(d.isOnCreateContextMenuCalled);
+
+        assertFalse(d.isOnPanelClosedCalled);
+        assertFalse(d.isOnContextMenuClosedCalled);
+        // Closed context menu
+        sendKeys(KeyEvent.KEYCODE_BACK);
+        assertTrue(d.isOnPanelClosedCalled);
+        // Here isOnContextMenuClosedCalled should be true, see bug 1716918.
+        assertFalse(d.isOnContextMenuClosedCalled);
+
+        v.isShowContextMenuCalled = false;
+        d.isOnCreateContextMenuCalled = false;
+        // Unregister for context menu, and try to open it
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.unregisterForContextMenu(v);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.openContextMenu(v);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(v.isShowContextMenuCalled);
+        assertFalse(d.isOnCreateContextMenuCalled);
+
+        // Register for context menu and open it again
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.registerForContextMenu(v);
+                d.openContextMenu(v);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertFalse(d.isOnContextItemSelectedCalled);
+        assertFalse(d.isOnMenuItemSelectedCalled);
+        d.isOnPanelClosedCalled = false;
+        assertFalse(d.isOnContextMenuClosedCalled);
+        // select a context menu item
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        assertTrue(d.isOnMenuItemSelectedCalled);
+        // Here isOnContextItemSelectedCalled should be true, see bug 1716918.
+        assertFalse(d.isOnContextItemSelectedCalled);
+        assertTrue(d.isOnPanelClosedCalled);
+        // Here isOnContextMenuClosedCalled should be true, see bug 1716918.
+        assertFalse(d.isOnContextMenuClosedCalled);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_FEASIBLE,
+        method = "onSearchRequested",
+        args = {}
+    )
+    @ToBeFixed(bug = "1695243", explanation = "From the javadoc of onSearchRequested,"
+            + "we see it will be called when the user signals the desire to start a search."
+            + "But there is a comment in it source code says \"not during dialogs, no.\","
+            + "But onSearchRequested() didn't be called after start search.")
+    public void testOnSearchRequested() {
+    }
+
+    @TestTargetNew(
+        level = TestLevel.PARTIAL,
+        method = "takeKeyEvents",
+        args = {boolean.class}
+    )
+    @ToBeFixed(bug = "1695243",
+            explanation = "It still get KeyEvent while set takeKeyEvents to false")
+    public void testTakeKeyEvents() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        final View v = d.getWindow().getDecorView();
+        assertNull(d.getCurrentFocus());
+        takeKeyEvents(d, true);
+        assertTrue(v.isFocusable());
+        sendKeys(KeyEvent.KEYCODE_0);
+        assertEquals(KeyEvent.KEYCODE_0, d.keyEvent.getKeyCode());
+        d.keyEvent = null;
+
+        takeKeyEvents(d, false);
+        assertNull(d.getCurrentFocus());
+        assertFalse(v.isFocusable());
+        sendKeys(KeyEvent.KEYCODE_0);
+        // d.keyEvent should be null
+    }
+
+    private void takeKeyEvents(final Dialog d, final boolean get) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.takeKeyEvents(get);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "requestWindowFeature",
+        args = {int.class}
+    )
+    public void testRequestWindowFeature() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        // called requestWindowFeature at TestDialog onCreate method
+        assertTrue(((TestDialog) mActivity.getDialog()).isRequestWindowFeature);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_FEASIBLE,
+        notes = "There is no way to assert whether the drawable resource is properly shown."
+            + "So we only call setFeatureDrawableResource once, with no asserts.",
+        method = "setFeatureDrawableResource",
+        args = {int.class, int.class}
+    )
+    public void testSetFeatureDrawableResource() throws Throwable {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.getDialog().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
+                        R.drawable.robot);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_FEASIBLE,
+        notes = "There is no way to assert whether the drawable resource is properly shown."
+            + "So we only call setFeatureDrawableUri once, with no asserts.",
+        method = "setFeatureDrawableUri",
+        args = {int.class, android.net.Uri.class}
+    )
+    public void testSetFeatureDrawableUri() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        mActivity.getDialog().setFeatureDrawableUri(0, Uri.parse("http://www.google.com"));
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_FEASIBLE,
+        notes = "There is no way to assert whether the drawable resource is properly shown."
+            + "So we only call setFeatureDrawable once, with no asserts.",
+        method = "setFeatureDrawable",
+        args = {int.class, android.graphics.drawable.Drawable.class}
+    )
+    public void testSetFeatureDrawable() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        mActivity.getDialog().setFeatureDrawable(0, new MockDrawable());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_FEASIBLE,
+        notes = "There is no way to assert whether the drawable resource is properly shown."
+            + "So we only call setFeatureDrawableAlpha once, with no asserts.",
+        method = "setFeatureDrawableAlpha",
+        args = {int.class, int.class}
+    )
+    public void testSetFeatureDrawableAlpha() {
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        mActivity.getDialog().setFeatureDrawableAlpha(0, 0);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getLayoutInflater",
+        args = {}
+    )
+    public void testGetLayoutInflater() {
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        final Dialog d = mActivity.getDialog();
+        assertEquals(d.getWindow().getLayoutInflater(), d.getLayoutInflater());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setCancelable",
+        args = {boolean.class}
+    )
+    public void testSetCancelable() {
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        final Dialog d = mActivity.getDialog();
+
+        d.setCancelable(true);
+        assertTrue(d.isShowing());
+        sendKeys(KeyEvent.KEYCODE_BACK);
+        assertFalse(d.isShowing());
+
+        d.setCancelable(false);
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        assertTrue(d.isShowing());
+        sendKeys(KeyEvent.KEYCODE_BACK);
+        assertTrue(d.isShowing());
+    }
+
+    /*
+     * Test point
+     * 1. Cancel the dialog.
+     * 2. Set a listener to be invoked when the dialog is canceled.
+     */
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "cancel",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setOnCancelListener",
+            args = {android.content.DialogInterface.OnCancelListener.class}
+        )
+    })
+    public void testCancel() throws Throwable {
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        final Dialog d = mActivity.getDialog();
+
+        assertTrue(d.isShowing());
+        mOnCancelListenerCalled = false;
+        d.setOnCancelListener(new OnCancelListener() {
+            public void onCancel(DialogInterface dialog) {
+                mOnCancelListenerCalled = true;
+            }
+        });
+        dialogCancel(d);
+
+        assertFalse(d.isShowing());
+        assertTrue(mOnCancelListenerCalled);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        assertTrue(d.isShowing());
+        mOnCancelListenerCalled = false;
+        d.setOnCancelListener(null);
+        dialogCancel(d);
+
+        assertFalse(d.isShowing());
+        assertFalse(mOnCancelListenerCalled);
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        notes = "test method: setCancelMessage",
+        method = "setCancelMessage",
+        args = {android.os.Message.class}
+    )
+    public void testSetCancelMessage() throws Exception {
+        mCalledCallback = false;
+        popDialog(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
+        final TestDialog d = (TestDialog) mActivity.getDialog();
+        final HandlerThread ht = new HandlerThread("DialogTest");
+        ht.start();
+
+        d.setCancelMessage(new MockDismissCancelHandler(d, ht.getLooper()).obtainMessage(CANCEL,
+                new OnCancelListener() {
+                    public void onCancel(DialogInterface dialog) {
+                        mCalledCallback = true;
+                    }
+                }));
+        assertTrue(d.isShowing());
+        assertFalse(mCalledCallback);
+        sendKeys(KeyEvent.KEYCODE_BACK);
+        assertTrue(mCalledCallback);
+        assertFalse(d.isShowing());
+
+        ht.join(100);
+    }
+
+    /*
+     * Test point
+     * 1. Set a listener to be invoked when the dialog is dismissed.
+     * 2. set onDismissListener to null, it will not changed flag after dialog dismissed.
+     */
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setOnDismissListener",
+        args = {android.content.DialogInterface.OnDismissListener.class}
+    )
+    public void testSetOnDismissListener() throws Throwable {
+        mCalledCallback = false;
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        final Dialog d = mActivity.getDialog();
+
+        d.setOnDismissListener(new OnDismissListener() {
+            public void onDismiss(DialogInterface dialog) {
+                mCalledCallback = true;
+            }
+        });
+
+        assertTrue(d.isShowing());
+        assertFalse(mCalledCallback);
+        dialogDismiss(d);
+        assertTrue(mCalledCallback);
+        assertFalse(d.isShowing());
+
+        // show the dialog again
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        assertTrue(d.isShowing());
+        mCalledCallback = false;
+        d.setOnDismissListener(null);
+        dialogDismiss(d);
+        assertFalse(mCalledCallback);
+        assertFalse(d.isShowing());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setDismissMessage",
+        args = {android.os.Message.class}
+    )
+    public void testSetDismissMessage() throws Throwable {
+        mCalledCallback = false;
+        popDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
+        final Dialog d = mActivity.getDialog();
+
+        final HandlerThread ht = new HandlerThread("DialogTest");
+        ht.start();
+
+        d.setDismissMessage(new MockDismissCancelHandler(d, ht.getLooper()).obtainMessage(DISMISS,
+                new OnDismissListener() {
+                    public void onDismiss(DialogInterface dialog) {
+                        mCalledCallback = true;
+                    }
+                }));
+        assertTrue(d.isShowing());
+        assertFalse(mCalledCallback);
+        dialogDismiss(d);
+        assertTrue(mCalledCallback);
+        assertFalse(d.isShowing());
+
+        ht.join(100);
+    }
+
+    private void dialogDismiss(final Dialog d) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.dismiss();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    private void dialogCancel(final Dialog d) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                d.cancel();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    private static class MockDismissCancelHandler extends Handler {
+        private WeakReference<DialogInterface> mDialog;
+
+        public MockDismissCancelHandler(Dialog dialog, Looper looper) {
+            super(looper);
+
+            mDialog = new WeakReference<DialogInterface>(dialog);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+            case DISMISS:
+                ((OnDismissListener) msg.obj).onDismiss(mDialog.get());
+                break;
+            case CANCEL:
+                ((OnCancelListener) msg.obj).onCancel(mDialog.get());
+                break;
+            }
+        }
+    }
+
+    private static class MockDrawable extends Drawable {
+        @Override
+        public void draw(Canvas canvas) {
+        }
+
+        @Override
+        public int getOpacity() {
+            return 0;
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter cf) {
+        }
+    }
+
+    private static class MockView extends View {
+        public boolean isShowContextMenuCalled;
+
+        public MockView(Context context) {
+            super(context);
+        }
+
+        public OnCreateContextMenuListener getOnCreateContextMenuListener() {
+            return mOnCreateContextMenuListener;
+        }
+
+        @Override
+        public boolean showContextMenu() {
+            isShowContextMenuCalled = true;
+            return super.showContextMenu();
+        }
+    }
+}