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

Commit 7e13ec2f authored by Martin Brabham's avatar Martin Brabham Committed by Gerrit Code Review
Browse files

Implement ability to cancel file copy.

- Short circuit Java CopyCommand for move/copy when the user cancels 
  the dialog.
- Bubble up CancelledOperationException when the Cancel/Move operation
  is cancelled. Handle cancellation differently than success.

Change-Id: I3e4426aaccf42e12bf299041d489e72b3b76a626
parent 1ac66923
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.cyanogenmod.filemanager.commands.java;
import android.util.Log;

import com.cyanogenmod.filemanager.commands.CopyExecutable;
import com.cyanogenmod.filemanager.console.CancelledOperationException;
import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
@@ -64,7 +65,8 @@ public class CopyCommand extends Program implements CopyExecutable {
     */
    @Override
    public void execute()
            throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException {
            throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException,
                   CancelledOperationException {
        if (isTrace()) {
            Log.v(TAG,
                    String.format("Moving from %s to %s", //$NON-NLS-1$
@@ -81,7 +83,7 @@ public class CopyCommand extends Program implements CopyExecutable {
        }

        //Copy recursively
        if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
        if (!FileHelper.copyRecursive(s, d, getBufferSize(), this)) {
            if (isTrace()) {
                Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
            }
+5 −3
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.cyanogenmod.filemanager.commands.java;
import android.util.Log;

import com.cyanogenmod.filemanager.commands.MoveExecutable;
import com.cyanogenmod.filemanager.console.CancelledOperationException;
import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
@@ -64,7 +65,8 @@ public class MoveCommand extends Program implements MoveExecutable {
     */
    @Override
    public void execute()
            throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException {
            throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException,
                   CancelledOperationException {
        if (isTrace()) {
            Log.v(TAG,
                    String.format("Creating from %s to %s", this.mSrc, this.mDst)); //$NON-NLS-1$
@@ -81,7 +83,7 @@ public class MoveCommand extends Program implements MoveExecutable {

        //Move or copy recursively
        if (d.exists()) {
            if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
            if (!FileHelper.copyRecursive(s, d, getBufferSize(), this)) {
                if (isTrace()) {
                    Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
                }
@@ -95,7 +97,7 @@ public class MoveCommand extends Program implements MoveExecutable {
        } else {
            // Move between filesystem is not allow. If rename fails then use copy operation
            if (!s.renameTo(d)) {
                if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
                if (!FileHelper.copyRecursive(s, d, getBufferSize(), this)) {
                    if (isTrace()) {
                        Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
                    }
+11 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.cyanogenmod.filemanager.commands.java;

import com.cyanogenmod.filemanager.commands.Executable;
import com.cyanogenmod.filemanager.console.CancelledOperationException;
import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
@@ -29,6 +30,7 @@ public abstract class Program implements Executable {

    private boolean mTrace;
    private int mBufferSize;
    private boolean mCancelled = false;

    /**
     * Constructor of <code>Program</code>
@@ -92,6 +94,14 @@ public abstract class Program implements Executable {
     * @throws ExecutionException If the operation returns a invalid exit code
     */
    public abstract void execute()
            throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException;
            throws InsufficientPermissionsException, NoSuchFileOrDirectory, ExecutionException,
                   CancelledOperationException;

    public void requestCancel() {
        mCancelled = true;
    }

    public boolean isCancelled() {
        return mCancelled;
    }
}
+13 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.cyanogenmod.filemanager.commands.Executable;
import com.cyanogenmod.filemanager.commands.ExecutableFactory;
import com.cyanogenmod.filemanager.commands.java.JavaExecutableFactory;
import com.cyanogenmod.filemanager.commands.java.Program;
import com.cyanogenmod.filemanager.console.CancelledOperationException;
import com.cyanogenmod.filemanager.console.CommandNotFoundException;
import com.cyanogenmod.filemanager.console.ConsoleAllocException;
import com.cyanogenmod.filemanager.console.ExecutionException;
@@ -43,6 +44,7 @@ public final class JavaConsole extends VirtualConsole {
    private static final String TAG = "JavaConsole"; //$NON-NLS-1$

    private final int mBufferSize;
    private Program mActiveProgram;

    /**
     * Constructor of <code>JavaConsole</code>
@@ -79,7 +81,7 @@ public final class JavaConsole extends VirtualConsole {
    public synchronized void execute(Executable executable, Context ctx)
            throws ConsoleAllocException, InsufficientPermissionsException, NoSuchFileOrDirectory,
                OperationTimeoutException, ExecutionException, CommandNotFoundException,
            ReadOnlyFilesystemException {
                   CancelledOperationException, ReadOnlyFilesystemException {
        // Check that the program is a java program
        try {
            Program p = (Program)executable;
@@ -98,6 +100,7 @@ public final class JavaConsole extends VirtualConsole {

        // Execute the program
        final Program program = (Program)executable;
        mActiveProgram = program;
        program.setTrace(isTrace());
        program.setBufferSize(this.mBufferSize);
        if (program.isAsynchronous()) {
@@ -123,4 +126,12 @@ public final class JavaConsole extends VirtualConsole {
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean onCancel() {
        mActiveProgram.requestCancel();
        return true;
    }
}
 No newline at end of file
+7 −2
Original line number Diff line number Diff line
@@ -1252,8 +1252,13 @@ public abstract class ShellConsole extends Console implements Program.ProgramLis
                    }
                } catch (Throwable ex) {
                    Log.w(TAG,
                            String.format("Unable to kill current program: %s", //$NON-NLS-1$
                                    this.mActiveCommand.getCommand()), ex);
                            String.format("Unable to kill current program: %s",
                                    (
                                            (this.mActiveCommand == null) ?
                                                    "" :
                                                    this.mActiveCommand.getCommand()
                                    )
                            ), ex);
                }
            }
        }
Loading