Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78171b3c authored by Ivan Chiang's avatar Ivan Chiang
Browse files

Chip should be filtered by specific mime types from intent

Add initChipSets method and filter the chip sets.

Test: atest DocumentsUITests
Change-Id: Iba731fd08a37d9eb034e69e40ac87477d05b0ed4
Fix: 123000263
parent 8f12b3b8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -199,6 +199,9 @@ public abstract class BaseActivity
        ViewGroup chipGroup = findViewById(R.id.search_chip_group);
        mSearchManager = new SearchViewManager(searchListener, queryInterceptor,
                chipGroup, icicle);
        // initialize the chip sets by accept mime types
        mSearchManager.initChipSets(mState.acceptMimes);
        // update the chip items by the mime types of the root
        mSearchManager.updateChips(getCurrentRoot().derivedMimeTypes);
        // parse the query content from intent when launch the
        // activity at the first time
+19 −1
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ public class SearchChipViewManager {
    private static final Map<Integer, SearchChipData> sChipItems = new HashMap<>();

    private final ViewGroup mChipGroup;
    private final List<Integer> mDefaultChipTypes = new ArrayList<>();
    private SearchChipViewManagerListener mListener;

    @VisibleForTesting
@@ -171,6 +172,22 @@ public class SearchChipViewManager {
        }
    }

    /**
     * Initialize the search chips base on the mime types.
     *
     * @param acceptMimeTypes use this values to filter chips
     */
    public void initChipSets(String[] acceptMimeTypes) {
        mDefaultChipTypes.clear();
        for (SearchChipData chipData : sChipItems.values()) {
            final String[] mimeTypes = chipData.getMimeTypes();
            final boolean isMatched = MimeTypes.mimeMatches(acceptMimeTypes, mimeTypes);
            if (isMatched) {
                mDefaultChipTypes.add(chipData.getChipType());
            }
        }
    }

    /**
     * Update the search chips base on the mime types.
     *
@@ -181,7 +198,8 @@ public class SearchChipViewManager {
        mChipGroup.removeAllViews();

        final LayoutInflater inflater = LayoutInflater.from(context);
        for (SearchChipData chipData : sChipItems.values()) {
        for (Integer chipType : mDefaultChipTypes) {
            final SearchChipData chipData = sChipItems.get(chipType);
            final String[] mimeTypes = chipData.getMimeTypes();
            final boolean isMatched = MimeTypes.mimeMatches(acceptMimeTypes, mimeTypes);
            if (isMatched) {
+9 −0
Original line number Diff line number Diff line
@@ -164,6 +164,15 @@ public class SearchViewManager implements
        return queryArgs;
    }

    /**
     * Initialize the search chips base on the acceptMimeTypes.
     *
     * @param acceptMimeTypes use to filter chips
     */
    public void initChipSets(String[] acceptMimeTypes) {
        mChipViewManager.initChipSets(acceptMimeTypes);
    }

    /**
     * Update the search chips base on the acceptMimeTypes.
     * If the count of matched chips is less than two, we will
+39 −14
Original line number Diff line number Diff line
@@ -16,15 +16,16 @@

package com.android.documentsui.queries;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;

import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;

import com.android.documentsui.base.MimeTypes;
@@ -42,49 +43,73 @@ import java.util.Set;
@SmallTest
public final class SearchChipViewManagerTest {

    private static final String[] TEST_MIMETYPES = new String[]{"image/png", "video/mpeg"};
    private static final String[] TEST_MIME_TYPES = new String[]{"image/*", "video/*"};
    private static int CHIP_TYPE = 1000;

    private SearchChipViewManager mSearchChipViewManager;
    private LinearLayout mChipGroup;

    @Before
    public void setUp() {
        ViewGroup chipGroup = mock(ViewGroup.class);
        mSearchChipViewManager = new SearchChipViewManager(chipGroup);
        final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
        context.setTheme(com.android.documentsui.R.style.DocumentsTheme);
        mChipGroup = spy(new LinearLayout(context));
        mSearchChipViewManager = new SearchChipViewManager(mChipGroup);
        mSearchChipViewManager.initChipSets(new String[] {"*/*"});
    }

    @Test
    public void testInitChipSets_HasCorrectValue() throws Exception {
        mSearchChipViewManager.initChipSets(TEST_MIME_TYPES);
        mSearchChipViewManager.updateChips(new String[] {"*/*"});

        assertThat(mChipGroup.getChildCount()).isEqualTo(TEST_MIME_TYPES.length);
    }

    @Test
    public void testUpdateChips_HasCorrectValue() throws Exception {
        mSearchChipViewManager.updateChips(TEST_MIME_TYPES);

        assertThat(mChipGroup.getChildCount()).isEqualTo(TEST_MIME_TYPES.length);
    }

    @Test
    public void testGetCheckedChipMimeTypes_HasCorrectValue() throws Exception {
        mSearchChipViewManager.mCheckedChipItems = getFakeSearchChipDataList();

        final String[] checkedMimeTypes = mSearchChipViewManager.getCheckedMimeTypes();
        assertTrue(MimeTypes.mimeMatches(TEST_MIMETYPES, checkedMimeTypes[0]));
        assertTrue(MimeTypes.mimeMatches(TEST_MIMETYPES, checkedMimeTypes[1]));

        assertThat(MimeTypes.mimeMatches(TEST_MIME_TYPES, checkedMimeTypes[0])).isTrue();
        assertThat(MimeTypes.mimeMatches(TEST_MIME_TYPES, checkedMimeTypes[1])).isTrue();
    }

    @Test
    public void testRestoreCheckedChipItems_HasCorrectValue() throws Exception {
        Bundle bundle = new Bundle();
        bundle.putIntArray(Shared.EXTRA_QUERY_CHIPS, new int[]{2});

        mSearchChipViewManager.restoreCheckedChipItems(bundle);

        assertEquals(1, mSearchChipViewManager.mCheckedChipItems.size());
        assertThat(mSearchChipViewManager.mCheckedChipItems.size()).isEqualTo(1);
        Iterator<SearchChipData> iterator = mSearchChipViewManager.mCheckedChipItems.iterator();
        assertEquals(2, iterator.next().getChipType());
        assertThat(iterator.next().getChipType()).isEqualTo(2);
    }

    @Test
    public void testSaveInstanceState_HasCorrectValue() throws Exception {
        mSearchChipViewManager.mCheckedChipItems = getFakeSearchChipDataList();
        Bundle bundle = new Bundle();

        mSearchChipViewManager.onSaveInstanceState(bundle);

        final int[] chipTypes = bundle.getIntArray(Shared.EXTRA_QUERY_CHIPS);
        assertEquals(1, chipTypes.length);
        assertEquals(CHIP_TYPE, chipTypes[0]);
        assertThat(chipTypes.length).isEqualTo(1);
        assertThat(chipTypes[0]).isEqualTo(CHIP_TYPE);
    }

    private static Set<SearchChipData> getFakeSearchChipDataList() {
        final Set<SearchChipData> chipDataList = new HashSet<>();
        chipDataList.add(new SearchChipData(CHIP_TYPE, 0, TEST_MIMETYPES));
        chipDataList.add(new SearchChipData(CHIP_TYPE, 0, TEST_MIME_TYPES));
        return chipDataList;
    }
}