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

Commit 1b22dbe2 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

release-request-f2cd0207-2ed0-4e33-859f-0df0378165b1-for-git_oc-mr1-release-40...

release-request-f2cd0207-2ed0-4e33-859f-0df0378165b1-for-git_oc-mr1-release-4033857 snap-temp-L00900000066751756

Change-Id: Id43adb4c52a9e54bbf3e1cae4f6beac6f8b05e10
parents 20c38e3c 796e0990
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -231,6 +231,7 @@ public interface DragAndDropManager {

            mView = v;
            mInvalidDest = invalidDest;
            boolean containsFilesInArchive = false;

            List<Uri> uris = new ArrayList<>(srcs.size());
            for (DocumentInfo doc : srcs) {
@@ -240,6 +241,7 @@ public interface DragAndDropManager {
                        && !doc.isMoveSupported()) {
                    mMustBeCopied = true;
                }
                containsFilesInArchive |= doc.isInArchive();
            }
            mClipData = (parent == null)
                    ? mClipper.getClipDataForDocuments(uris, FileOperationService.OPERATION_UNKNOWN)
@@ -250,15 +252,17 @@ public interface DragAndDropManager {

            updateShadow(srcs, iconHelper);

            int flag = View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_OPAQUE;
            if (!containsFilesInArchive) {
                flag |= View.DRAG_FLAG_GLOBAL_URI_READ
                        | View.DRAG_FLAG_GLOBAL_URI_WRITE;
            }
            startDragAndDrop(
                    v,
                    mClipData,
                    mShadowBuilder,
                    this, // Used to detect multi-window drag and drop
                    View.DRAG_FLAG_GLOBAL
                            | View.DRAG_FLAG_OPAQUE
                            | View.DRAG_FLAG_GLOBAL_URI_READ
                            | View.DRAG_FLAG_GLOBAL_URI_WRITE);
                    flag);
        }

        private void updateShadow(List<DocumentInfo> srcs, IconHelper iconHelper) {
+10 −0
Original line number Diff line number Diff line
@@ -256,6 +256,11 @@ public class SortModel implements Parcelable {
                        ContentResolver.QUERY_ARG_SORT_COLUMNS,
                        new String[]{ Document.COLUMN_SIZE });
                break;
            case SortModel.SORT_DIMENSION_ID_FILE_TYPE:
                // Unfortunately sorting by mime type is pretty much guaranteed different from
                // sorting by user-friendly type, so there is no point to guide the provider to sort
                // in a particular order.
                return;
            default:
                throw new IllegalStateException(
                        "Unexpected sort dimension id: " + id);
@@ -302,6 +307,11 @@ public class SortModel implements Parcelable {
            case SortModel.SORT_DIMENSION_ID_SIZE:
                columnName = Document.COLUMN_SIZE;
                break;
            case SortModel.SORT_DIMENSION_ID_FILE_TYPE:
                // Unfortunately sorting by mime type is pretty much guaranteed different from
                // sorting by user-friendly type, so there is no point to guide the provider to sort
                // in a particular order.
                return null;
            default:
                throw new IllegalStateException(
                        "Unexpected sort dimension id: " + id);
+10 −5
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ class SortingCursorWrapper extends AbstractCursor {
        boolean[] isDirs = new boolean[count];
        String[] stringValues = null;
        long[] longValues = null;
        String[] ids = null;
        String[] ids = new String[count];

        final @SortDimensionId int id = dimension.getId();
        switch (id) {
@@ -57,7 +57,6 @@ class SortingCursorWrapper extends AbstractCursor {
            case SortModel.SORT_DIMENSION_ID_DATE:
            case SortModel.SORT_DIMENSION_ID_SIZE:
                longValues = new long[count];
                ids = new String[count];
                break;
        }

@@ -68,6 +67,7 @@ class SortingCursorWrapper extends AbstractCursor {

            final String mimeType = getCursorString(mCursor, Document.COLUMN_MIME_TYPE);
            isDirs[i] = Document.MIME_TYPE_DIR.equals(mimeType);
            ids[i] = getCursorString(mCursor, Document.COLUMN_DOCUMENT_ID);

            switch(id) {
                case SortModel.SORT_DIMENSION_ID_TITLE:
@@ -80,11 +80,9 @@ class SortingCursorWrapper extends AbstractCursor {
                    break;
                case SortModel.SORT_DIMENSION_ID_DATE:
                    longValues[i] = getLastModified(mCursor);
                    ids[i] = getCursorString(mCursor, Document.COLUMN_DOCUMENT_ID);
                    break;
                case SortModel.SORT_DIMENSION_ID_SIZE:
                    longValues[i] = getCursorLong(mCursor, Document.COLUMN_SIZE);
                    ids[i] = getCursorString(mCursor, Document.COLUMN_DOCUMENT_ID);
                    break;
            }

@@ -93,7 +91,7 @@ class SortingCursorWrapper extends AbstractCursor {
        switch (id) {
            case SortModel.SORT_DIMENSION_ID_TITLE:
            case SortModel.SORT_DIMENSION_ID_FILE_TYPE:
                binarySort(stringValues, isDirs, mPosition, dimension.getSortDirection());
                binarySort(stringValues, isDirs, mPosition, ids, dimension.getSortDirection());
                break;
            case SortModel.SORT_DIMENSION_ID_DATE:
            case SortModel.SORT_DIMENSION_ID_SIZE:
@@ -187,12 +185,14 @@ class SortingCursorWrapper extends AbstractCursor {
            String[] sortKey,
            boolean[] isDirs,
            int[] positions,
            String[] ids,
            @SortDimension.SortDirection int direction) {
        final int count = positions.length;
        for (int start = 1; start < count; start++) {
            final int pivotPosition = positions[start];
            final String pivotValue = sortKey[start];
            final boolean pivotIsDir = isDirs[start];
            final String pivotId = ids[start];

            int left = 0;
            int right = start;
@@ -223,6 +223,11 @@ class SortingCursorWrapper extends AbstractCursor {
                    }
                }

                // Use document ID as a tie breaker to achieve stable sort result.
                if (compare == 0) {
                    compare = pivotId.compareTo(ids[mid]);
                }

                if (compare < 0) {
                    right = mid;
                } else {
+51 −3
Original line number Diff line number Diff line
@@ -33,7 +33,12 @@ public class SortDocumentUiTest extends ActivityTest<FilesActivity> {
    private static final String FILE_2 = "doc_2";
    private static final String FILE_3 = "image_3";

    private static final String MIME_1 = "text/plain"; // Plain text
    private static final String MIME_2 = "text/html"; // HTML document
    private static final String MIME_3 = "image/jpeg"; // JPG image

    private static final String[] FILES = { FILE_1, FILE_3, FILE_2 };
    private static final String[] MIMES = { MIME_1, MIME_3, MIME_2 };
    private static final String[] DIRS = { DIR_1, DIR_2 };

    private static final String[] DIRS_IN_NAME_ASC = { DIR_2, DIR_1 };
@@ -47,6 +52,9 @@ public class SortDocumentUiTest extends ActivityTest<FilesActivity> {
    private static final String[] DIRS_IN_MODIFIED_DESC = reverse(DIRS);
    private static final String[] FILES_IN_MODIFIED_DESC = reverse(FILES);

    private static final String[] FILES_IN_TYPE_ASC = { FILE_2, FILE_3, FILE_1 };
    private static final String[] FILES_IN_TYPE_DESC = reverse(FILES_IN_TYPE_ASC);

    public SortDocumentUiTest() {
        super(FilesActivity.class);
    }
@@ -67,9 +75,9 @@ public class SortDocumentUiTest extends ActivityTest<FilesActivity> {
     * @param sleep time to sleep in ms
     */
    private void initFiles(long sleep) throws Exception {
        for (String file : FILES) {
            Uri uri = mDocsHelper.createDocument(rootDir0, "text/plain", file);
            mDocsHelper.writeDocument(uri, file.getBytes());
        for (int i = 0; i < FILES.length; ++i) {
            Uri uri = mDocsHelper.createDocument(rootDir0, MIMES[i], FILES[i]);
            mDocsHelper.writeDocument(uri, FILES[i].getBytes());

            Thread.sleep(sleep);
        }
@@ -136,6 +144,26 @@ public class SortDocumentUiTest extends ActivityTest<FilesActivity> {
        bots.directory.assertOrder(DIRS_IN_MODIFIED_DESC, FILES_IN_MODIFIED_DESC);
    }

    public void testSortByType_Ascending_listMode() throws Exception {
        initFiles();

        bots.main.switchToListMode();

        bots.sortHeader.sortBy(
                SortModel.SORT_DIMENSION_ID_FILE_TYPE, SortDimension.SORT_DIRECTION_ASCENDING);
        bots.directory.assertOrder(DIRS_IN_NAME_ASC, FILES_IN_TYPE_ASC);
    }

    public void testSortByType_Descending_listMode() throws Exception {
        initFiles();

        bots.main.switchToListMode();

        bots.sortHeader.sortBy(
                SortModel.SORT_DIMENSION_ID_FILE_TYPE, SortDimension.SORT_DIRECTION_DESCENDING);
        bots.directory.assertOrder(DIRS_IN_NAME_ASC, FILES_IN_TYPE_DESC);
    }

    public void testSortByName_Descending_gridMode() throws Exception {
        initFiles();

@@ -186,6 +214,26 @@ public class SortDocumentUiTest extends ActivityTest<FilesActivity> {
        bots.directory.assertOrder(DIRS_IN_MODIFIED_DESC, FILES_IN_MODIFIED_DESC);
    }

    public void testSortByType_Ascending_gridMode() throws Exception {
        initFiles();

        bots.main.switchToGridMode();

        bots.sortHeader.sortBy(
                SortModel.SORT_DIMENSION_ID_FILE_TYPE, SortDimension.SORT_DIRECTION_ASCENDING);
        bots.directory.assertOrder(DIRS_IN_NAME_ASC, FILES_IN_TYPE_ASC);
    }

    public void testSortByType_Descending_gridMode() throws Exception {
        initFiles();

        bots.main.switchToGridMode();

        bots.sortHeader.sortBy(
                SortModel.SORT_DIMENSION_ID_FILE_TYPE, SortDimension.SORT_DIRECTION_DESCENDING);
        bots.directory.assertOrder(DIRS_IN_NAME_ASC, FILES_IN_TYPE_DESC);
    }

    private static String[] reverse(String[] array) {
        String[] ret = new String[array.length];

+16 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ public class DragAndDropManagerTests {

    private TestEventListener<ClipData> mStartDragListener;
    private TestEventListener<Void> mShadowUpdateListener;
    private TestEventListener<Integer> mFlagListener;

    private TestEventListener<Integer> mCallbackListener;
    private FileOperations.Callback mCallback = new FileOperations.Callback() {
@@ -115,6 +116,7 @@ public class DragAndDropManagerTests {
        mStartDragListener = new TestEventListener<>();
        mShadowUpdateListener = new TestEventListener<>();
        mCallbackListener = new TestEventListener<>();
        mFlagListener = new TestEventListener<>();

        mManager = new RuntimeDragAndDropManager(mActivity, mClipper, mShadowBuilder,
                mDefaultIcon) {
@@ -125,6 +127,7 @@ public class DragAndDropManagerTests {
                assertSame(mShadowBuilder, builder);
                assertNotNull(localState);

                mFlagListener.accept(flag);
                mStartDragListener.accept(clipData);
            }

@@ -209,6 +212,19 @@ public class DragAndDropManagerTests {
        assertFalse(mManager.canSpringOpen(TestProvidersAccess.HAMMY, TestEnv.FOLDER_2));
    }

    @Test
    public void testInArchiveUris_HasCorrectFlagPermission() {
        mManager.startDrag(
                mStartDragView,
                Arrays.asList(TestEnv.FILE_IN_ARCHIVE),
                TestProvidersAccess.HOME,
                Arrays.asList(TestEnv.FILE_ARCHIVE.derivedUri, TestEnv.FILE_IN_ARCHIVE.derivedUri),
                mIconHelper,
                TestEnv.FILE_ARCHIVE);

        mFlagListener.assertLastArgument(View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_OPAQUE);
    }

    @Test
    public void testCanSpringOpen_ReturnsFalse_DocIsInvalidDestination() {
        mManager.startDrag(
Loading