blob: 296f03f48e4364ec1ba796508aa143fa5becbc50 [file] [log] [blame]
/*
* 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 android.widget.cts;
import android.app.Instrumentation;
import android.support.test.InstrumentationRegistry;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.cts.util.ListUtil;
import com.android.compatibility.common.util.CtsKeyEventUtil;
import junit.framework.Assert;
public class ExpandableListTester {
private final ExpandableListView mExpandableListView;
private final ExpandableListAdapter mAdapter;
private final ListUtil mListUtil;
private final Instrumentation mInstrumentation;
public ExpandableListTester(ExpandableListView expandableListView) {
mExpandableListView = expandableListView;
mInstrumentation = InstrumentationRegistry.getInstrumentation();
mListUtil = new ListUtil(mExpandableListView, mInstrumentation);
mAdapter = mExpandableListView.getExpandableListAdapter();
}
private void expandGroup(final int groupIndex, int flatPosition) {
Assert.assertFalse("Group is already expanded", mExpandableListView
.isGroupExpanded(groupIndex));
mListUtil.arrowScrollToSelectedPosition(flatPosition);
mInstrumentation.waitForIdleSync();
CtsKeyEventUtil.sendKeys(mInstrumentation, mExpandableListView,
KeyEvent.KEYCODE_DPAD_CENTER);
mInstrumentation.waitForIdleSync();
Assert.assertTrue("Group did not expand " + groupIndex,
mExpandableListView.isGroupExpanded(groupIndex));
}
void testContextMenus() {
// Add a position tester ContextMenu listener to the ExpandableListView
PositionTesterContextMenuListener menuListener = new PositionTesterContextMenuListener();
mExpandableListView.setOnCreateContextMenuListener(menuListener);
int index = 0;
// Scrolling on header elements should trigger an AdapterContextMenu
for (int i=0; i<mExpandableListView.getHeaderViewsCount(); i++) {
// Check group index in context menu
menuListener.expectAdapterContextMenu(i);
// Make sure the group is visible so that getChild finds it
mListUtil.arrowScrollToSelectedPosition(index);
View headerChild = mExpandableListView.getChildAt(index
- mExpandableListView.getFirstVisiblePosition());
mExpandableListView.showContextMenuForChild(headerChild);
mInstrumentation.waitForIdleSync();
Assert.assertNull(menuListener.getErrorMessage(), menuListener.getErrorMessage());
index++;
}
int groupCount = mAdapter.getGroupCount();
for (int groupIndex = 0; groupIndex < groupCount; groupIndex++) {
// Expand group
expandGroup(groupIndex, index);
// Check group index in context menu
menuListener.expectGroupContextMenu(groupIndex);
// Make sure the group is visible so that getChild finds it
mListUtil.arrowScrollToSelectedPosition(index);
View groupChild = mExpandableListView.getChildAt(index
- mExpandableListView.getFirstVisiblePosition());
mExpandableListView.showContextMenuForChild(groupChild);
mInstrumentation.waitForIdleSync();
Assert.assertNull(menuListener.getErrorMessage(), menuListener.getErrorMessage());
index++;
final int childrenCount = mAdapter.getChildrenCount(groupIndex);
for (int childIndex = 0; childIndex < childrenCount; childIndex++) {
// Check child index in context menu
mListUtil.arrowScrollToSelectedPosition(index);
menuListener.expectChildContextMenu(groupIndex, childIndex);
View child = mExpandableListView.getChildAt(index
- mExpandableListView.getFirstVisiblePosition());
mExpandableListView.showContextMenuForChild(child);
mInstrumentation.waitForIdleSync();
Assert.assertNull(menuListener.getErrorMessage(), menuListener.getErrorMessage());
index++;
}
}
// Scrolling on footer elements should trigger an AdapterContextMenu
for (int i=0; i<mExpandableListView.getFooterViewsCount(); i++) {
// Check group index in context menu
menuListener.expectAdapterContextMenu(index);
// Make sure the group is visible so that getChild finds it
mListUtil.arrowScrollToSelectedPosition(index);
View footerChild = mExpandableListView.getChildAt(index
- mExpandableListView.getFirstVisiblePosition());
mExpandableListView.showContextMenuForChild(footerChild);
mInstrumentation.waitForIdleSync();
Assert.assertNull(menuListener.getErrorMessage(), menuListener.getErrorMessage());
index++;
}
// Cleanup: remove the listener we added.
mExpandableListView.setOnCreateContextMenuListener(null);
}
private int expandAGroup() {
final int groupIndex = 2;
final int headerCount = mExpandableListView.getHeaderViewsCount();
Assert.assertTrue("Not enough groups", groupIndex < mAdapter.getGroupCount());
expandGroup(groupIndex, groupIndex + headerCount);
return groupIndex;
}
// This method assumes that NO group is expanded when called
void testConversionBetweenFlatAndPackedOnGroups() {
final int headerCount = mExpandableListView.getHeaderViewsCount();
for (int i=0; i<headerCount; i++) {
Assert.assertEquals("Non NULL position for header item",
ExpandableListView.PACKED_POSITION_VALUE_NULL,
mExpandableListView.getExpandableListPosition(i));
}
// Test all (non expanded) groups
final int groupCount = mAdapter.getGroupCount();
for (int groupIndex = 0; groupIndex < groupCount; groupIndex++) {
int expectedFlatPosition = headerCount + groupIndex;
long packedPositionForGroup = ExpandableListView.getPackedPositionForGroup(groupIndex);
Assert.assertEquals("Group not found at flat position " + expectedFlatPosition,
packedPositionForGroup,
mExpandableListView.getExpandableListPosition(expectedFlatPosition));
Assert.assertEquals("Wrong flat position for group " + groupIndex,
expectedFlatPosition,
mExpandableListView.getFlatListPosition(packedPositionForGroup));
}
for (int i=0; i<mExpandableListView.getFooterViewsCount(); i++) {
Assert.assertEquals("Non NULL position for header item",
ExpandableListView.PACKED_POSITION_VALUE_NULL,
mExpandableListView.getExpandableListPosition(headerCount + groupCount + i));
}
}
// This method assumes that NO group is expanded when called
void testConversionBetweenFlatAndPackedOnChildren() {
// Test with an expanded group
final int headerCount = mExpandableListView.getHeaderViewsCount();
final int groupIndex = expandAGroup();
final int childrenCount = mAdapter.getChildrenCount(groupIndex);
for (int childIndex = 0; childIndex < childrenCount; childIndex++) {
int expectedFlatPosition = headerCount + groupIndex + 1 + childIndex;
long childPos = ExpandableListView.getPackedPositionForChild(groupIndex, childIndex);
Assert.assertEquals("Wrong flat position for child ",
childPos,
mExpandableListView.getExpandableListPosition(expectedFlatPosition));
Assert.assertEquals("Wrong flat position for child ",
expectedFlatPosition,
mExpandableListView.getFlatListPosition(childPos));
}
}
// This method assumes that NO group is expanded when called
void testSelectedPositionOnGroups() {
int index = 0;
// Scrolling on header elements should not give a valid selected position.
for (int i=0; i<mExpandableListView.getHeaderViewsCount(); i++) {
mListUtil.arrowScrollToSelectedPosition(index);
Assert.assertEquals("Header item is selected",
ExpandableListView.PACKED_POSITION_VALUE_NULL,
mExpandableListView.getSelectedPosition());
index++;
}
// Check selection on group items
final int groupCount = mAdapter.getGroupCount();
for (int groupIndex = 0; groupIndex < groupCount; groupIndex++) {
mListUtil.arrowScrollToSelectedPosition(index);
Assert.assertEquals("Group item is not selected",
ExpandableListView.getPackedPositionForGroup(groupIndex),
mExpandableListView.getSelectedPosition());
index++;
}
// Scrolling on footer elements should not give a valid selected position.
for (int i=0; i<mExpandableListView.getFooterViewsCount(); i++) {
mListUtil.arrowScrollToSelectedPosition(index);
Assert.assertEquals("Footer item is selected",
ExpandableListView.PACKED_POSITION_VALUE_NULL,
mExpandableListView.getSelectedPosition());
index++;
}
}
// This method assumes that NO group is expanded when called
void testSelectedPositionOnChildren() {
// Test with an expanded group
final int headerCount = mExpandableListView.getHeaderViewsCount();
final int groupIndex = expandAGroup();
final int childrenCount = mAdapter.getChildrenCount(groupIndex);
for (int childIndex = 0; childIndex < childrenCount; childIndex++) {
int childFlatPosition = headerCount + groupIndex + 1 + childIndex;
mListUtil.arrowScrollToSelectedPosition(childFlatPosition);
Assert.assertEquals("Group item is not selected",
ExpandableListView.getPackedPositionForChild(groupIndex, childIndex),
mExpandableListView.getSelectedPosition());
}
}
}