Home | History | Annotate | Download | only in focus
      1 /*
      2  * Copyright (C) 2007 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.widget.focus;
     18 
     19 import android.widget.focus.ListOfButtons;
     20 import com.android.frameworks.coretests.R;
     21 
     22 import android.test.ActivityInstrumentationTestCase;
     23 import android.test.suitebuilder.annotation.MediumTest;
     24 import android.widget.ListAdapter;
     25 import android.widget.Button;
     26 import android.widget.ListView;
     27 import android.view.KeyEvent;
     28 import android.view.View;
     29 
     30 /**
     31  * Tests that focus works as expected when navigating into and out of
     32  * a {@link ListView} that has buttons in it.
     33  */
     34 public class ListOfButtonsTest extends ActivityInstrumentationTestCase<ListOfButtons> {
     35 
     36     private ListAdapter mListAdapter;
     37     private Button mButtonAtTop;
     38 
     39     private ListView mListView;
     40 
     41     public ListOfButtonsTest() {
     42         super("com.android.frameworks.coretests", ListOfButtons.class);
     43     }
     44 
     45     @Override
     46     protected void setUp() throws Exception {
     47         super.setUp();
     48 
     49         ListOfButtons a = getActivity();
     50         mListAdapter = a.getListAdapter();
     51         mButtonAtTop = (Button) a.findViewById(R.id.button);
     52         mListView = a.getListView();
     53     }
     54 
     55     @MediumTest
     56     public void testPreconditions() {
     57         assertNotNull(mListAdapter);
     58         assertNotNull(mButtonAtTop);
     59         assertNotNull(mListView);
     60 
     61         assertFalse(mButtonAtTop.hasFocus());
     62         assertTrue(mListView.hasFocus());
     63         assertEquals("expecting 0 index to be selected",
     64                 0, mListView.getSelectedItemPosition());
     65     }
     66 
     67     @MediumTest
     68     public void testNavigateToButtonAbove() {
     69         sendKeys(KeyEvent.KEYCODE_DPAD_UP);
     70 
     71         assertTrue(mButtonAtTop.hasFocus());
     72         assertFalse(mListView.hasFocus());
     73     }
     74 
     75     @MediumTest
     76     public void testNavigateToSecondItem() {
     77         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
     78 
     79         assertTrue(mListView.hasFocus());
     80 
     81         View childOne = mListView.getChildAt(1);
     82         assertNotNull(childOne);
     83         assertEquals(childOne, mListView.getFocusedChild());
     84         assertTrue(childOne.hasFocus());
     85     }
     86 
     87     @MediumTest
     88     public void testNavigateUpAboveAndBackOut() {
     89         sendKeys(KeyEvent.KEYCODE_DPAD_UP);
     90         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
     91 
     92         assertFalse("button at top should have focus back",
     93                 mButtonAtTop.hasFocus());
     94         assertTrue(mListView.hasFocus());
     95     }
     96 
     97     // TODO: this reproduces bug 981791
     98     public void TODO_testNavigateThroughAllButtonsAndBack() {
     99 
    100         String[] labels = getActivity().getLabels();
    101         for (int i = 0; i < labels.length; i++) {
    102             String label = labels[i];
    103             sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    104             getInstrumentation().waitForIdleSync();
    105 
    106             String indexInfo = "index: " + i + ", label: " + label;
    107 
    108             assertTrue(indexInfo, mListView.hasFocus());
    109 
    110             Button button = (Button) mListView.getSelectedView();
    111             assertNotNull(indexInfo, button);
    112             assertEquals(indexInfo, label, button.getText().toString());
    113             assertTrue(indexInfo, button.hasFocus());
    114         }
    115 
    116         // pressing down again shouldn't matter; make sure last item keeps focus
    117         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    118 
    119 
    120         for (int i = labels.length - 1; i >= 0; i--) {
    121             String label = labels[i];
    122 
    123             String indexInfo = "index: " + i + ", label: " + label;
    124 
    125             assertTrue(indexInfo, mListView.hasFocus());
    126 
    127             Button button = (Button) mListView.getSelectedView();
    128             assertNotNull(indexInfo, button);
    129             assertEquals(indexInfo, label, button.getText().toString());
    130             assertTrue(indexInfo, button.hasFocus());
    131 
    132             sendKeys(KeyEvent.KEYCODE_DPAD_UP);
    133             getInstrumentation().waitForIdleSync();
    134         }
    135 
    136         assertTrue("button at top should have focus back",
    137                 mButtonAtTop.hasFocus());
    138         assertFalse(mListView.hasFocus());
    139     }
    140 
    141     @MediumTest
    142     public void testGoInAndOutOfListWithItemsFocusable() {
    143 
    144         sendKeys(KeyEvent.KEYCODE_DPAD_UP);
    145 
    146         assertTrue(mButtonAtTop.hasFocus());
    147 
    148         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    149 
    150         final String firstButtonLabel = getActivity().getLabels()[0];
    151         final Button firstButton = (Button) mListView.getSelectedView();
    152 
    153         assertTrue(firstButton.isFocused());
    154         assertEquals(firstButtonLabel, firstButton.getText());
    155 
    156         sendKeys(KeyEvent.KEYCODE_DPAD_UP);
    157         assertTrue(mButtonAtTop.isFocused());
    158 
    159         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    160         assertTrue(firstButton.isFocused());
    161 
    162         sendKeys(KeyEvent.KEYCODE_DPAD_UP);
    163         assertTrue(mButtonAtTop.isFocused());
    164 
    165         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    166         assertTrue(firstButton.isFocused());
    167     }
    168 
    169 
    170 }
    171