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

Commit a48778d1 authored by David van Tonder's avatar David van Tonder Committed by Gerrit Code Review
Browse files

Merge "CMFileManager: Fixes for non-rooted devices" into jellybean

parents c5ad23bd 32331d73
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.widget.TextView;
import android.widget.TextView.BufferType;
import android.widget.Toast;

import com.cyanogenmod.filemanager.FileManagerApplication;
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.commands.AsyncResultListener;
import com.cyanogenmod.filemanager.commands.WriteExecutable;
@@ -49,6 +50,7 @@ import com.cyanogenmod.filemanager.console.ConsoleBuilder;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.RelaunchableException;
import com.cyanogenmod.filemanager.model.FileSystemObject;
import com.cyanogenmod.filemanager.preferences.AccessMode;
import com.cyanogenmod.filemanager.preferences.FileManagerSettings;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
@@ -550,9 +552,12 @@ public class EditorActivity extends Activity implements TextWatcher {
                        // Check if the read was successfully
                        if (this.mReader.mCause != null) {
                            // Check if we can't read the file because we don't the require
                            // permissions
                            // permissions. If we are in a ChRooted environment, resolve the
                            // error without doing anymore
                            if (this.mReader.mCause instanceof InsufficientPermissionsException) {
                                if (!ConsoleBuilder.isPrivileged()) {
                                if (!ConsoleBuilder.isPrivileged() &&
                                    FileManagerApplication.getAccessMode().
                                                compareTo(AccessMode.SAFE) != 0) {
                                    // We don't have a privileged console, we can't ask the user
                                    // to gain privileges and relauch the command again
                                    askGainAccessAndRead(
+2 −0
Original line number Diff line number Diff line
@@ -304,6 +304,8 @@ public class SettingsPreferences extends PreferenceActivity {
                                FileManagerSettings.SETTINGS_ACCESS_MODE.getId(),
                                defaultValue);
            this.mOnChangeListener.onPreferenceChange(this.mAccessMode, value);
            // If device is not rooted, this setting cannot be changed
            this.mAccessMode.setEnabled(FileManagerApplication.isDeviceRooted());

            // Capture Debug traces
            this.mDebugTraces =
+2 −83
Original line number Diff line number Diff line
@@ -23,13 +23,10 @@ import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
import com.cyanogenmod.filemanager.model.MountPoint;
import com.cyanogenmod.filemanager.util.FileHelper;
import com.cyanogenmod.filemanager.util.MountPointHelper;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


/**
@@ -84,7 +81,7 @@ public class CopyCommand extends Program implements CopyExecutable {
        }

        //Copy recursively
        if (!copyRecursive(s, d)) {
        if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
            if (isTrace()) {
                Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
            }
@@ -111,82 +108,4 @@ public class CopyCommand extends Program implements CopyExecutable {
    public MountPoint getDstWritableMountPoint() {
        return MountPointHelper.getMountPointFromDirectory(this.mDst);
    }

    /**
     * Method that copies recursively to the destination
     *
     * @param src The source file or folder
     * @param dst The destination file or folder
     * @return boolean If the operation complete successfully
     * @throws ExecutionException If a problem was detected in the operation
     */
    public boolean copyRecursive(final File src, final File dst) throws ExecutionException {
        if (src.isDirectory()) {
            // Create the directory
            if (dst.exists() && !dst.isDirectory()) {
                Log.e(TAG,
                        String.format("Failed to check destionation dir: %s", dst)); //$NON-NLS-1$
                throw new ExecutionException("the path exists but is not a folder"); //$NON-NLS-1$
            }
            if (!dst.exists()) {
                if (!dst.mkdir()) {
                    Log.e(TAG, String.format("Failed to create directory: %s", dst)); //$NON-NLS-1$
                    return false;
                }
            }
            File[] files = src.listFiles();
            if (files != null) {
                for (int i = 0; i < files.length; i++) {
                    if (!copyRecursive(files[i], new File(dst, files[i].getName()))) {
                        return false;
                    }
                }
            }
        } else {
            // Copy the directory
            if (!bufferedCopy(src, dst)) {
                return false;
            }
        }
        return true;
    }

    /**
     * Method that copies a file
     *
     * @param src The source file
     * @param dst The destination file
     * @return boolean If the operation complete successfully
     */
    public boolean bufferedCopy(final File src, final File dst) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(src), getBufferSize());
            bos = new BufferedOutputStream(new FileOutputStream(dst), getBufferSize());
            int read = 0;
            byte[] data = new byte[getBufferSize()];
            while ((read = bis.read(data, 0, getBufferSize())) != -1) {
                bos.write(data, 0, read);
            }
            return true;

        } catch (Throwable e) {
            Log.e(TAG,
                    String.format(TAG, "Failed to copy from %s to %d", src, dst), e); //$NON-NLS-1$
            return false;
        } finally {
            try {
                if (bis != null) {
                    bis.close();
                }
            } catch (Throwable e) {/**NON BLOCK**/}
            try {
                if (bos != null) {
                    bos.close();
                }
            } catch (Throwable e) {/**NON BLOCK**/}
        }

    }
}
+2 −25
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
import com.cyanogenmod.filemanager.model.MountPoint;
import com.cyanogenmod.filemanager.util.FileHelper;
import com.cyanogenmod.filemanager.util.MountPointHelper;

import java.io.File;
@@ -84,7 +85,7 @@ public class DeleteDirCommand extends Program implements DeleteDirExecutable {
        }

        // Delete the file
        if (!deleteFolder(f)) {
        if (!FileHelper.deleteFolder(f)) {
            if (isTrace()) {
                Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
            }
@@ -111,28 +112,4 @@ public class DeleteDirCommand extends Program implements DeleteDirExecutable {
    public MountPoint getDstWritableMountPoint() {
        return MountPointHelper.getMountPointFromDirectory(this.mPath);
    }

    /**
     * Method that deletes a folder recursively
     *
     * @param folder The folder to delete
     * @return boolean If the folder was deleted
     */
    private boolean deleteFolder(File folder) {
        File[] files = folder.listFiles();
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    if (!deleteFolder(files[i])) {
                        return false;
                    }
                } else {
                    if (!files[i].delete()) {
                        return false;
                    }
                }
            }
        }
        return folder.delete();
    }
}
+28 −5
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.cyanogenmod.filemanager.console.ExecutionException;
import com.cyanogenmod.filemanager.console.InsufficientPermissionsException;
import com.cyanogenmod.filemanager.console.NoSuchFileOrDirectory;
import com.cyanogenmod.filemanager.model.MountPoint;
import com.cyanogenmod.filemanager.util.FileHelper;
import com.cyanogenmod.filemanager.util.MountPointHelper;

import java.io.File;
@@ -78,13 +79,35 @@ public class MoveCommand extends Program implements MoveExecutable {
            throw new NoSuchFileOrDirectory(this.mSrc);
        }

        //Copy recursively
        //Move or copy recursively
        if (d.exists()) {
            if (!FileHelper.copyRecursive(s, d, getBufferSize())) {
                if (isTrace()) {
                    Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
                }
                throw new InsufficientPermissionsException();
            }
            if (!FileHelper.deleteFolder(s)) {
                if (isTrace()) {
                    Log.v(TAG, "Result: OK. WARNING. Source not deleted."); //$NON-NLS-1$
                }
            }
        } 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 (isTrace()) {
                        Log.v(TAG, "Result: FAIL. InsufficientPermissionsException"); //$NON-NLS-1$
                    }
                    throw new InsufficientPermissionsException();
                }
                if (!FileHelper.deleteFolder(s)) {
                    if (isTrace()) {
                        Log.v(TAG, "Result: OK. WARNING. Source not deleted."); //$NON-NLS-1$
                    }
                }
            }
        }

        if (isTrace()) {
            Log.v(TAG, "Result: OK"); //$NON-NLS-1$
Loading