1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.documentsui.queries;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.Mockito.spy;
22 
23 import android.content.Context;
24 import android.os.Bundle;
25 import android.provider.DocumentsContract;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.LinearLayout;
29 
30 import androidx.test.filters.SmallTest;
31 import androidx.test.platform.app.InstrumentationRegistry;
32 import androidx.test.runner.AndroidJUnit4;
33 
34 import com.android.documentsui.R;
35 import com.android.documentsui.base.MimeTypes;
36 import com.android.documentsui.base.Shared;
37 import com.android.documentsui.util.VersionUtils;
38 
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.junit.runner.RunWith;
42 
43 import java.util.HashSet;
44 import java.util.Iterator;
45 import java.util.Set;
46 
47 @RunWith(AndroidJUnit4.class)
48 @SmallTest
49 public final class SearchChipViewManagerTest {
50 
51     private static final String LARGE_FILES_CHIP_MIME_TYPE = "";
52     private static final String FROM_THIS_WEEK_CHIP_MIME_TYPE = "";
53     private static final String[] TEST_MIME_TYPES_INCLUDING_DOCUMENT =
54             new String[]{"image/*", "video/*", "text/*"};
55     private static final String[] TEST_MIME_TYPES =
56             new String[]{"image/*", "video/*"};
57     private static final String[] TEST_OTHER_TYPES =
58             new String[]{LARGE_FILES_CHIP_MIME_TYPE, FROM_THIS_WEEK_CHIP_MIME_TYPE};
59     private static int CHIP_TYPE = 1000;
60 
61     private Context mContext;
62     private SearchChipViewManager mSearchChipViewManager;
63     private LinearLayout mChipGroup;
64 
65     @Before
setUp()66     public void setUp() {
67         mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
68         mContext.setTheme(com.android.documentsui.R.style.DocumentsTheme);
69         mContext.getTheme().applyStyle(R.style.DocumentsDefaultTheme, false);
70         mChipGroup = spy(new LinearLayout(mContext));
71 
72         mSearchChipViewManager = new SearchChipViewManager(mChipGroup);
73         mSearchChipViewManager.initChipSets(new String[] {"*/*"});
74     }
75 
76     @Test
testInitChipSets_hasCorrectChipCount()77     public void testInitChipSets_hasCorrectChipCount() throws Exception {
78         mSearchChipViewManager.initChipSets(TEST_MIME_TYPES);
79         mSearchChipViewManager.updateChips(new String[] {"*/*"});
80 
81         int totalChipLength = TEST_MIME_TYPES.length + TEST_OTHER_TYPES.length;
82         assertThat(mChipGroup.getChildCount()).isEqualTo(totalChipLength);
83     }
84 
85     @Test
testUpdateChips_hasCorrectChipCount()86     public void testUpdateChips_hasCorrectChipCount() throws Exception {
87         mSearchChipViewManager.updateChips(TEST_MIME_TYPES);
88 
89         int totalChipLength = TEST_MIME_TYPES.length + TEST_OTHER_TYPES.length;
90         assertThat(mChipGroup.getChildCount()).isEqualTo(totalChipLength);
91     }
92 
93     @Test
testUpdateChips_documentsFilterOnlyAvailableAboveR()94     public void testUpdateChips_documentsFilterOnlyAvailableAboveR() throws Exception {
95         mSearchChipViewManager.updateChips(TEST_MIME_TYPES_INCLUDING_DOCUMENT);
96 
97         int totalChipLength = TEST_MIME_TYPES_INCLUDING_DOCUMENT.length + TEST_OTHER_TYPES.length;
98         if (VersionUtils.isAtLeastR()) {
99             assertThat(mChipGroup.getChildCount()).isEqualTo(totalChipLength);
100         } else {
101             assertThat(mChipGroup.getChildCount()).isEqualTo(totalChipLength - 1);
102         }
103     }
104 
105     @Test
testUpdateChips_withSingleMimeType_hasCorrectChipCount()106     public void testUpdateChips_withSingleMimeType_hasCorrectChipCount() throws Exception {
107         mSearchChipViewManager.updateChips(new String[]{"image/*"});
108 
109         assertThat(mChipGroup.getChildCount()).isEqualTo(TEST_OTHER_TYPES.length);
110     }
111 
112     @Test
testGetCheckedChipMimeTypes_hasCorrectValue()113     public void testGetCheckedChipMimeTypes_hasCorrectValue() throws Exception {
114         mSearchChipViewManager.mCheckedChipItems = getFakeSearchChipDataList();
115 
116         String[] checkedMimeTypes =
117                 mSearchChipViewManager.getCheckedChipQueryArgs()
118                         .getStringArray(DocumentsContract.QUERY_ARG_MIME_TYPES);
119 
120         assertThat(MimeTypes.mimeMatches(TEST_MIME_TYPES, checkedMimeTypes[0])).isTrue();
121         assertThat(MimeTypes.mimeMatches(TEST_MIME_TYPES, checkedMimeTypes[1])).isTrue();
122     }
123 
124     @Test
testRestoreCheckedChipItems_hasCorrectValue()125     public void testRestoreCheckedChipItems_hasCorrectValue() throws Exception {
126         Bundle bundle = new Bundle();
127         bundle.putIntArray(Shared.EXTRA_QUERY_CHIPS, new int[]{2});
128 
129         mSearchChipViewManager.restoreCheckedChipItems(bundle);
130 
131         assertThat(mSearchChipViewManager.mCheckedChipItems.size()).isEqualTo(1);
132         Iterator<SearchChipData> iterator = mSearchChipViewManager.mCheckedChipItems.iterator();
133         assertThat(iterator.next().getChipType()).isEqualTo(2);
134     }
135 
136     @Test
testSaveInstanceState_hasCorrectValue()137     public void testSaveInstanceState_hasCorrectValue() throws Exception {
138         mSearchChipViewManager.mCheckedChipItems = getFakeSearchChipDataList();
139         Bundle bundle = new Bundle();
140 
141         mSearchChipViewManager.onSaveInstanceState(bundle);
142 
143         final int[] chipTypes = bundle.getIntArray(Shared.EXTRA_QUERY_CHIPS);
144         assertThat(chipTypes.length).isEqualTo(1);
145         assertThat(chipTypes[0]).isEqualTo(CHIP_TYPE);
146     }
147 
148     @Test
testBindMirrorGroup_sameValue()149     public void testBindMirrorGroup_sameValue() throws Exception {
150         mSearchChipViewManager.updateChips(new String[] {"*/*"});
151 
152         ViewGroup mirror = spy(new LinearLayout(mContext));
153         mSearchChipViewManager.bindMirrorGroup(mirror);
154 
155         assertThat(View.VISIBLE).isEqualTo(mirror.getVisibility());
156         assertThat(mChipGroup.getChildCount()).isEqualTo(mirror.getChildCount());
157         assertThat(mChipGroup.getChildAt(0).getTag()).isEqualTo(mirror.getChildAt(0).getTag());
158     }
159 
160     @Test
testBindMirrorGroup_showRow()161     public void testBindMirrorGroup_showRow() throws Exception {
162         mSearchChipViewManager.updateChips(new String[] {"image/*"});
163 
164         ViewGroup mirror = spy(new LinearLayout(mContext));
165         mSearchChipViewManager.bindMirrorGroup(mirror);
166 
167         assertThat(View.VISIBLE).isEqualTo(mirror.getVisibility());
168     }
169 
getFakeSearchChipDataList()170     private static Set<SearchChipData> getFakeSearchChipDataList() {
171         final Set<SearchChipData> chipDataList = new HashSet<>();
172         chipDataList.add(new SearchChipData(CHIP_TYPE, 0 /* titleRes */, TEST_MIME_TYPES));
173         return chipDataList;
174     }
175 }
176