• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app.cts;
18 
19 import static androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread;
20 
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertNotNull;
23 import static org.junit.Assert.assertTrue;
24 import static org.mockito.Mockito.*;
25 
26 import android.app.Activity;
27 import android.app.AlertDialog;
28 import android.app.AlertDialog.Builder;
29 import android.app.Instrumentation;
30 import android.app.stubs.DialogStubActivity;
31 import android.app.stubs.R;
32 import android.content.Context;
33 import android.content.DialogInterface;
34 import android.content.DialogInterface.OnCancelListener;
35 import android.content.DialogInterface.OnClickListener;
36 import android.content.DialogInterface.OnDismissListener;
37 import android.content.DialogInterface.OnKeyListener;
38 import android.content.DialogInterface.OnMultiChoiceClickListener;
39 import android.content.res.TypedArray;
40 import android.graphics.drawable.Drawable;
41 import android.os.SystemClock;
42 import android.view.KeyEvent;
43 import android.view.LayoutInflater;
44 import android.view.View;
45 import android.widget.AdapterView.OnItemSelectedListener;
46 import android.widget.ArrayAdapter;
47 import android.widget.Button;
48 import android.widget.ListAdapter;
49 import android.widget.ListView;
50 
51 import androidx.test.filters.SmallTest;
52 import androidx.test.platform.app.InstrumentationRegistry;
53 import androidx.test.rule.ActivityTestRule;
54 
55 import com.android.compatibility.common.util.PollingCheck;
56 import com.android.compatibility.common.util.WindowUtil;
57 
58 import org.junit.Before;
59 import org.junit.Rule;
60 import org.junit.Test;
61 import org.junit.runner.RunWith;
62 import org.junit.runners.JUnit4;
63 import org.mockito.ArgumentCaptor;
64 
65 @SmallTest
66 @RunWith(JUnit4.class)
67 public class AlertDialog_BuilderTest  {
68     private Builder mBuilder;
69     private Instrumentation mInstrumentation;
70     private final CharSequence mTitle = "title";
71     private Drawable mDrawable;
72     private AlertDialog mDialog;
73     private Button mButton;
74     private CharSequence mSelectedItem;
75 
76     private View mView;
77     private ListView mListView;
78 
79     private OnClickListener mOnClickListener = mock(OnClickListener.class);
80 
81     private OnCancelListener mOnCancelListener = mock(OnCancelListener.class);
82 
83     private OnDismissListener mOnDismissListener = mock(OnDismissListener.class);
84 
85     private OnKeyListener mOnKeyListener = mock(OnKeyListener.class);
86 
87     private OnItemSelectedListener mOnItemSelectedListener = mock(OnItemSelectedListener.class);
88 
89     @Rule
90     public ActivityTestRule<DialogStubActivity> mActivityRule =
91             new ActivityTestRule<>(DialogStubActivity.class);
92 
93     private Context mContext;
94 
95     private OnMultiChoiceClickListener mOnMultiChoiceClickListener =
96             mock(OnMultiChoiceClickListener.class);
97 
98     @Before
setUp()99     public void setUp() throws Exception {
100         mInstrumentation = InstrumentationRegistry.getInstrumentation();
101         Activity activity = mActivityRule.getActivity();
102         mContext = activity;
103         WindowUtil.waitForFocus(activity);
104     }
105 
106     @Test
testConstructor()107     public void testConstructor() {
108         new AlertDialog.Builder(mContext);
109     }
110 
111     @Test
testConstructorWithThemeId()112     public void testConstructorWithThemeId() {
113         mBuilder = new AlertDialog.Builder(mContext, R.style.DialogTheme_Test);
114 
115         // Get the context from the builder and attempt to resolve a custom attribute
116         // set on our theme. This way we verify that our theme has been applied to the
117         // builder.
118         final Context themedContext = mBuilder.getContext();
119         int[] attrs = new int[] { R.attr.themeInteger };
120         TypedArray ta = themedContext.obtainStyledAttributes(attrs);
121         assertEquals(20, ta.getInt(0, 0));
122     }
123 
124     @Test
testSetIconWithParamInt()125     public void testSetIconWithParamInt() throws Throwable {
126         runOnUiThread(new Runnable() {
127             public void run() {
128                 mDrawable = mContext.getResources().getDrawable(android.R.drawable.btn_default);
129                 mBuilder = new AlertDialog.Builder(mContext);
130                 mBuilder.setIcon(android.R.drawable.btn_default);
131                 mDialog = mBuilder.show();
132             }
133         });
134         mInstrumentation.waitForIdleSync();
135     }
136 
137     @Test
testSetIconWithParamDrawable()138     public void testSetIconWithParamDrawable() throws Throwable {
139         runOnUiThread(new Runnable() {
140             public void run() {
141                 mDrawable = mContext.getResources().getDrawable(android.R.drawable.btn_default);
142                 mBuilder = new AlertDialog.Builder(mContext);
143                 mBuilder.setIcon(mDrawable);
144                 mDialog = mBuilder.show();
145             }
146         });
147         mInstrumentation.waitForIdleSync();
148     }
149 
150     @Test
testSetIconAttribute()151     public void testSetIconAttribute() throws Throwable {
152         runOnUiThread(new Runnable() {
153             public void run() {
154                 mDrawable = mContext.getResources().getDrawable(android.R.drawable.btn_default);
155                 mBuilder = new AlertDialog.Builder(mContext);
156                 mBuilder.setIconAttribute(android.R.attr.alertDialogIcon);
157                 mDialog = mBuilder.show();
158             }
159         });
160         mInstrumentation.waitForIdleSync();
161     }
162 
163     @Test
testSetPositiveButtonWithParamInt()164     public void testSetPositiveButtonWithParamInt() throws Throwable {
165        runOnUiThread(new Runnable() {
166             public void run() {
167                 mBuilder = new AlertDialog.Builder(mContext);
168                 mBuilder.setPositiveButton(android.R.string.yes, mOnClickListener);
169                 mBuilder.setOnDismissListener(mOnDismissListener);
170                 mDialog = mBuilder.show();
171                 mButton = mDialog.getButton(DialogInterface.BUTTON_POSITIVE);
172                 mButton.performClick();
173             }
174         });
175         mInstrumentation.waitForIdleSync();
176 
177         assertEquals(mContext.getText(android.R.string.yes), mButton.getText());
178         verify(mOnClickListener, times(1)).onClick(mDialog, DialogInterface.BUTTON_POSITIVE);
179         verifyNoMoreInteractions(mOnClickListener);
180         // Button click should also dismiss the dialog and notify the listener
181         verify(mOnDismissListener, times(1)).onDismiss(mDialog);
182         verifyNoMoreInteractions(mOnDismissListener);
183     }
184 
185     @Test
testSetPositiveButtonWithParamCharSequence()186     public void testSetPositiveButtonWithParamCharSequence() throws Throwable {
187         runOnUiThread(new Runnable() {
188             public void run() {
189                 mBuilder = new AlertDialog.Builder(mContext);
190                 mBuilder.setPositiveButton(android.R.string.yes, mOnClickListener);
191                 mBuilder.setOnDismissListener(mOnDismissListener);
192                 mDialog = mBuilder.show();
193                 mButton = mDialog.getButton(DialogInterface.BUTTON_POSITIVE);
194                 mButton.performClick();
195             }
196         });
197         mInstrumentation.waitForIdleSync();
198         assertEquals(mContext.getText(android.R.string.yes), mButton.getText());
199         verify(mOnClickListener, times(1)).onClick(mDialog, DialogInterface.BUTTON_POSITIVE);
200         verifyNoMoreInteractions(mOnClickListener);
201         // Button click should also dismiss the dialog and notify the listener
202         verify(mOnDismissListener, times(1)).onDismiss(mDialog);
203         verifyNoMoreInteractions(mOnDismissListener);
204     }
205 
206     @Test
testSetNegativeButtonWithParamCharSequence()207     public void testSetNegativeButtonWithParamCharSequence() throws Throwable {
208         runOnUiThread(new Runnable() {
209             public void run() {
210                 mBuilder = new AlertDialog.Builder(mContext);
211                 mBuilder.setNegativeButton(mTitle, mOnClickListener);
212                 mBuilder.setOnDismissListener(mOnDismissListener);
213                 mDialog = mBuilder.show();
214                 mButton = mDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
215                 mButton.performClick();
216             }
217         });
218         mInstrumentation.waitForIdleSync();
219         assertEquals(mTitle, mButton.getText());
220         verify(mOnClickListener, times(1)).onClick(mDialog, DialogInterface.BUTTON_NEGATIVE);
221         verifyNoMoreInteractions(mOnClickListener);
222         // Button click should also dismiss the dialog and notify the listener
223         verify(mOnDismissListener, times(1)).onDismiss(mDialog);
224         verifyNoMoreInteractions(mOnDismissListener);
225     }
226 
227     @Test
testSetNegativeButtonWithParamInt()228     public void testSetNegativeButtonWithParamInt() throws Throwable {
229         runOnUiThread(new Runnable() {
230             public void run() {
231                 mBuilder = new AlertDialog.Builder(mContext);
232                 mBuilder.setNegativeButton(R.string.notify, mOnClickListener);
233                 mBuilder.setOnDismissListener(mOnDismissListener);
234                 mDialog = mBuilder.show();
235                 mButton = mDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
236                 mButton.performClick();
237             }
238         });
239         mInstrumentation.waitForIdleSync();
240         assertEquals(mContext.getText(R.string.notify), mButton.getText());
241         verify(mOnClickListener, times(1)).onClick(mDialog, DialogInterface.BUTTON_NEGATIVE);
242         verifyNoMoreInteractions(mOnClickListener);
243         // Button click should also dismiss the dialog and notify the listener
244         verify(mOnDismissListener, times(1)).onDismiss(mDialog);
245         verifyNoMoreInteractions(mOnDismissListener);
246     }
247 
248     @Test
testSetNeutralButtonWithParamInt()249     public void testSetNeutralButtonWithParamInt() throws Throwable {
250         runOnUiThread(new Runnable() {
251             public void run() {
252                 mBuilder = new AlertDialog.Builder(mContext);
253                 mBuilder.setNeutralButton(R.string.notify, mOnClickListener);
254                 mBuilder.setOnDismissListener(mOnDismissListener);
255                 mDialog = mBuilder.show();
256                 mButton = mDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
257                 mButton.performClick();
258             }
259         });
260         mInstrumentation.waitForIdleSync();
261         assertEquals(mContext.getText(R.string.notify), mButton.getText());
262         verify(mOnClickListener, times(1)).onClick(mDialog, DialogInterface.BUTTON_NEUTRAL);
263         verifyNoMoreInteractions(mOnClickListener);
264         // Button click should also dismiss the dialog and notify the listener
265         verify(mOnDismissListener, times(1)).onDismiss(mDialog);
266         verifyNoMoreInteractions(mOnDismissListener);
267     }
268 
269     @Test
testSetNeutralButtonWithParamCharSequence()270     public void testSetNeutralButtonWithParamCharSequence() throws Throwable {
271         runOnUiThread(new Runnable() {
272             public void run() {
273                 mBuilder = new AlertDialog.Builder(mContext);
274                 mBuilder.setNeutralButton(mTitle, mOnClickListener);
275                 mBuilder.setOnDismissListener(mOnDismissListener);
276                 mDialog = mBuilder.show();
277                 mButton = mDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
278                 mButton.performClick();
279             }
280         });
281         mInstrumentation.waitForIdleSync();
282         assertEquals(mTitle, mButton.getText());
283         verify(mOnClickListener, times(1)).onClick(mDialog, DialogInterface.BUTTON_NEUTRAL);
284         verifyNoMoreInteractions(mOnClickListener);
285         // Button click should also dismiss the dialog and notify the listener
286         verify(mOnDismissListener, times(1)).onDismiss(mDialog);
287         verifyNoMoreInteractions(mOnDismissListener);
288     }
289 
testCancelable(final boolean cancelable)290     private void testCancelable(final boolean cancelable) throws Throwable {
291         runOnUiThread(new Runnable() {
292             public void run() {
293                 mBuilder = new AlertDialog.Builder(mContext);
294                 mBuilder.setCancelable(cancelable);
295                 mDialog = mBuilder.show();
296             }
297         });
298         mInstrumentation.waitForIdleSync();
299         PollingCheck.waitFor(mDialog::isShowing);
300         sendKeySync(KeyEvent.KEYCODE_BACK);
301         mInstrumentation.waitForIdleSync();
302         new PollingCheck() {
303             @Override
304             protected boolean check() {
305                 boolean showing = mDialog.isShowing();
306                 if (cancelable) {
307                     // if the dialog is cancelable, then pressing back
308                     // should cancel it. Thus it should not be showing
309                     return !showing;
310                 } else {
311                     // if the dialog is not cancelable, pressing back
312                     // should so nothing and it should still be showing
313                     return showing;
314                 }
315             }
316         }.run();
317     }
318 
319     @Test
testSetCancelable()320     public void testSetCancelable() throws Throwable {
321         testCancelable(true);
322     }
323 
324     @Test
testDisableCancelable()325     public void testDisableCancelable() throws Throwable {
326         testCancelable(false);
327     }
328 
329     @Test
testSetOnCancelListener()330     public void testSetOnCancelListener() throws Throwable {
331         runOnUiThread(new Runnable() {
332             public void run() {
333                 mBuilder = new AlertDialog.Builder(mContext);
334                 mBuilder.setOnCancelListener(mOnCancelListener);
335                 mDialog = mBuilder.show();
336                 mDialog.cancel();
337             }
338         });
339         mInstrumentation.waitForIdleSync();
340         verify(mOnCancelListener, times(1)).onCancel(mDialog);
341         verifyNoMoreInteractions(mOnCancelListener);
342     }
343 
344     @Test
testSetOnDismissListener()345     public void testSetOnDismissListener() throws Throwable {
346         runOnUiThread(new Runnable() {
347             public void run() {
348                 mBuilder = new AlertDialog.Builder(mContext);
349                 mBuilder.setOnDismissListener(mOnDismissListener);
350                 mDialog = mBuilder.show();
351                 mDialog.dismiss();
352             }
353         });
354         mInstrumentation.waitForIdleSync();
355         verify(mOnDismissListener, times(1)).onDismiss(mDialog);
356         verifyNoMoreInteractions(mOnDismissListener);
357     }
358 
359     @Test
testSetOnKeyListener()360     public void testSetOnKeyListener() throws Throwable {
361         runOnUiThread(new Runnable() {
362             public void run() {
363                 mBuilder = new AlertDialog.Builder(mContext);
364                 mBuilder.setOnKeyListener(mOnKeyListener);
365                 mDialog = mBuilder.show();
366             }
367         });
368         mInstrumentation.waitForIdleSync();
369         sendKeySync(KeyEvent.KEYCODE_0);
370         sendKeySync(KeyEvent.KEYCODE_1);
371         mInstrumentation.waitForIdleSync();
372         // Use Mockito captures so that we can verify that each "sent" key code resulted
373         // in one DOWN event and one UP event.
374         ArgumentCaptor<KeyEvent> keyEvent0Captor = ArgumentCaptor.forClass(KeyEvent.class);
375         ArgumentCaptor<KeyEvent> keyEvent1Captor = ArgumentCaptor.forClass(KeyEvent.class);
376         verify(mOnKeyListener, times(2)).onKey(eq(mDialog), eq(KeyEvent.KEYCODE_0),
377                 keyEvent0Captor.capture());
378         verify(mOnKeyListener, times(2)).onKey(eq(mDialog), eq(KeyEvent.KEYCODE_1),
379                 keyEvent1Captor.capture());
380         verifyNoMoreInteractions(mOnKeyListener);
381         assertEquals(KeyEvent.ACTION_DOWN, keyEvent0Captor.getAllValues().get(0).getAction());
382         assertEquals(KeyEvent.ACTION_UP, keyEvent0Captor.getAllValues().get(1).getAction());
383         assertEquals(KeyEvent.ACTION_DOWN, keyEvent1Captor.getAllValues().get(0).getAction());
384         assertEquals(KeyEvent.ACTION_UP, keyEvent1Captor.getAllValues().get(1).getAction());
385     }
386 
387     @Test
testSetItemsWithParamInt()388     public void testSetItemsWithParamInt() throws Throwable {
389         runOnUiThread(new Runnable() {
390             public void run() {
391                 mBuilder = new AlertDialog.Builder(mContext);
392                 mBuilder.setItems(R.array.difficultyLevel, mOnClickListener);
393                 mDialog = mBuilder.show();
394                 mListView = mDialog.getListView();
395             }
396         });
397         mInstrumentation.waitForIdleSync();
398 
399         final CharSequence[] levels = mContext.getResources().getTextArray(
400                 R.array.difficultyLevel);
401         assertEquals(levels[0], mListView.getItemAtPosition(0));
402     }
403 
404     @Test
testSetItemsWithParamCharSequence()405     public void testSetItemsWithParamCharSequence() throws Throwable {
406         final CharSequence[] expect = mContext.getResources().getTextArray(
407                 R.array.difficultyLevel);
408 
409         runOnUiThread(new Runnable() {
410             public void run() {
411                 mBuilder = new AlertDialog.Builder(mContext);
412                 mBuilder.setItems(expect, mOnClickListener);
413                 mDialog = mBuilder.show();
414                 mListView = mDialog.getListView();
415             }
416         });
417         mInstrumentation.waitForIdleSync();
418         assertEquals(expect[0], mListView.getItemAtPosition(0));
419     }
420 
421     @Test
testSetAdapter()422     public void testSetAdapter() throws Throwable {
423         final ListAdapter adapter = new AdapterTest();
424         runOnUiThread(new Runnable() {
425             public void run() {
426                 mBuilder = new AlertDialog.Builder(mContext);
427                 mBuilder.setAdapter(adapter, mOnClickListener);
428                 mDialog = mBuilder.show();
429                 mListView = mDialog.getListView();
430             }
431         });
432         mInstrumentation.waitForIdleSync();
433         assertEquals(adapter, mListView.getAdapter());
434     }
435 
436     @Test
testSetMultiChoiceItemsWithParamInt()437     public void testSetMultiChoiceItemsWithParamInt() throws Throwable {
438 
439         final CharSequence[] items = mContext.getResources().getTextArray(
440                 R.array.difficultyLevel);
441 
442         runOnUiThread(new Runnable() {
443             public void run() {
444                 mBuilder = new AlertDialog.Builder(mContext);
445                 mBuilder.setMultiChoiceItems(R.array.difficultyLevel, null,
446                         mOnMultiChoiceClickListener);
447                 mDialog = mBuilder.show();
448                 mListView = mDialog.getListView();
449                 mSelectedItem = (CharSequence)mListView.getSelectedItem();
450                 mListView.performItemClick(null, 0, 0);
451                 mListView.performItemClick(null, 1, 0);
452             }
453         });
454         mInstrumentation.waitForIdleSync();
455         assertEquals(items[0], mSelectedItem);
456         verify(mOnMultiChoiceClickListener, times(1)).onClick(mDialog, 0, true);
457         verify(mOnMultiChoiceClickListener, times(1)).onClick(mDialog, 1, true);
458         verifyNoMoreInteractions(mOnMultiChoiceClickListener);
459         assertEquals(items[0], mListView.getItemAtPosition(0));
460     }
461 
462     @Test
testSetMultiChoiceItemsWithParamCharSequence()463     public void testSetMultiChoiceItemsWithParamCharSequence() throws Throwable {
464         final CharSequence[] items = mContext.getResources().getTextArray(
465                 R.array.difficultyLevel);
466 
467         runOnUiThread(new Runnable() {
468             public void run() {
469                 mBuilder = new AlertDialog.Builder(mContext);
470                 mBuilder.setMultiChoiceItems(items, null, mOnMultiChoiceClickListener);
471                 mDialog = mBuilder.show();
472                 mListView = mDialog.getListView();
473                 mSelectedItem = (CharSequence)mListView.getSelectedItem();
474                 mListView.performItemClick(null, 0, 0);
475                 mListView.performItemClick(null, 1, 0);
476             }
477         });
478         mInstrumentation.waitForIdleSync();
479         assertEquals(items[0], mSelectedItem);
480         verify(mOnMultiChoiceClickListener, times(1)).onClick(mDialog, 0, true);
481         verify(mOnMultiChoiceClickListener, times(1)).onClick(mDialog, 1, true);
482         verifyNoMoreInteractions(mOnMultiChoiceClickListener);
483         assertEquals(items[0], mListView.getItemAtPosition(0));
484     }
485 
486     @Test
testSetSingleChoiceItemsWithParamInt()487     public void testSetSingleChoiceItemsWithParamInt() throws Throwable {
488         final CharSequence[] items = mContext.getResources().getTextArray(
489                 R.array.difficultyLevel);
490 
491         runOnUiThread(new Runnable() {
492             public void run() {
493                 mBuilder = new AlertDialog.Builder(mContext);
494                 mBuilder.setSingleChoiceItems(R.array.difficultyLevel, 0,
495                         mOnClickListener);
496                 mDialog = mBuilder.show();
497                 mListView = mDialog.getListView();
498                 mSelectedItem = (CharSequence)mListView.getSelectedItem();
499                 mListView.performItemClick(null, 0, 0);
500             }
501         });
502         mInstrumentation.waitForIdleSync();
503         assertEquals(items[0], mSelectedItem);
504         assertEquals(items[0], mListView.getItemAtPosition(0));
505         verify(mOnClickListener, times(1)).onClick(mDialog, 0);
506         verifyNoMoreInteractions(mOnClickListener);
507     }
508 
509     @Test
testSetSingleChoiceItemsWithParamCharSequence()510     public void testSetSingleChoiceItemsWithParamCharSequence() throws Throwable {
511         final CharSequence[] items = mContext.getResources().getTextArray(
512                 R.array.difficultyLevel);
513 
514         runOnUiThread(new Runnable() {
515             public void run() {
516                 mBuilder = new AlertDialog.Builder(mContext);
517                 mBuilder.setSingleChoiceItems(items, 0, mOnClickListener);
518                 mDialog = mBuilder.show();
519                 mListView = mDialog.getListView();
520                 mSelectedItem = (CharSequence)mListView.getSelectedItem();
521                 mListView.performItemClick(null, 0, 0);
522             }
523         });
524         mInstrumentation.waitForIdleSync();
525         assertEquals(items[0], mSelectedItem);
526         assertEquals(items[0], mListView.getItemAtPosition(0));
527         verify(mOnClickListener, times(1)).onClick(mDialog, 0);
528         verifyNoMoreInteractions(mOnClickListener);
529     }
530 
531     @Test
testSetSingleChoiceItems()532     public void testSetSingleChoiceItems() throws Throwable {
533         final CharSequence[] items = mContext.getResources().getTextArray(
534                 R.array.difficultyLevel);
535 
536         runOnUiThread(new Runnable() {
537             public void run() {
538                 mBuilder = new AlertDialog.Builder(mContext);
539                 mBuilder.setSingleChoiceItems(new ArrayAdapter<CharSequence>(mContext,
540                         android.R.layout.select_dialog_singlechoice, android.R.id.text1, items), 0,
541                         mOnClickListener);
542                 mDialog = mBuilder.show();
543                 mListView = mDialog.getListView();
544                 mSelectedItem = (CharSequence)mListView.getSelectedItem();
545                 mListView.performItemClick(null, 0, 0);
546             }
547         });
548         mInstrumentation.waitForIdleSync();
549         assertEquals(items[0], mSelectedItem);
550         assertEquals(items[0], mListView.getItemAtPosition(0));
551         verify(mOnClickListener, times(1)).onClick(mDialog, 0);
552         verifyNoMoreInteractions(mOnClickListener);
553     }
554 
555     @Test
testSetOnItemSelectedListener()556     public void testSetOnItemSelectedListener() throws Throwable {
557         runOnUiThread(new Runnable() {
558             public void run() {
559                 mBuilder = new AlertDialog.Builder(mContext);
560                 mBuilder.setOnItemSelectedListener(mOnItemSelectedListener);
561                 mBuilder.setItems(R.array.difficultyLevel, mOnClickListener);
562                 mDialog = mBuilder.show();
563                 mListView = mDialog.getListView();
564                 mListView.pointToPosition(0, 0);
565             }
566         });
567         mInstrumentation.waitForIdleSync();
568         verify(mOnItemSelectedListener, times(1)).onItemSelected(eq(mListView), any(View.class),
569                 eq(0), any(Long.class));
570         verifyNoMoreInteractions(mOnItemSelectedListener);
571     }
572 
573     @Test
testSetView()574     public void testSetView() throws Throwable {
575         final View view = new View(mContext);
576         view.setId(100);
577         runOnUiThread(new Runnable() {
578             public void run() {
579                 mBuilder = new AlertDialog.Builder(mContext);
580                 mBuilder.setView(view);
581                 mDialog = mBuilder.show();
582                 mView = mDialog.getWindow().findViewById(100);
583             }
584         });
585         mInstrumentation.waitForIdleSync();
586         assertEquals(view, mView);
587     }
588 
589     @Test
testSetViewFromInflater()590     public void testSetViewFromInflater() throws Throwable {
591         runOnUiThread(new Runnable() {
592             public void run() {
593                 mBuilder = new AlertDialog.Builder(mContext);
594                 mBuilder.setView(LayoutInflater.from(mBuilder.getContext()).inflate(
595                         R.layout.alert_dialog_text_entry_2, null, false));
596                 mDialog = mBuilder.show();
597                 mView = mDialog.getWindow().findViewById(R.id.username_form);
598             }
599         });
600         mInstrumentation.waitForIdleSync();
601         assertNotNull(mView);
602         assertNotNull(mView.findViewById(R.id.username_view));
603         assertNotNull(mView.findViewById(R.id.username_edit));
604     }
605 
606     @Test
testSetViewById()607     public void testSetViewById() throws Throwable {
608         runOnUiThread(new Runnable() {
609             public void run() {
610                 mBuilder = new AlertDialog.Builder(mContext);
611                 mBuilder.setView(R.layout.alert_dialog_text_entry_2);
612                 mDialog = mBuilder.show();
613                 mView = mDialog.getWindow().findViewById(R.id.username_form);
614             }
615         });
616         mInstrumentation.waitForIdleSync();
617         assertNotNull(mView);
618         assertNotNull(mView.findViewById(R.id.username_view));
619         assertNotNull(mView.findViewById(R.id.username_edit));
620     }
621 
622     @Test
testSetCustomTitle()623     public void testSetCustomTitle() throws Throwable {
624         runOnUiThread(new Runnable() {
625             public void run() {
626                 mBuilder = new AlertDialog.Builder(mContext);
627                 mBuilder.setCustomTitle(LayoutInflater.from(mBuilder.getContext()).inflate(
628                         R.layout.alertdialog_custom_title, null, false));
629                 mDialog = mBuilder.show();
630             }
631         });
632         mInstrumentation.waitForIdleSync();
633     }
634 
635     @Test
testSetInverseBackgroundForced()636     public void testSetInverseBackgroundForced() throws Throwable {
637         runOnUiThread(new Runnable() {
638             public void run() {
639                 mBuilder = new AlertDialog.Builder(mContext);
640                 mBuilder.setInverseBackgroundForced(true);
641                 mDialog = mBuilder.create();
642                 mDialog.show();
643             }
644         });
645         mInstrumentation.waitForIdleSync();
646     }
647 
648     @Test
testCreate()649     public void testCreate() throws Throwable {
650         runOnUiThread(new Runnable() {
651             public void run() {
652                 mBuilder = new AlertDialog.Builder(mContext);
653                 mDialog = mBuilder.create();
654                 mDialog.show();
655             }
656         });
657         mInstrumentation.waitForIdleSync();
658         assertNotNull(mDialog);
659         assertTrue(mDialog.isShowing());
660     }
661 
662     @Test
testShow()663     public void testShow() throws Throwable {
664         runOnUiThread(new Runnable() {
665             public void run() {
666                 mBuilder = new AlertDialog.Builder(mContext);
667                 mDialog = mBuilder.show();
668             }
669         });
670         mInstrumentation.waitForIdleSync();
671         assertTrue(mDialog.isShowing());
672     }
673 
sendKeySync(int keyCode)674     private void sendKeySync(int keyCode) {
675         final long downTime = SystemClock.uptimeMillis();
676         final KeyEvent downEvent =
677                 new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN, keyCode, 0);
678         mInstrumentation.getUiAutomation().injectInputEvent(downEvent, true /*sync*/);
679 
680         final KeyEvent upEvent =
681                 new KeyEvent(downTime, SystemClock.uptimeMillis(), KeyEvent.ACTION_UP, keyCode, 0);
682         mInstrumentation.getUiAutomation().injectInputEvent(upEvent, true /*sync*/);
683     }
684 
685     private static class AdapterTest implements android.widget.ListAdapter {
areAllItemsEnabled()686         public boolean areAllItemsEnabled() {
687             return true;
688         }
689 
isEnabled(int position)690         public boolean isEnabled(int position) {
691             return false;
692         }
693 
getCount()694         public int getCount() {
695             return 0;
696         }
697 
getItem(int position)698         public Object getItem(int position) {
699             return null;
700         }
701 
getItemId(int position)702         public long getItemId(int position) {
703             return 0;
704         }
705 
getItemViewType(int position)706         public int getItemViewType(int position) {
707             return 0;
708         }
709 
getView( int position, android.view.View convertView, android.view.ViewGroup parent)710         public android.view.View getView( int position,
711                                           android.view.View convertView,
712                                           android.view.ViewGroup parent){
713             return null;
714         }
715 
getViewTypeCount()716         public int getViewTypeCount() {
717             return 1;
718         }
719 
hasStableIds()720         public boolean hasStableIds() {
721             return false;
722         }
723 
isEmpty()724         public boolean isEmpty() {
725             return true;
726         }
727 
registerDataSetObserver( android.database.DataSetObserver observer)728         public void registerDataSetObserver(
729             android.database.DataSetObserver observer) {
730         }
731 
unregisterDataSetObserver( android.database.DataSetObserver observer)732         public void unregisterDataSetObserver(
733             android.database.DataSetObserver observer) {
734         }
735     }
736 }
737