/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.frameworktest.focus;
import com.android.frameworktest.focus.AdjacentVerticalRectLists;
import com.android.frameworktest.util.InternalSelectionView;
import android.test.ActivityInstrumentationTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
/**
* {@link android.view.FocusFinder#findNextFocus(android.view.ViewGroup, android.view.View, int)}
* and
* {@link android.view.View#requestFocus(int, android.graphics.Rect)}
* work together to give a newly focused item a hint about the most interesting
* rectangle of the previously focused view. The view taking focus can use this
* to set an internal selection more appropriate using this rect.
*
* This tests that behavior using three adjacent {@link com.android.frameworktest.util.InternalSelectionView}
* that report interesting rects when giving up focus, and use interesting rects
* when taking focus to best select the internal row to show as selected.
*
*/
public class FocusChangeWithInterestingRectHintTest extends ActivityInstrumentationTestCase<AdjacentVerticalRectLists> {
private InternalSelectionView mLeftColumn;
private InternalSelectionView mMiddleColumn;
private InternalSelectionView mRightColumn;
public FocusChangeWithInterestingRectHintTest() {
super("com.android.frameworktest", AdjacentVerticalRectLists.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
mLeftColumn = getActivity().getLeftColumn();
mMiddleColumn = getActivity().getMiddleColumn();
mRightColumn = getActivity().getRightColumn();
}
@MediumTest
public void testPreconditions() {
assertNotNull(mLeftColumn);
assertNotNull(mMiddleColumn);
assertNotNull(mRightColumn);
assertTrue(mLeftColumn.hasFocus());
assertTrue("need at least 3 rows", mLeftColumn.getNumRows() > 2);
assertEquals(mLeftColumn.getNumRows(), mMiddleColumn.getNumRows());
assertEquals(mMiddleColumn.getNumRows(), mRightColumn.getNumRows());
}
@LargeTest
public void testSnakeBackAndForth() {
final int numRows = mLeftColumn.getNumRows();
for (int row = 0; row < numRows; row++) {
if ((row % 2) == 0) {
assertEquals("row " + row + ": should be at left column",
row, mLeftColumn.getSelectedRow());
sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
assertTrue("row " + row + ": should be at middle column",
mMiddleColumn.hasFocus());
assertEquals(row, mMiddleColumn.getSelectedRow());
sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
assertTrue("row " + row + ": should be at right column",
mRightColumn.hasFocus());
assertEquals(row, mRightColumn.getSelectedRow());
if (row < numRows - 1) {
sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
assertEquals(row + 1, mRightColumn.getSelectedRow());
}
} else {
assertTrue("row " + row + ": should be at right column",
mRightColumn.hasFocus());
sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
assertTrue("row " + row + ": should be at middle column",
mMiddleColumn.hasFocus());
assertEquals(row, mMiddleColumn.getSelectedRow());
sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
assertEquals("row " + row + ": should be at left column",
row, mLeftColumn.getSelectedRow());
if (row < numRows - 1) {
sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
assertEquals(row + 1, mLeftColumn.getSelectedRow());
}
}
}
}
}
|