19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2;
21fb7ed107356a66a55f003a43a7acc2fdbed1e9c2Romain Guyimport android.test.FlakyTest;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A collection of tests on aspects of the AutoCompleteTextView's popup
2637f4e75b09e17eebb78a4856e02810a1b2fd5ed7Brett Chabot *
2737f4e75b09e17eebb78a4856e02810a1b2fd5ed7Brett Chabot * TODO: tests fail intermittently. Add back MediumTest annotation when fixed
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AutoCompleteTextViewPopup
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        extends ActivityInstrumentationTestCase2<AutoCompleteTextViewSimple> {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3204588d5225accfad352a2c4882e4807adc846000Brett Chabot    // ms to sleep when checking for intermittent UI state
3304588d5225accfad352a2c4882e4807adc846000Brett Chabot    private static final int SLEEP_TIME = 50;
3404588d5225accfad352a2c4882e4807adc846000Brett Chabot    // number of times to poll when checking expected UI state
3504588d5225accfad352a2c4882e4807adc846000Brett Chabot    // total wait time will be LOOP_AMOUNT * SLEEP_TIME
3604588d5225accfad352a2c4882e4807adc846000Brett Chabot    private static final int LOOP_AMOUNT = 10;
3704588d5225accfad352a2c4882e4807adc846000Brett Chabot
3804588d5225accfad352a2c4882e4807adc846000Brett Chabot
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AutoCompleteTextViewPopup() {
401d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyen        super("com.android.frameworks.coretests", AutoCompleteTextViewSimple.class);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4204588d5225accfad352a2c4882e4807adc846000Brett Chabot
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Test that we can move the selection and it responds as expected */
4404588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPopupSetListSelection() throws Throwable {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextViewSimple theActivity = getActivity();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AutoCompleteTextView textView = theActivity.getTextView();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation instrumentation = getInstrumentation();
4904588d5225accfad352a2c4882e4807adc846000Brett Chabot
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // focus and type
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textView.requestFocus();
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("A");
5404588d5225accfad352a2c4882e4807adc846000Brett Chabot
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // No initial selection
5604588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection(textView, ListView.INVALID_POSITION);
5704588d5225accfad352a2c4882e4807adc846000Brett Chabot
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // set and check
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        runTestOnUiThread(new Runnable() {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                textView.setListSelection(0);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
6504588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection("set selection to (0)", textView, 0);
6604588d5225accfad352a2c4882e4807adc846000Brett Chabot
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Use movement to cross-check the movement
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
6904588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection("move selection to (1)", textView, 1);
7004588d5225accfad352a2c4882e4807adc846000Brett Chabot
7104588d5225accfad352a2c4882e4807adc846000Brett Chabot        // TODO: FlakyTest repeat runs will not currently call setUp, clear state
7204588d5225accfad352a2c4882e4807adc846000Brett Chabot        clearText(textView);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7404588d5225accfad352a2c4882e4807adc846000Brett Chabot
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Test that we can look at the selection as we move around */
7604588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
7704588d5225accfad352a2c4882e4807adc846000Brett Chabot    public void testPopupGetListSelection() throws Throwable {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextViewSimple theActivity = getActivity();
7904588d5225accfad352a2c4882e4807adc846000Brett Chabot        final AutoCompleteTextView textView = theActivity.getTextView();
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation instrumentation = getInstrumentation();
8104588d5225accfad352a2c4882e4807adc846000Brett Chabot
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // focus and type
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textView.requestFocus();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("A");
8604588d5225accfad352a2c4882e4807adc846000Brett Chabot
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // No initial selection
8804588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection(textView, ListView.INVALID_POSITION);
8904588d5225accfad352a2c4882e4807adc846000Brett Chabot
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check for selection position as expected
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
9204588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection("move selection to (0)", textView, 0);
9304588d5225accfad352a2c4882e4807adc846000Brett Chabot
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Repeat for one more movement
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
9604588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection("move selection to (1)", textView, 1);
9704588d5225accfad352a2c4882e4807adc846000Brett Chabot
9804588d5225accfad352a2c4882e4807adc846000Brett Chabot        // TODO: FlakyTest repeat runs will not currently call setUp, clear state
9904588d5225accfad352a2c4882e4807adc846000Brett Chabot        clearText(textView);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10104588d5225accfad352a2c4882e4807adc846000Brett Chabot
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Test that we can clear the selection */
10304588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPopupClearListSelection() throws Throwable {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextViewSimple theActivity = getActivity();
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AutoCompleteTextView textView = theActivity.getTextView();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation instrumentation = getInstrumentation();
10804588d5225accfad352a2c4882e4807adc846000Brett Chabot
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // focus and type
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textView.requestFocus();
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("A");
11304588d5225accfad352a2c4882e4807adc846000Brett Chabot
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // No initial selection
11504588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection(textView, ListView.INVALID_POSITION);
11604588d5225accfad352a2c4882e4807adc846000Brett Chabot
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check for selection position as expected
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
11904588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection(textView, 0);
12004588d5225accfad352a2c4882e4807adc846000Brett Chabot
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // clear it
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        runTestOnUiThread(new Runnable() {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                textView.clearListSelection();
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
12804588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection("setListSelection(ListView.INVALID_POSITION)", textView,
12904588d5225accfad352a2c4882e4807adc846000Brett Chabot                ListView.INVALID_POSITION);
13004588d5225accfad352a2c4882e4807adc846000Brett Chabot
13104588d5225accfad352a2c4882e4807adc846000Brett Chabot        // TODO: FlakyTest repeat runs will not currently call setUp, clear state
13204588d5225accfad352a2c4882e4807adc846000Brett Chabot        clearText(textView);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Make sure we handle an empty adapter properly */
13604588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPopupNavigateNoAdapter() throws Throwable {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextViewSimple theActivity = getActivity();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AutoCompleteTextView textView = theActivity.getTextView();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation instrumentation = getInstrumentation();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // focus and type
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textView.requestFocus();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("A");
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // No initial selection
14804588d5225accfad352a2c4882e4807adc846000Brett Chabot         waitAssertListSelection(textView, ListView.INVALID_POSITION);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check for selection position as expected
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
15204588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection(textView, 0);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Now get rid of the adapter
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        runTestOnUiThread(new Runnable() {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                textView.setAdapter((ArrayAdapter<?>) null);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now try moving "down" - nothing should happen since there's no longer an adapter
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
16404588d5225accfad352a2c4882e4807adc846000Brett Chabot
16504588d5225accfad352a2c4882e4807adc846000Brett Chabot        // TODO: FlakyTest repeat runs will not currently call setUp, clear state
16604588d5225accfad352a2c4882e4807adc846000Brett Chabot        clearText(textView);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16804588d5225accfad352a2c4882e4807adc846000Brett Chabot
169875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    /** Test the show/hide behavior of the drop-down. */
17004588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
171875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    public void testPopupShow() throws Throwable {
172875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        AutoCompleteTextViewSimple theActivity = getActivity();
173875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        final AutoCompleteTextView textView = theActivity.getTextView();
174875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        final Instrumentation instrumentation = getInstrumentation();
17504588d5225accfad352a2c4882e4807adc846000Brett Chabot
176875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // Drop-down should not be showing when no text has been entered
177875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        assertFalse("isPopupShowing() on start", textView.isPopupShowing());
17804588d5225accfad352a2c4882e4807adc846000Brett Chabot
179875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // focus and type
180875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        textView.requestFocus();
181875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        instrumentation.waitForIdleSync();
182875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        sendKeys("A");
18304588d5225accfad352a2c4882e4807adc846000Brett Chabot
184875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // Drop-down should now be visible
18504588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertPopupShowState("isPopupShowing() after typing", textView, true);
18604588d5225accfad352a2c4882e4807adc846000Brett Chabot
187875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // Clear the text
188875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        runTestOnUiThread(new Runnable() {
189875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            public void run() {
190875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen                textView.setText("");
191875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            }
192875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        });
193875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        instrumentation.waitForIdleSync();
19404588d5225accfad352a2c4882e4807adc846000Brett Chabot
195875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // Drop-down should be hidden when text is cleared
19604588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertPopupShowState("isPopupShowing() after text cleared", textView, false);
19704588d5225accfad352a2c4882e4807adc846000Brett Chabot
198875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // Set the text, without filtering
199875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        runTestOnUiThread(new Runnable() {
200875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            public void run() {
201875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen                textView.setText("a", false);
202875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            }
203875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        });
204875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        instrumentation.waitForIdleSync();
20504588d5225accfad352a2c4882e4807adc846000Brett Chabot
206875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // Drop-down should still be hidden
20704588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertPopupShowState("isPopupShowing() after setText(\"a\", false)", textView, false);
20804588d5225accfad352a2c4882e4807adc846000Brett Chabot
209875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        // Set the text, now with filtering
210875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        runTestOnUiThread(new Runnable() {
211875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            public void run() {
212875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen                textView.setText("a");
213875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen            }
214875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        });
215875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen        instrumentation.waitForIdleSync();
21604588d5225accfad352a2c4882e4807adc846000Brett Chabot
21704588d5225accfad352a2c4882e4807adc846000Brett Chabot        // Drop-down should show up after setText() with filtering
21804588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertPopupShowState("isPopupShowing() after text set", textView, true);
21904588d5225accfad352a2c4882e4807adc846000Brett Chabot
22004588d5225accfad352a2c4882e4807adc846000Brett Chabot        // TODO: FlakyTest repeat runs will not currently call setUp, clear state
22104588d5225accfad352a2c4882e4807adc846000Brett Chabot        clearText(textView);
22204588d5225accfad352a2c4882e4807adc846000Brett Chabot    }
22304588d5225accfad352a2c4882e4807adc846000Brett Chabot
22404588d5225accfad352a2c4882e4807adc846000Brett Chabot    private void waitAssertPopupShowState(String message, AutoCompleteTextView textView,
22504588d5225accfad352a2c4882e4807adc846000Brett Chabot            boolean expected) throws InterruptedException {
22604588d5225accfad352a2c4882e4807adc846000Brett Chabot        for (int i = 0; i < LOOP_AMOUNT; i++) {
22704588d5225accfad352a2c4882e4807adc846000Brett Chabot            if (textView.isPopupShowing() == expected) {
22804588d5225accfad352a2c4882e4807adc846000Brett Chabot                return;
22904588d5225accfad352a2c4882e4807adc846000Brett Chabot            }
23004588d5225accfad352a2c4882e4807adc846000Brett Chabot            Thread.sleep(SLEEP_TIME);
23104588d5225accfad352a2c4882e4807adc846000Brett Chabot        }
23204588d5225accfad352a2c4882e4807adc846000Brett Chabot        assertEquals(message, expected, textView.isPopupShowing());
23304588d5225accfad352a2c4882e4807adc846000Brett Chabot    }
23404588d5225accfad352a2c4882e4807adc846000Brett Chabot
23504588d5225accfad352a2c4882e4807adc846000Brett Chabot    private void waitAssertListSelection(AutoCompleteTextView textView, int expected)
23604588d5225accfad352a2c4882e4807adc846000Brett Chabot            throws Exception {
23704588d5225accfad352a2c4882e4807adc846000Brett Chabot        waitAssertListSelection("getListSelection()", textView, expected);
23804588d5225accfad352a2c4882e4807adc846000Brett Chabot    }
23904588d5225accfad352a2c4882e4807adc846000Brett Chabot
24004588d5225accfad352a2c4882e4807adc846000Brett Chabot    private void waitAssertListSelection(String message, AutoCompleteTextView textView,
24104588d5225accfad352a2c4882e4807adc846000Brett Chabot            int expected) throws Exception {
24204588d5225accfad352a2c4882e4807adc846000Brett Chabot        int currentSelection = ListView.INVALID_POSITION;
24304588d5225accfad352a2c4882e4807adc846000Brett Chabot        for (int i = 0; i < LOOP_AMOUNT; i++) {
24404588d5225accfad352a2c4882e4807adc846000Brett Chabot            currentSelection = textView.getListSelection();
24504588d5225accfad352a2c4882e4807adc846000Brett Chabot            if (expected == currentSelection) {
24604588d5225accfad352a2c4882e4807adc846000Brett Chabot                return;
24704588d5225accfad352a2c4882e4807adc846000Brett Chabot            }
24804588d5225accfad352a2c4882e4807adc846000Brett Chabot            Thread.sleep(SLEEP_TIME);
24904588d5225accfad352a2c4882e4807adc846000Brett Chabot        }
25004588d5225accfad352a2c4882e4807adc846000Brett Chabot        assertEquals(message, expected, textView.getListSelection());
25104588d5225accfad352a2c4882e4807adc846000Brett Chabot    }
25204588d5225accfad352a2c4882e4807adc846000Brett Chabot
25304588d5225accfad352a2c4882e4807adc846000Brett Chabot    private void clearText(final AutoCompleteTextView textView) throws Throwable {
25404588d5225accfad352a2c4882e4807adc846000Brett Chabot        runTestOnUiThread(new Runnable() {
25504588d5225accfad352a2c4882e4807adc846000Brett Chabot            public void run() {
25604588d5225accfad352a2c4882e4807adc846000Brett Chabot                textView.setText("");
25704588d5225accfad352a2c4882e4807adc846000Brett Chabot            }
25804588d5225accfad352a2c4882e4807adc846000Brett Chabot        });
259875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen    }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
261