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

Commit 45641e1e authored by Cassy Chun-Crogan's avatar Cassy Chun-Crogan
Browse files

Remove Images/Videos/Audio/Documents roots on desktop

Also introduce the flag hide_roots_on_desktop to put this feature
behind. Enable this flag in ag/31625340.

Bug: 381959330
Flag: com.android.documentsui.flags.hide_roots_on_desktop
Test: atest RootsFragmentTest
Change-Id: I3c8efe177e23a20e821be97268f549fb35fe1b32
parent b25b978e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -38,6 +38,13 @@ flag {
    bug: "378011512"
}

flag {
    name: "hide_roots_on_desktop"
    namespace: "documentsui"
    description: "Enables the hiding of the Images/Videos/Audio/Documents roots on desktop."
    bug: "381959330"
}

flag {
    name: "redirect_get_content"
    namespace: "documentsui"
+8 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.documentsui.sidebar;
import static com.android.documentsui.base.Shared.compareToIgnoreCaseNullable;
import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.SharedMinimal.VERBOSE;
import static com.android.documentsui.flags.Flags.hideRootsOnDesktop;
import static com.android.documentsui.flags.Flags.useMaterial3;

import android.app.admin.DevicePolicyManager;
@@ -480,6 +481,13 @@ public class RootsFragment extends Fragment {

            if (root.isExternalStorageHome()) {
                continue;
            } else if (hideRootsOnDesktop() && context.getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_PC) && (root.isImages() || root.isVideos()
                    || root.isDocuments()
                    || root.isAudio())) {
                // Hide Images/Videos/Documents/Audio roots on desktop.
                Log.d(TAG, "Hiding " + root);
                continue;
            } else if (root.isLibrary() || root.isDownloads()) {
                item =
                        mUseRailAsContainer
+60 −6
Original line number Diff line number Diff line
@@ -24,7 +24,12 @@ import static org.mockito.Mockito.when;

import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;

import androidx.test.filters.MediumTest;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -33,6 +38,7 @@ import com.android.documentsui.TestConfigStore;
import com.android.documentsui.TestUserManagerState;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.UserId;
import com.android.documentsui.flags.Flags;
import com.android.documentsui.testing.TestEnv;
import com.android.documentsui.testing.TestProvidersAccess;
import com.android.documentsui.testing.TestResolveInfo;
@@ -41,6 +47,7 @@ import com.android.modules.utils.build.SdkLevel;
import com.google.android.collect.Lists;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -59,13 +66,14 @@ import java.util.List;
public class RootsFragmentTest {

    private Context mContext;
    private PackageManager mPackageManager;
    private DevicePolicyManager mDevicePolicyManager;
    private RootsFragment mRootsFragment;
    private TestEnv mEnv;
    private final TestConfigStore mTestConfigStore = new TestConfigStore();
    private TestUserManagerState mTestUserManagerState;

    private static final String[] EXPECTED_SORTED_RESULT = {
    private static final String[] EXPECTED_SORTED_RESULT_FOR_NON_DESKTOP = {
            TestProvidersAccess.RECENTS.title,
            TestProvidersAccess.IMAGE.title,
            TestProvidersAccess.VIDEO.title,
@@ -79,6 +87,19 @@ public class RootsFragmentTest {
            TestProvidersAccess.INSPECTOR.title,
            TestProvidersAccess.PICKLES.title};

    private static final String[] EXPECTED_SORTED_RESULT_FOR_DESKTOP = {
            TestProvidersAccess.RECENTS.title,
            TestProvidersAccess.DOWNLOADS.title,
            "" /* SpacerItem */,
            TestProvidersAccess.EXTERNALSTORAGE.title,
            TestProvidersAccess.HAMMY.title,
            "" /* SpacerItem */,
            TestProvidersAccess.INSPECTOR.title,
            TestProvidersAccess.PICKLES.title};

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    @Parameter(0)
    public boolean isPrivateSpaceEnabled;

@@ -98,12 +119,14 @@ public class RootsFragmentTest {

        mContext = mock(Context.class);
        mDevicePolicyManager = mock(DevicePolicyManager.class);
        mPackageManager = mock(PackageManager.class);
        when(mContext.getResources()).thenReturn(
                InstrumentationRegistry.getInstrumentation().getTargetContext().getResources());
        when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
                .thenReturn(mDevicePolicyManager);
        when(mContext.getApplicationContext()).thenReturn(
                InstrumentationRegistry.getInstrumentation().getTargetContext());
        when(mContext.getPackageManager()).thenReturn(mPackageManager);

        if (SdkLevel.isAtLeastS() && isPrivateSpaceEnabled) {
            mTestConfigStore.enablePrivateSpaceInPhotoPicker();
@@ -115,7 +138,38 @@ public class RootsFragmentTest {
    }

    @Test
    public void testSortLoadResult_WithCorrectOrder() {
    @RequiresFlagsDisabled({Flags.FLAG_HIDE_ROOTS_ON_DESKTOP})
    public void testSortLoadResult_WithCorrectOrder_hideRootsOnDesktopFlagDisable() {
        List<Item> items = mRootsFragment.sortLoadResult(
                mContext,
                mEnv.state,
                createFakeRootInfoList(),
                null /* excludePackage */, null /* handlerAppIntent */, new TestProvidersAccess(),
                UserId.DEFAULT_USER,
                Collections.singletonList(UserId.DEFAULT_USER),
                /* maybeShowBadge */ false, mTestUserManagerState);
        assertTrue(assertSortedResult(items, EXPECTED_SORTED_RESULT_FOR_NON_DESKTOP));
    }

    @Test
    @RequiresFlagsEnabled({Flags.FLAG_HIDE_ROOTS_ON_DESKTOP})
    public void testSortLoadResult_WithCorrectOrder_onNonDesktop() {
        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_PC)).thenReturn(false);
        List<Item> items = mRootsFragment.sortLoadResult(
                mContext,
                mEnv.state,
                createFakeRootInfoList(),
                null /* excludePackage */, null /* handlerAppIntent */, new TestProvidersAccess(),
                UserId.DEFAULT_USER,
                Collections.singletonList(UserId.DEFAULT_USER),
                /* maybeShowBadge */ false, mTestUserManagerState);
        assertTrue(assertSortedResult(items, EXPECTED_SORTED_RESULT_FOR_NON_DESKTOP));
    }

    @Test
    @RequiresFlagsEnabled({Flags.FLAG_HIDE_ROOTS_ON_DESKTOP})
    public void testSortLoadResult_WithCorrectOrder_onDesktop() {
        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_PC)).thenReturn(true);
        List<Item> items = mRootsFragment.sortLoadResult(
                mContext,
                mEnv.state,
@@ -124,7 +178,7 @@ public class RootsFragmentTest {
                UserId.DEFAULT_USER,
                Collections.singletonList(UserId.DEFAULT_USER),
                /* maybeShowBadge */ false, mTestUserManagerState);
        assertTrue(assertSortedResult(items));
        assertTrue(assertSortedResult(items, EXPECTED_SORTED_RESULT_FOR_DESKTOP));
    }

    @Test
@@ -169,13 +223,13 @@ public class RootsFragmentTest {
        assertEquals(rootList.get(2).title, TestProvidersAccess.PICKLES.title);
    }

    private boolean assertSortedResult(List<Item> items) {
    private boolean assertSortedResult(List<Item> items, String[] expectedSortedResult) {
        for (int i = 0; i < items.size(); i++) {
            Item item = items.get(i);
            if (item instanceof RootItem) {
                assertEquals(EXPECTED_SORTED_RESULT[i], ((RootItem) item).root.title);
                assertEquals(expectedSortedResult[i], ((RootItem) item).root.title);
            } else if (item instanceof SpacerItem) {
                assertTrue(EXPECTED_SORTED_RESULT[i].isEmpty());
                assertTrue(expectedSortedResult[i].isEmpty());
            } else {
                return false;
            }