Merge "Add unit tests to ListGridLayout." into qt-dev

This commit is contained in:
Aaron Heuckroth
2019-04-19 14:22:44 +00:00
committed by Android (Google) Code Review
3 changed files with 310 additions and 26 deletions

View File

@@ -117,6 +117,7 @@ public class GlobalActionsGridLayout extends MultiListLayout {
} else {
parent.addView(v);
}
parent.setVisibility(View.VISIBLE);
}
updateSnapPosition();
updateSeparatedButtonSize();

View File

@@ -41,6 +41,21 @@ public class ListGridLayout extends LinearLayout {
private static final String TAG = "ListGridLayout";
private int mExpectedCount;
// number of rows and columns to use for different numbers of items
private final int[][] mConfigs = {
// {rows, columns}
{0, 0}, // 0 items
{1, 1}, // 1 item
{1, 2}, // 2 items
{1, 3}, // 3 items
{2, 2}, // 4 items
{2, 3}, // 5 items
{2, 3}, // 6 items
{3, 3}, // 7 items
{3, 3}, // 8 items
{3, 3} // 9 items
};
public ListGridLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@@ -53,19 +68,28 @@ public class ListGridLayout extends LinearLayout {
ViewGroup subList = (ViewGroup) getChildAt(i);
if (subList != null) {
subList.removeAllViews();
subList.setVisibility(View.GONE);
}
}
}
/**
* Get the parent view associated with the item which should be placed at the given position.
* @param index The index of the item.
* @param reverseSublists Reverse the order of sublists. Ordinarily, sublists fill from first to
* last, whereas setting this to true will fill them last to first.
* @param swapRowsAndColumns Swap the order in which rows and columns are filled. By default,
* columns fill first, adding one item to each row. Setting this to
* true will cause rows to fill first, adding one item to each column.
* @return
*/
public ViewGroup getParentView(int index, boolean reverseSublists, boolean swapRowsAndColumns) {
if (getRowCount() == 0) {
if (getRowCount() == 0 || index < 0) {
return null;
}
int column = getParentViewIndex(index, reverseSublists, swapRowsAndColumns);
return (ViewGroup) getChildAt(column);
int targetIndex = Math.min(index, getMaxElementCount() - 1);
int row = getParentViewIndex(targetIndex, reverseSublists, swapRowsAndColumns);
return (ViewGroup) getChildAt(row);
}
private int reverseSublistIndex(int index) {
@@ -74,7 +98,6 @@ public class ListGridLayout extends LinearLayout {
private int getParentViewIndex(int index, boolean reverseSublists, boolean swapRowsAndColumns) {
int sublistIndex;
ViewGroup row;
int rows = getRowCount();
if (swapRowsAndColumns) {
sublistIndex = (int) Math.floor(index / rows);
@@ -92,42 +115,31 @@ public class ListGridLayout extends LinearLayout {
*/
public void setExpectedCount(int count) {
mExpectedCount = count;
for (int i = 0; i < getChildCount(); i++) {
if (i <= getColumnCount()) {
setSublistVisibility(i, true);
} else {
setSublistVisibility(i, false);
}
}
}
private void setSublistVisibility(int index, boolean visible) {
View subList = getChildAt(index);
if (subList != null) {
subList.setVisibility(visible ? View.VISIBLE : View.GONE);
private int getMaxElementCount() {
return mConfigs.length - 1;
}
private int[] getConfig() {
if (mExpectedCount < 0) {
return mConfigs[0];
}
int targetElements = Math.min(getMaxElementCount(), mExpectedCount);
return mConfigs[targetElements];
}
/**
* Get the number of rows which will be used to render children.
*/
public int getRowCount() {
// special case for 3 to use a single row
if (mExpectedCount == 3) {
return 1;
}
return (int) Math.round(Math.sqrt(mExpectedCount));
return getConfig()[0];
}
/**
* Get the number of columns which will be used to render children.
*/
public int getColumnCount() {
// special case for 3 to use a single row
if (mExpectedCount == 3) {
return 3;
}
return (int) Math.ceil(Math.sqrt(mExpectedCount));
return getConfig()[1];
}
}

View File

@@ -0,0 +1,271 @@
/*
* Copyright (C) 2019 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.systemui.globalactions;
import static junit.framework.Assert.assertEquals;
import android.testing.AndroidTestingRunner;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.test.filters.SmallTest;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests for {@link ListGridLayout}.
*/
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class ListGridLayoutTest extends SysuiTestCase {
private ListGridLayout mListGridLayout;
@Before
public void setUp() throws Exception {
GlobalActionsGridLayout globalActions = (GlobalActionsGridLayout)
LayoutInflater.from(mContext).inflate(R.layout.global_actions_grid, null);
mListGridLayout = globalActions.getListView();
}
@Test
public void testInflation() {
assertEquals(3, mListGridLayout.getChildCount());
}
@Test
public void testGetRowCount() {
// above expected range
mListGridLayout.setExpectedCount(99);
assertEquals(3, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(9);
assertEquals(3, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(8);
assertEquals(3, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(7);
assertEquals(3, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(6);
assertEquals(2, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(5);
assertEquals(2, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(4);
assertEquals(2, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(3);
assertEquals(1, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(2);
assertEquals(1, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(1);
assertEquals(1, mListGridLayout.getRowCount());
mListGridLayout.setExpectedCount(0);
assertEquals(0, mListGridLayout.getRowCount());
// below expected range
mListGridLayout.setExpectedCount(-1);
assertEquals(0, mListGridLayout.getRowCount());
}
@Test
public void testGetColumnCount() {
// above expected range
mListGridLayout.setExpectedCount(99);
assertEquals(3, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(9);
assertEquals(3, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(8);
assertEquals(3, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(7);
assertEquals(3, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(6);
assertEquals(3, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(5);
assertEquals(3, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(4);
assertEquals(2, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(3);
assertEquals(3, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(2);
assertEquals(2, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(1);
assertEquals(1, mListGridLayout.getColumnCount());
mListGridLayout.setExpectedCount(0);
assertEquals(0, mListGridLayout.getColumnCount());
// below expected range
mListGridLayout.setExpectedCount(-1);
assertEquals(0, mListGridLayout.getColumnCount());
}
@Test
public void testGetParentView_default() {
mListGridLayout.setExpectedCount(9);
// below valid range
assertEquals(null,
mListGridLayout.getParentView(-1, false, false));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(0, false, false));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(1, false, false));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(2, false, false));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(3, false, false));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(4, false, false));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(5, false, false));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(6, false, false));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(7, false, false));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(8, false, false));
// above valid range
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(9, false, false));
}
@Test
public void testGetParentView_reverseSublists() {
mListGridLayout.setExpectedCount(9);
// below valid range
assertEquals(null,
mListGridLayout.getParentView(-1, true, false));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(0, true, false));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(1, true, false));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(2, true, false));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(3, true, false));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(4, true, false));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(5, true, false));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(6, true, false));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(7, true, false));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(8, true, false));
// above valid range
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(9, true, false));
}
@Test
public void testGetParentView_swapRowsAndColumns() {
mListGridLayout.setExpectedCount(9);
// below valid range
assertEquals(null,
mListGridLayout.getParentView(-1, false, true));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(0, false, true));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(1, false, true));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(2, false, true));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(3, false, true));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(4, false, true));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(5, false, true));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(6, false, true));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(7, false, true));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(8, false, true));
// above valid range
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(9, false, true));
}
@Test
public void testGetParentView_swapRowsAndColumnsAndReverseSublists() {
mListGridLayout.setExpectedCount(9);
// below valid range
assertEquals(null,
mListGridLayout.getParentView(-1, true, true));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(0, true, true));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(1, true, true));
assertEquals(mListGridLayout.getChildAt(2),
mListGridLayout.getParentView(2, true, true));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(3, true, true));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(4, true, true));
assertEquals(mListGridLayout.getChildAt(1),
mListGridLayout.getParentView(5, true, true));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(6, true, true));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(7, true, true));
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(8, true, true));
// above valid range
assertEquals(mListGridLayout.getChildAt(0),
mListGridLayout.getParentView(9, true, true));
}
@Test
public void testRemoveAllItems() {
ViewGroup row1 = (ViewGroup) mListGridLayout.getChildAt(0);
ViewGroup row2 = (ViewGroup) mListGridLayout.getChildAt(1);
ViewGroup row3 = (ViewGroup) mListGridLayout.getChildAt(2);
View item1 = new View(mContext, null);
View item2 = new View(mContext, null);
View item3 = new View(mContext, null);
row1.addView(item1);
row2.addView(item2);
row3.addView(item3);
assertEquals(1, row1.getChildCount());
assertEquals(1, row2.getChildCount());
assertEquals(1, row3.getChildCount());
mListGridLayout.removeAllItems();
assertEquals(0, row1.getChildCount());
assertEquals(0, row2.getChildCount());
assertEquals(0, row2.getChildCount());
}
}