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;
2104588d5225accfad352a2c4882e4807adc846000Brett Chabotimport android.test.FlakyTest;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2337f4e75b09e17eebb78a4856e02810a1b2fd5ed7Brett Chabot// TODO: tests fail intermittently. Add back MediumTest annotation when fixed
2404588d5225accfad352a2c4882e4807adc846000Brett Chabotpublic class AutoCompleteTextViewCallbacks
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        extends ActivityInstrumentationTestCase2<AutoCompleteTextViewSimple> {
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2704588d5225accfad352a2c4882e4807adc846000Brett Chabot    private static final int WAIT_TIME = 200;
2804588d5225accfad352a2c4882e4807adc846000Brett Chabot
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AutoCompleteTextViewCallbacks() {
301d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyen        super("com.android.frameworks.coretests", AutoCompleteTextViewSimple.class);
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33a8b30990cb98af32a33583ddbb111552089bc605Brett Chabot    /** Test that the initial popup of the suggestions does not select anything.
34a8b30990cb98af32a33583ddbb111552089bc605Brett Chabot     */
3504588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
3604588d5225accfad352a2c4882e4807adc846000Brett Chabot    public void testPopupNoSelection() throws Exception {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextViewSimple theActivity = getActivity();
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextView textView = theActivity.getTextView();
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation instrumentation = getInstrumentation();
4004588d5225accfad352a2c4882e4807adc846000Brett Chabot
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // focus and type
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textView.requestFocus();
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("A");
45f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        instrumentation.waitForIdleSync();
4604588d5225accfad352a2c4882e4807adc846000Brett Chabot        // give UI time to settle
4704588d5225accfad352a2c4882e4807adc846000Brett Chabot        Thread.sleep(WAIT_TIME);
4804588d5225accfad352a2c4882e4807adc846000Brett Chabot
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now check for selection callbacks.  Nothing should be clicked or selected.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onItemClick should not be called", theActivity.mItemClickCalled);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onItemSelected should not be called", theActivity.mItemSelectedCalled);
5204588d5225accfad352a2c4882e4807adc846000Brett Chabot
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // arguably, this should be "false", because we aren't deselecting - we shouldn't
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // really be calling it.  But it's not the end of the world, and we might wind up
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // breaking something if we change this.
5604588d5225accfad352a2c4882e4807adc846000Brett Chabot        //assertTrue("onNothingSelected should be called", theActivity.mNothingSelectedCalled);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5904588d5225accfad352a2c4882e4807adc846000Brett Chabot    /** Test that arrow-down into the popup calls the onSelected callback. */
6004588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
6104588d5225accfad352a2c4882e4807adc846000Brett Chabot    public void testPopupEnterSelection() throws Exception {
62f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        final AutoCompleteTextViewSimple theActivity = getActivity();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextView textView = theActivity.getTextView();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation instrumentation = getInstrumentation();
6504588d5225accfad352a2c4882e4807adc846000Brett Chabot
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // focus and type
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textView.requestFocus();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("A");
7004588d5225accfad352a2c4882e4807adc846000Brett Chabot
71f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        textView.post(new Runnable() {
72f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy            public void run() {
73f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy                // prepare to move down into the popup
74f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy                theActivity.resetItemListeners();
75f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy            }
76f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        });
77f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
79f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        instrumentation.waitForIdleSync();
8004588d5225accfad352a2c4882e4807adc846000Brett Chabot        // give UI time to settle
8104588d5225accfad352a2c4882e4807adc846000Brett Chabot        Thread.sleep(WAIT_TIME);
8204588d5225accfad352a2c4882e4807adc846000Brett Chabot
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now check for selection callbacks.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onItemClick should not be called", theActivity.mItemClickCalled);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("onItemSelected should be called", theActivity.mItemSelectedCalled);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("onItemSelected position", 0, theActivity.mItemSelectedPosition);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onNothingSelected should not be called", theActivity.mNothingSelectedCalled);
8804588d5225accfad352a2c4882e4807adc846000Brett Chabot
89f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        textView.post(new Runnable() {
90f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy            public void run() {
91f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy                // try one more time - should move from 0 to 1
92f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy                theActivity.resetItemListeners();
93f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy            }
94f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        });
95f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
97f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        instrumentation.waitForIdleSync();
9804588d5225accfad352a2c4882e4807adc846000Brett Chabot        // give UI time to settle
9904588d5225accfad352a2c4882e4807adc846000Brett Chabot        Thread.sleep(WAIT_TIME);
10004588d5225accfad352a2c4882e4807adc846000Brett Chabot
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now check for selection callbacks.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onItemClick should not be called", theActivity.mItemClickCalled);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("onItemSelected should be called", theActivity.mItemSelectedCalled);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("onItemSelected position", 1, theActivity.mItemSelectedPosition);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onNothingSelected should not be called", theActivity.mNothingSelectedCalled);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Test that arrow-up out of the popup calls the onNothingSelected callback */
10904588d5225accfad352a2c4882e4807adc846000Brett Chabot    @FlakyTest(tolerance=3)
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPopupLeaveSelection() {
111f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        final AutoCompleteTextViewSimple theActivity = getActivity();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoCompleteTextView textView = theActivity.getTextView();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Instrumentation instrumentation = getInstrumentation();
11404588d5225accfad352a2c4882e4807adc846000Brett Chabot
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // focus and type
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textView.requestFocus();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instrumentation.waitForIdleSync();
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("A");
119f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        instrumentation.waitForIdleSync();
12004588d5225accfad352a2c4882e4807adc846000Brett Chabot
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // move down into the popup
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_DOWN");
123f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        instrumentation.waitForIdleSync();
124f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy
125f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        textView.post(new Runnable() {
126f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy            public void run() {
127f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy                // prepare to move down into the popup
128f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy                theActivity.resetItemListeners();
129f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy            }
130f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        });
13104588d5225accfad352a2c4882e4807adc846000Brett Chabot
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys("DPAD_UP");
133f32b488bd205ae2b026f47ee898073fd4815da90Romain Guy        instrumentation.waitForIdleSync();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now check for selection callbacks.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onItemClick should not be called", theActivity.mItemClickCalled);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("onItemSelected should not be called", theActivity.mItemSelectedCalled);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("onNothingSelected should be called", theActivity.mNothingSelectedCalled);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
142