From fcb633f98763b57457da158b78e9dafc873ae4c7 Mon Sep 17 00:00:00 2001 From: Aaron Heuckroth Date: Thu, 18 Apr 2019 14:23:48 -0400 Subject: [PATCH] Add unit tests to ListGridLayout. Test: Automated tests pass. Fixes: 130809323 Change-Id: Ib4193536e437b9ec406690ea648ac78d2eac185c --- .../GlobalActionsGridLayout.java | 1 + .../globalactions/ListGridLayout.java | 64 +++-- .../globalactions/ListGridLayoutTest.java | 271 ++++++++++++++++++ 3 files changed, 310 insertions(+), 26 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/systemui/globalactions/ListGridLayoutTest.java diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java index e7878c69873ca..669348e4b4812 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsGridLayout.java @@ -117,6 +117,7 @@ public class GlobalActionsGridLayout extends MultiListLayout { } else { parent.addView(v); } + parent.setVisibility(View.VISIBLE); } updateSnapPosition(); updateSeparatedButtonSize(); diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java index 9c71ffc0e73bc..6bc975a9dc621 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/ListGridLayout.java @@ -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]; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/ListGridLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/ListGridLayoutTest.java new file mode 100644 index 0000000000000..26f1de857302e --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/ListGridLayoutTest.java @@ -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()); + } +}