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.sidebar; 18 19 import static junit.framework.Assert.assertTrue; 20 21 import static org.junit.Assert.assertEquals; 22 import static org.mockito.Mockito.mock; 23 import static org.mockito.Mockito.when; 24 25 import android.app.admin.DevicePolicyManager; 26 import android.content.Context; 27 import android.content.pm.PackageManager; 28 import android.content.pm.ResolveInfo; 29 import android.platform.test.annotations.RequiresFlagsDisabled; 30 import android.platform.test.annotations.RequiresFlagsEnabled; 31 import android.platform.test.flag.junit.CheckFlagsRule; 32 import android.platform.test.flag.junit.DeviceFlagsValueProvider; 33 34 import androidx.test.filters.MediumTest; 35 import androidx.test.platform.app.InstrumentationRegistry; 36 37 import com.android.documentsui.TestConfigStore; 38 import com.android.documentsui.TestUserManagerState; 39 import com.android.documentsui.base.RootInfo; 40 import com.android.documentsui.base.UserId; 41 import com.android.documentsui.flags.Flags; 42 import com.android.documentsui.testing.TestEnv; 43 import com.android.documentsui.testing.TestProvidersAccess; 44 import com.android.documentsui.testing.TestResolveInfo; 45 import com.android.modules.utils.build.SdkLevel; 46 47 import com.google.android.collect.Lists; 48 49 import org.junit.Before; 50 import org.junit.Rule; 51 import org.junit.Test; 52 import org.junit.runner.RunWith; 53 import org.junit.runners.Parameterized; 54 import org.junit.runners.Parameterized.Parameter; 55 import org.junit.runners.Parameterized.Parameters; 56 57 import java.util.ArrayList; 58 import java.util.Collections; 59 import java.util.List; 60 61 /** 62 * A unit test for RootsFragment. 63 */ 64 @RunWith(Parameterized.class) 65 @MediumTest 66 public class RootsFragmentTest { 67 68 private Context mContext; 69 private PackageManager mPackageManager; 70 private DevicePolicyManager mDevicePolicyManager; 71 private RootsFragment mRootsFragment; 72 private TestEnv mEnv; 73 private final TestConfigStore mTestConfigStore = new TestConfigStore(); 74 private TestUserManagerState mTestUserManagerState; 75 76 private static final String[] EXPECTED_SORTED_RESULT_FOR_NON_DESKTOP = { 77 TestProvidersAccess.RECENTS.title, 78 TestProvidersAccess.IMAGE.title, 79 TestProvidersAccess.VIDEO.title, 80 TestProvidersAccess.AUDIO.title, 81 TestProvidersAccess.DOCUMENT.title, 82 TestProvidersAccess.DOWNLOADS.title, 83 "" /* SpacerItem */, 84 TestProvidersAccess.EXTERNALSTORAGE.title, 85 TestProvidersAccess.HAMMY.title, 86 "" /* SpacerItem */, 87 TestProvidersAccess.INSPECTOR.title, 88 TestProvidersAccess.PICKLES.title}; 89 90 private static final String[] EXPECTED_SORTED_RESULT_FOR_DESKTOP = { 91 TestProvidersAccess.RECENTS.title, 92 TestProvidersAccess.DOWNLOADS.title, 93 "" /* SpacerItem */, 94 TestProvidersAccess.EXTERNALSTORAGE.title, 95 TestProvidersAccess.HAMMY.title, 96 "" /* SpacerItem */, 97 TestProvidersAccess.INSPECTOR.title, 98 TestProvidersAccess.PICKLES.title}; 99 100 @Rule 101 public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); 102 103 @Parameter(0) 104 public boolean isPrivateSpaceEnabled; 105 106 /** 107 * Parametrize values for {@code isPrivateSpaceEnabled} to run all the tests twice once with 108 * private space flag enabled and once with it disabled. 109 */ 110 @Parameters(name = "privateSpaceEnabled={0}") data()111 public static Iterable<?> data() { 112 return Lists.newArrayList(true, false); 113 } 114 115 @Before setUp()116 public void setUp() { 117 mEnv = TestEnv.create(); 118 mEnv.state.configStore = mTestConfigStore; 119 120 mContext = mock(Context.class); 121 mDevicePolicyManager = mock(DevicePolicyManager.class); 122 mPackageManager = mock(PackageManager.class); 123 when(mContext.getResources()).thenReturn( 124 InstrumentationRegistry.getInstrumentation().getTargetContext().getResources()); 125 when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)) 126 .thenReturn(mDevicePolicyManager); 127 when(mContext.getApplicationContext()).thenReturn( 128 InstrumentationRegistry.getInstrumentation().getTargetContext()); 129 when(mContext.getPackageManager()).thenReturn(mPackageManager); 130 131 if (SdkLevel.isAtLeastS() && isPrivateSpaceEnabled) { 132 mTestConfigStore.enablePrivateSpaceInPhotoPicker(); 133 mTestUserManagerState = new TestUserManagerState(); 134 mTestUserManagerState.canFrowardToProfileIdMap.put(UserId.DEFAULT_USER, true); 135 } 136 isPrivateSpaceEnabled = SdkLevel.isAtLeastS() && isPrivateSpaceEnabled; 137 mRootsFragment = new RootsFragment(); 138 } 139 140 @Test 141 @RequiresFlagsDisabled({Flags.FLAG_HIDE_ROOTS_ON_DESKTOP_RO}) testSortLoadResult_WithCorrectOrder_hideRootsOnDesktopFlagDisable()142 public void testSortLoadResult_WithCorrectOrder_hideRootsOnDesktopFlagDisable() { 143 List<Item> items = mRootsFragment.sortLoadResult( 144 mContext, 145 mEnv.state, 146 createFakeRootInfoList(), 147 null /* excludePackage */, null /* handlerAppIntent */, new TestProvidersAccess(), 148 UserId.DEFAULT_USER, 149 Collections.singletonList(UserId.DEFAULT_USER), 150 /* maybeShowBadge */ false, mTestUserManagerState); 151 assertTrue(assertSortedResult(items, EXPECTED_SORTED_RESULT_FOR_NON_DESKTOP)); 152 } 153 154 @Test 155 @RequiresFlagsEnabled({Flags.FLAG_HIDE_ROOTS_ON_DESKTOP_RO}) testSortLoadResult_WithCorrectOrder_onNonDesktop()156 public void testSortLoadResult_WithCorrectOrder_onNonDesktop() { 157 when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_PC)).thenReturn(false); 158 List<Item> items = mRootsFragment.sortLoadResult( 159 mContext, 160 mEnv.state, 161 createFakeRootInfoList(), 162 null /* excludePackage */, null /* handlerAppIntent */, new TestProvidersAccess(), 163 UserId.DEFAULT_USER, 164 Collections.singletonList(UserId.DEFAULT_USER), 165 /* maybeShowBadge */ false, mTestUserManagerState); 166 assertTrue(assertSortedResult(items, EXPECTED_SORTED_RESULT_FOR_NON_DESKTOP)); 167 } 168 169 @Test 170 @RequiresFlagsEnabled({Flags.FLAG_HIDE_ROOTS_ON_DESKTOP_RO}) testSortLoadResult_WithCorrectOrder_onDesktop()171 public void testSortLoadResult_WithCorrectOrder_onDesktop() { 172 when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_PC)).thenReturn(true); 173 List<Item> items = mRootsFragment.sortLoadResult( 174 mContext, 175 mEnv.state, 176 createFakeRootInfoList(), 177 null /* excludePackage */, null /* handlerAppIntent */, new TestProvidersAccess(), 178 UserId.DEFAULT_USER, 179 Collections.singletonList(UserId.DEFAULT_USER), 180 /* maybeShowBadge */ false, mTestUserManagerState); 181 assertTrue(assertSortedResult(items, EXPECTED_SORTED_RESULT_FOR_DESKTOP)); 182 } 183 184 @Test testItemComparator_WithCorrectOrder()185 public void testItemComparator_WithCorrectOrder() { 186 final String testPackageName = "com.test1"; 187 final String errorTestPackageName = "com.test2"; 188 final RootsFragment.ItemComparator comp = new RootsFragment.ItemComparator(testPackageName); 189 final List<Item> rootList = new ArrayList<>(); 190 rootList.add(new RootItem(TestProvidersAccess.HAMMY, null /* actionHandler */, 191 errorTestPackageName, /* maybeShowBadge= */ false)); 192 rootList.add(new RootItem(TestProvidersAccess.INSPECTOR, null /* actionHandler */, 193 errorTestPackageName, /* maybeShowBadge= */ false)); 194 rootList.add(new RootItem(TestProvidersAccess.PICKLES, null /* actionHandler */, 195 testPackageName, /* maybeShowBadge= */ false)); 196 Collections.sort(rootList, comp); 197 198 assertEquals(rootList.get(0).title, TestProvidersAccess.PICKLES.title); 199 assertEquals(rootList.get(1).title, TestProvidersAccess.HAMMY.title); 200 assertEquals(rootList.get(2).title, TestProvidersAccess.INSPECTOR.title); 201 } 202 203 @Test testItemComparator_differentItemTypes_WithCorrectOrder()204 public void testItemComparator_differentItemTypes_WithCorrectOrder() { 205 final String testPackageName = "com.test1"; 206 final RootsFragment.ItemComparator comp = new RootsFragment.ItemComparator(testPackageName); 207 final List<Item> rootList = new ArrayList<>(); 208 rootList.add(new RootItem(TestProvidersAccess.HAMMY, null /* actionHandler */, 209 testPackageName, /* maybeShowBadge= */ false)); 210 211 final ResolveInfo info = TestResolveInfo.create(); 212 info.activityInfo.packageName = testPackageName; 213 214 rootList.add(new AppItem(info, TestProvidersAccess.PICKLES.title, UserId.DEFAULT_USER, 215 null /* actionHandler */)); 216 rootList.add(new RootAndAppItem(TestProvidersAccess.INSPECTOR, info, 217 null /* actionHandler */, /* maybeShowBadge= */ false)); 218 219 Collections.sort(rootList, comp); 220 221 assertEquals(rootList.get(0).title, TestProvidersAccess.HAMMY.title); 222 assertEquals(rootList.get(1).title, TestProvidersAccess.INSPECTOR.title); 223 assertEquals(rootList.get(2).title, TestProvidersAccess.PICKLES.title); 224 } 225 assertSortedResult(List<Item> items, String[] expectedSortedResult)226 private boolean assertSortedResult(List<Item> items, String[] expectedSortedResult) { 227 for (int i = 0; i < items.size(); i++) { 228 Item item = items.get(i); 229 if (item instanceof RootItem) { 230 assertEquals(expectedSortedResult[i], ((RootItem) item).root.title); 231 } else if (item instanceof SpacerItem) { 232 assertTrue(expectedSortedResult[i].isEmpty()); 233 } else { 234 return false; 235 } 236 } 237 return true; 238 } 239 createFakeRootInfoList()240 private List<RootInfo> createFakeRootInfoList() { 241 final List<RootInfo> fakeRootInfoList = new ArrayList<>(); 242 fakeRootInfoList.add(TestProvidersAccess.PICKLES); 243 fakeRootInfoList.add(TestProvidersAccess.HAMMY); 244 fakeRootInfoList.add(TestProvidersAccess.INSPECTOR); 245 fakeRootInfoList.add(TestProvidersAccess.DOWNLOADS); 246 fakeRootInfoList.add(TestProvidersAccess.AUDIO); 247 fakeRootInfoList.add(TestProvidersAccess.VIDEO); 248 fakeRootInfoList.add(TestProvidersAccess.RECENTS); 249 fakeRootInfoList.add(TestProvidersAccess.IMAGE); 250 fakeRootInfoList.add(TestProvidersAccess.EXTERNALSTORAGE); 251 fakeRootInfoList.add(TestProvidersAccess.DOCUMENT); 252 return fakeRootInfoList; 253 } 254 } 255