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

Commit 14e827a9 authored by Steve McKay's avatar Steve McKay
Browse files

CopyService generalization.

Make the service operation agnostic, so we can also move delete operations to it.
In a followup change we'll see about adding support for multiple concurrent
    operations. We'll need to evaluate how to do this in IntentService (which
    serializes requests....a major limitation).

Change-Id: I03eca9c1ecaba519af42d88edffeb0dce78bd1da
parent ba75a9b6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@
        </receiver>

        <service
            android:name=".CopyService"
            android:name=".services.FileOperationService"
            android:exported="false">
        </service>
    </application>
+4 −3
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DurableUtils;
import com.android.documentsui.model.RootInfo;
import com.android.documentsui.services.FileOperationService;

import java.util.Arrays;
import java.util.List;
@@ -154,8 +155,8 @@ public class DocumentsActivity extends BaseActivity {
        if (state.action == ACTION_PICK_COPY_DESTINATION) {
            state.directoryCopy = intent.getBooleanExtra(
                    Shared.EXTRA_DIRECTORY_COPY, false);
            state.transferMode = intent.getIntExtra(CopyService.EXTRA_TRANSFER_MODE,
                    CopyService.TRANSFER_MODE_COPY);
            state.transferMode = intent.getIntExtra(FileOperationService.EXTRA_OPERATION,
                    FileOperationService.OPERATION_COPY);
        }

        return state;
@@ -481,7 +482,7 @@ public class DocumentsActivity extends BaseActivity {
            // Picking a copy destination is only used internally by us, so we
            // don't need to extend permissions to the caller.
            intent.putExtra(Shared.EXTRA_STACK, (Parcelable) mState.stack);
            intent.putExtra(CopyService.EXTRA_TRANSFER_MODE, mState.transferMode);
            intent.putExtra(FileOperationService.EXTRA_OPERATION, mState.transferMode);
        } else {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+29 −12
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.documentsui;

import static com.android.internal.util.Preconditions.checkArgument;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
@@ -27,6 +29,8 @@ import android.text.Html;

import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.services.FileOperationService;
import com.android.documentsui.services.FileOperations;

import java.util.ArrayList;

@@ -37,20 +41,20 @@ public class FailureDialogFragment extends DialogFragment
        implements DialogInterface.OnClickListener {
    private static final String TAG = "FailureDialogFragment";

    private int mTransferMode;
    private int mOperationType;
    private ArrayList<DocumentInfo> mFailedSrcList;

    public static void show(FragmentManager fm, int failure,
            ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, int transferMode) {
            ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, int operationType) {
        // TODO: Add support for other failures than copy.
        if (failure != CopyService.FAILURE_COPY) {
        if (failure != FileOperationService.FAILURE_COPY) {
            return;
        }

        final Bundle args = new Bundle();
        args.putInt(CopyService.EXTRA_FAILURE, failure);
        args.putInt(CopyService.EXTRA_TRANSFER_MODE, transferMode);
        args.putParcelableArrayList(CopyService.EXTRA_SRC_LIST, failedSrcList);
        args.putInt(FileOperationService.EXTRA_FAILURE, failure);
        args.putInt(FileOperationService.EXTRA_OPERATION, operationType);
        args.putParcelableArrayList(FileOperationService.EXTRA_SRC_LIST, failedSrcList);

        final FragmentTransaction ft = fm.beginTransaction();
        final FailureDialogFragment fragment = new FailureDialogFragment();
@@ -63,10 +67,12 @@ public class FailureDialogFragment extends DialogFragment
    @Override
    public void onClick(DialogInterface dialog, int whichButton) {
        if (whichButton == DialogInterface.BUTTON_POSITIVE) {
            CopyService.start(getActivity(), mFailedSrcList,
            FileOperations.start(
                    getActivity(),
                    mFailedSrcList,
                    (DocumentStack) getActivity().getIntent().getParcelableExtra(
                            Shared.EXTRA_STACK),
                            mTransferMode);
                    mOperationType);
        }
    }

@@ -74,16 +80,27 @@ public class FailureDialogFragment extends DialogFragment
    public Dialog onCreateDialog(Bundle inState) {
        super.onCreate(inState);

        mTransferMode = getArguments().getInt(CopyService.EXTRA_TRANSFER_MODE);
        mFailedSrcList = getArguments().getParcelableArrayList(CopyService.EXTRA_SRC_LIST);
        mOperationType = getArguments().getInt(FileOperationService.EXTRA_OPERATION);
        mFailedSrcList = getArguments().getParcelableArrayList(FileOperationService.EXTRA_SRC_LIST);

        final StringBuilder list = new StringBuilder("<p>");
        for (DocumentInfo documentInfo : mFailedSrcList) {
            list.append(String.format("&#8226; %s<br>", documentInfo.displayName));
        }
        list.append("</p>");
        final String messageFormat = getString(mTransferMode == CopyService.TRANSFER_MODE_COPY ?
                R.string.copy_failure_alert_content : R.string.move_failure_alert_content);

        // TODO: Add support for other file operations.
        checkArgument(
                mOperationType == FileOperationService.OPERATION_COPY
                || mOperationType == FileOperationService.OPERATION_MOVE);

        int messageId = mOperationType == FileOperationService.OPERATION_COPY
                ? R.string.copy_failure_alert_content
                : R.string.move_failure_alert_content;

        final String messageFormat = getString(
                messageId);

        final String message = String.format(messageFormat, list.toString());

        return new AlertDialog.Builder(getActivity())
+8 −5
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
import com.android.documentsui.model.DurableUtils;
import com.android.documentsui.model.RootInfo;
import com.android.documentsui.services.FileOperationService;

import java.util.ArrayList;
import java.util.Arrays;
@@ -120,20 +121,22 @@ public class FilesActivity extends BaseActivity {
                    ProviderExecutor.forAuthority(homeUri.getAuthority()));
        }

        final int failure = intent.getIntExtra(CopyService.EXTRA_FAILURE, 0);
        final int transferMode = intent.getIntExtra(CopyService.EXTRA_TRANSFER_MODE,
                CopyService.TRANSFER_MODE_COPY);
        final int failure = intent.getIntExtra(FileOperationService.EXTRA_FAILURE, 0);
        final int opType = intent.getIntExtra(
                FileOperationService.EXTRA_OPERATION,
                FileOperationService.OPERATION_COPY);

        // DialogFragment takes care of restoring the dialog on configuration change.
        // Only show it manually for the first time (icicle is null).
        if (icicle == null && failure != 0) {
            final ArrayList<DocumentInfo> failedSrcList =
                    intent.getParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST);
                    intent.getParcelableArrayListExtra(FileOperationService.EXTRA_SRC_LIST);
            FailureDialogFragment.show(
                    getFragmentManager(),
                    failure,
                    failedSrcList,
                    mState.stack,
                    transferMode);
                    opType);
        }
    }

+12 −0
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@ import android.content.Context;
import android.text.format.DateUtils;
import android.text.format.Time;

import java.util.ArrayList;
import java.util.List;

/** @hide */
public final class Shared {
    /** Intent action name to pick a copy destination. */
@@ -64,4 +67,13 @@ public final class Shared {
        return DateUtils.formatDateTime(context, when, flags);
    }

    /**
     * A convenient way to transform any list into a (parcelable) ArrayList.
     * Uses cast if possible, else creates a new list with entries from {@code list}.
     */
    public static <T> ArrayList<T> asArrayList(List<T> list) {
        return list instanceof ArrayList
            ? (ArrayList<T>) list
            : new ArrayList<T>(list);
    }
}
Loading