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

Commit 03a3a39d authored by Garfield Tan's avatar Garfield Tan
Browse files

Make srcParent for move/delete nullable.

Add 3 unit tests to cover these cases.

Test: It stopped crashing. New tests pass.

Bug: 33540755
Change-Id: I0c80ff1b0aa25cc218b4a0538a11189d36d6826b
parent 70c4d5a1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -736,10 +736,10 @@ public class DirectoryFragment extends Fragment
            throw new RuntimeException("Failed to create uri supplier.", e);
        }

        Uri srcParent = mState.stack.peek().derivedUri;
        final DocumentInfo parent = mState.stack.peek();
        mLocalState.mPendingOperation = new FileOperation.Builder()
                .withOpType(mode)
                .withSrcParent(srcParent)
                .withSrcParent(parent == null ? null : parent.derivedUri)
                .withSrcs(srcs)
                .build();

+2 −3
Original line number Diff line number Diff line
@@ -244,8 +244,7 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa
            return;
        }

        final DocumentInfo srcParent = mState.stack.peek();
        assert(srcParent != null);
        final @Nullable DocumentInfo srcParent = mState.stack.peek();

        // Model must be accessed in UI thread, since underlying cursor is not threadsafe.
        List<DocumentInfo> docs = mScope.model.getDocuments(selection);
@@ -272,7 +271,7 @@ public class ActionHandler<T extends Activity & Addons> extends AbstractActionHa
                    .withOpType(FileOperationService.OPERATION_DELETE)
                    .withDestination(mState.stack)
                    .withSrcs(srcs)
                    .withSrcParent(srcParent.derivedUri)
                    .withSrcParent(srcParent == null ? null : srcParent.derivedUri)
                    .build();

            FileOperations.start(mActivity, operation, mDialogs::showFileOperationStatus);
+9 −5
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.documentsui.R;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.DocumentStack;

import javax.annotation.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -40,9 +41,9 @@ final class DeleteJob extends Job {

    private static final String TAG = "DeleteJob";

    private volatile int mDocsProcessed = 0;
    private final Uri mSrcParent;

    Uri mSrcParent;
    private volatile int mDocsProcessed = 0;
    /**
     * Moves files to a destination identified by {@code destination}.
     * Performs most work by delegating to CopyJob, then deleting
@@ -50,8 +51,8 @@ final class DeleteJob extends Job {
     *
     * @see @link {@link Job} constructor for most param descriptions.
     */
    DeleteJob(Context service, Listener listener, String id, Uri srcParent, DocumentStack stack,
            UrisSupplier srcs) {
    DeleteJob(Context service, Listener listener, String id, DocumentStack stack,
            UrisSupplier srcs, @Nullable Uri srcParent) {
        super(service, listener, id, OPERATION_DELETE, stack, srcs);
        mSrcParent = srcParent;
    }
@@ -100,7 +101,10 @@ final class DeleteJob extends Job {
            final Iterable<Uri> uris = this.srcs.getUris(appContext);

            final ContentResolver resolver = appContext.getContentResolver();
            final DocumentInfo srcParent = DocumentInfo.fromUri(resolver, mSrcParent);
            final DocumentInfo srcParent =
                mSrcParent != null
                    ? DocumentInfo.fromUri(resolver, mSrcParent)
                    : null;
            for (Uri uri : uris) {
                DocumentInfo doc = DocumentInfo.fromUri(resolver, uri);
                srcs.add(doc);
+9 −8
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import com.android.documentsui.base.DocumentStack;
import com.android.documentsui.clipping.UrisSupplier;
import com.android.documentsui.services.FileOperationService.OpType;

import javax.annotation.Nullable;

/**
 * FileOperation describes a file operation, such as move/copy/delete etc.
 */
@@ -136,13 +138,12 @@ public abstract class FileOperation implements Parcelable {
    }

    public static class MoveDeleteOperation extends FileOperation {
        private final Uri mSrcParent;
        private final @Nullable Uri mSrcParent;

        private MoveDeleteOperation(
                @OpType int opType, UrisSupplier srcs, Uri srcParent, DocumentStack destination) {
        private MoveDeleteOperation(@OpType int opType, UrisSupplier srcs,
                DocumentStack destination, @Nullable Uri srcParent) {
            super(opType, srcs, destination);

            assert(srcParent != null);
            mSrcParent = srcParent;
        }

@@ -151,10 +152,10 @@ public abstract class FileOperation implements Parcelable {
            switch(getOpType()) {
                case OPERATION_MOVE:
                    return new MoveJob(
                            service, listener, id, mSrcParent, getDestination(), getSrc());
                            service, listener, id, getDestination(), getSrc(), mSrcParent);
                case OPERATION_DELETE:
                    return new DeleteJob(
                            service, listener, id, mSrcParent, getDestination(), getSrc());
                            service, listener, id, getDestination(), getSrc(), mSrcParent);
                default:
                    throw new UnsupportedOperationException("Unsupported op type: " + getOpType());
            }
@@ -210,7 +211,7 @@ public abstract class FileOperation implements Parcelable {
            return this;
        }

        public Builder withSrcParent(Uri srcParent) {
        public Builder withSrcParent(@Nullable Uri srcParent) {
            mSrcParent = srcParent;
            return this;
        }
@@ -231,7 +232,7 @@ public abstract class FileOperation implements Parcelable {
                    return new CopyOperation(mSrcs, mDestination);
                case OPERATION_MOVE:
                case OPERATION_DELETE:
                    return new MoveDeleteOperation(mOpType, mSrcs, mSrcParent, mDestination);
                    return new MoveDeleteOperation(mOpType, mSrcs, mDestination, mSrcParent);
                default:
                    throw new UnsupportedOperationException("Unsupported op type: " + mOpType);
            }
+4 −2
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import com.android.documentsui.base.DocumentStack;
import com.android.documentsui.base.Shared;
import com.android.documentsui.services.FileOperationService.OpType;

import javax.annotation.Nullable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -225,9 +226,10 @@ abstract public class Job implements Runnable {
        return false;
    }

    final void deleteDocument(DocumentInfo doc, DocumentInfo parent) throws ResourceException {
    final void deleteDocument(DocumentInfo doc, @Nullable DocumentInfo parent)
            throws ResourceException {
        try {
            if (doc.isRemoveSupported()) {
            if (parent != null && doc.isRemoveSupported()) {
                DocumentsContract.removeDocument(getClient(doc), doc.derivedUri, parent.derivedUri);
            } else if (doc.isDeleteSupported()) {
                DocumentsContract.deleteDocument(getClient(doc), doc.derivedUri);
Loading