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
171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenpackage android.widget.listview.focus;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
193c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunneimport android.test.ActivityInstrumentationTestCase2;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.FlakyTest;
213c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunneimport android.test.TouchUtils;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
24f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Tokiimport android.test.suitebuilder.annotation.Suppress;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
26158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewskiimport android.view.View;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AbsListView;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListView;
291d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenimport android.widget.listview.ListWithEditTextHeader;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
313c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunnepublic class ListWithEditTextHeaderTest extends ActivityInstrumentationTestCase2<ListWithEditTextHeader> {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ListView mListView;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ListWithEditTextHeaderTest() {
353c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunne        super(ListWithEditTextHeader.class);
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setUp() throws Exception {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mListView = getActivity().getListView();
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPreconditions() {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("listview.getItemsCanFocus()", mListView.getItemsCanFocus());
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("out of touch-mode", mListView.isInTouchMode());
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("header view count", 1, mListView.getHeaderViewsCount());
493c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunne        assertTrue("header does not have focus", mListView.getChildAt(0).isFocused());
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @FlakyTest(tolerance=2)
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClickingHeaderKeepsFocus() {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TouchUtils.clickView(this, mListView.getChildAt(0));
563c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunne        assertTrue("header does not have focus", mListView.getChildAt(0).isFocused());
573c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunne        assertEquals("something is selected", AbsListView.INVALID_POSITION, mListView.getSelectedItemPosition());
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
61f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Toki    @Suppress  // Failing.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClickingHeaderWhenOtherItemHasFocusGivesHeaderFocus() {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("selected position", 1, mListView.getSelectedItemPosition());
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TouchUtils.clickView(this, mListView.getChildAt(0));
663c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunne        assertTrue("header does not have focus", mListView.getChildAt(0).isFocused());
673c5d27ab1b34548baae6b395ca33ce869aad254dGilles Debunne        assertEquals("something is selected", AbsListView.INVALID_POSITION, mListView.getSelectedItemPosition());
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski
70158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski    @LargeTest
71158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski    public void testScrollingDoesNotDetachHeaderViewFromWindow() {
72158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        View header = mListView.getChildAt(0);
73158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        assertNotNull("header is not attached to a window (?!)", header.getWindowToken());
74158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski
75158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        // Scroll header off the screen and back onto the screen
76158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        int numItemsOnScreen = mListView.getChildCount();
77158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        for (int i = 0; i < numItemsOnScreen; i++) {
78158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
79158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        }
80158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        for (int i = 0; i < numItemsOnScreen; i++) {
81158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski            sendKeys(KeyEvent.KEYCODE_DPAD_UP);
82158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        }
83158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski
84158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        // Make sure the header was not accidentally left detached from its window
85158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski        assertNotNull("header has lost its window", header.getWindowToken());
86158d6b70ac2f0c8fd7dafe0f865112090fb31699Mattias Niklewski    }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
88