summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wenbo Jie <wenbojie@google.com> 2025-03-14 06:18:23 +0000
committer Wenbo Jie <wenbojie@google.com> 2025-03-14 06:18:57 +0000
commitff7dd896e30199ff0b380dade26d46108036ee8b (patch)
tree26481e65e7333d6d4fe67aa392556c1155a896fe
parente1604abe849bae1601dd879ce2fb494702dac184 (diff)
[DocsUI] Click search chip should reset scroll view
When we have too many search chips which can't be display in one screen (e.g. on compact size screen), clicking the chip should reset the horizontal scroll view so the checked chip can be seen. Check the attached bug for the before/after comparison. Bug: 403433043 Test: m DocumentsUIGoogle && manual inspection Test: atest DocumentsUIGoogleTests:com.android.documentsui.queries.SearchChipViewManagerTest#testChipChecked_resetScroll Flag: com.android.documentsui.flags.use_material3 Change-Id: Ib0bcd7295953940215c967e021f8ca96e465d6f1
-rw-r--r--src/com/android/documentsui/queries/SearchChipViewManager.java2
-rw-r--r--tests/unit/com/android/documentsui/queries/SearchChipViewManagerTest.java35
2 files changed, 36 insertions, 1 deletions
diff --git a/src/com/android/documentsui/queries/SearchChipViewManager.java b/src/com/android/documentsui/queries/SearchChipViewManager.java
index f673b7408..12e418969 100644
--- a/src/com/android/documentsui/queries/SearchChipViewManager.java
+++ b/src/com/android/documentsui/queries/SearchChipViewManager.java
@@ -518,7 +518,7 @@ public class SearchChipViewManager {
}
// Let the first checked chip can be shown.
- View parent = (View) mChipGroup.getParent();
+ View parent = (View) mChipGroup.getParent().getParent();
if (parent instanceof HorizontalScrollView) {
final int scrollToX = isRtl ? parent.getWidth() : 0;
((HorizontalScrollView) parent).smoothScrollTo(scrollToX, 0);
diff --git a/tests/unit/com/android/documentsui/queries/SearchChipViewManagerTest.java b/tests/unit/com/android/documentsui/queries/SearchChipViewManagerTest.java
index 6d20447dd..02e24a329 100644
--- a/tests/unit/com/android/documentsui/queries/SearchChipViewManagerTest.java
+++ b/tests/unit/com/android/documentsui/queries/SearchChipViewManagerTest.java
@@ -18,6 +18,7 @@ package com.android.documentsui.queries;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.spy;
@@ -35,6 +36,9 @@ import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.DocumentsContract;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.widget.FrameLayout;
+import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -235,6 +239,37 @@ public final class SearchChipViewManagerTest {
assertThat(View.VISIBLE).isEqualTo(mirror.getVisibility());
}
+ @Test
+ public void testChipChecked_resetScroll() {
+ // Mock chip group's parent chain according to search_chip_row.xml.
+ FrameLayout parent = spy(new FrameLayout(mContext));
+ HorizontalScrollView grandparent = spy(new HorizontalScrollView(mContext));
+ parent.addView(mChipGroup);
+ grandparent.addView(parent);
+ // Verify that getParent().getParent() returns the HorizontalScrollView mock.
+ ViewParent result = mChipGroup.getParent().getParent();
+ assertEquals(grandparent, result);
+
+ mSearchChipViewManager.initChipSets(
+ new String[] {"image/*", "audio/*", "video/*", "text/*"});
+ mSearchChipViewManager.updateChips(new String[] {"*/*"});
+
+ // Manually set HorizontalScrollView's scrollX to something larger than 0.
+ grandparent.scrollTo(100, 0);
+ assertTrue(grandparent.getScaleX() > 0);
+
+ assertEquals(6, mChipGroup.getChildCount());
+ Chip lastChip = (Chip) mChipGroup.getChildAt(5);
+
+ // chip.setChecked will trigger reorder animation, which needs to be run inside
+ // the looper thread.
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+ // Check last chip will move it to the first child and reset scroll view.
+ lastChip.setChecked(true);
+ assertEquals(0, grandparent.getScrollX());
+ });
+ }
+
private static Set<SearchChipData> getFakeSearchChipDataList() {
final Set<SearchChipData> chipDataList = new HashSet<>();
chipDataList.add(new SearchChipData(CHIP_TYPE, 0 /* titleRes */, TEST_MIME_TYPES));