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