Explorar o código

Removal of folders completed

David A. Velasco %!s(int64=12) %!d(string=hai) anos
pai
achega
b27ebf0310

+ 2 - 0
res/values/strings.xml

@@ -170,7 +170,9 @@
     <string name="common_remove">Remove</string>
     
 	  <string name="confirmation_remove_alert">"Do you really want to remove %1$s ?"</string>
+	  <string name="confirmation_remove_folder_alert">"Do you really want to remove %1$s and its contents ?"</string>
 	  <string name="confirmation_remove_local">Local only</string>
+	  <string name="confirmation_remove_folder_local">Local contents only</string>
 	  <string name="confirmation_remove_remote">Remove from server</string>
 	  <string name="confirmation_remove_remote_and_local">Remote and local</string>
 

+ 2 - 0
src/com/owncloud/android/datamodel/DataStorageManager.java

@@ -40,4 +40,6 @@ public interface DataStorageManager {
     public Vector<OCFile> getDirectoryContent(OCFile f);
     
     public void removeFile(OCFile file, boolean removeLocalCopy);
+    
+    public void removeDirectory(OCFile dir, boolean removeDBData, boolean removeLocalContent);
 }

+ 34 - 0
src/com/owncloud/android/datamodel/FileDataStorageManager.java

@@ -428,6 +428,40 @@ public class FileDataStorageManager implements DataStorageManager {
         if (file.isDown() && removeLocalCopy) {
             new File(file.getStoragePath()).delete();
         }
+        if (file.isDirectory() && removeLocalCopy) {
+            File f = new File(FileDownloader.getSavePath(mAccount.name) + file.getRemotePath());
+            if (f.exists() && f.isDirectory() && (f.list() == null || f.list().length == 0)) {
+                f.delete();
+            }
+        }
+    }
+
+    @Override
+    public void removeDirectory(OCFile dir, boolean removeDBData, boolean removeLocalContent) {
+        // TODO consider possible failures
+        if (dir != null && dir.isDirectory() && dir.getFileId() != -1) {
+            Vector<OCFile> children = getDirectoryContent(dir);
+            if (children != null) {
+                OCFile child = null;
+                for (int i=0; i<children.size(); i++) {
+                    child = children.get(i);
+                    if (child.isDirectory()) {
+                        removeDirectory(child, removeDBData, removeLocalContent);
+                    } else {
+                        if (removeDBData) {
+                            removeFile(child, removeLocalContent);
+                        } else if (removeLocalContent) {
+                            if (child.isDown()) {
+                                new File(child.getStoragePath()).delete();
+                            }
+                        }
+                    }
+                }
+                if (removeDBData) {
+                    removeFile(dir, true);
+                }
+            }
+        }
     }
 
 }

+ 5 - 1
src/com/owncloud/android/operations/RemoveFileOperation.java

@@ -72,7 +72,11 @@ public class RemoveFileOperation extends RemoteOperation {
             delete = new DeleteMethod(client.getBaseUri() + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));
             int status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT);
             if (delete.succeeded()) {
-                mDataStorageManager.removeFile(mFileToRemove, mDeleteLocalCopy);
+                if (mFileToRemove.isDirectory()) {
+                    mDataStorageManager.removeDirectory(mFileToRemove, true, mDeleteLocalCopy);
+                } else {
+                    mDataStorageManager.removeFile(mFileToRemove, mDeleteLocalCopy);
+                }
             }
             delete.getResponseBodyAsString();   // exhaust the response, although not interesting
             result = new RemoteOperationResult(delete.succeeded(), status);

+ 19 - 4
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -173,11 +173,22 @@ public class OCFileListFragment extends FragmentListView implements EditNameDial
                 Log.d(TAG, "RENAME SELECTED, item " + info.id + " at position " + info.position);
                 return true;
             case R.id.remove_file_item:
+                int messageStringId = R.string.confirmation_remove_alert;
+                int posBtnStringId = R.string.confirmation_remove_remote;
+                int neuBtnStringId = -1;
+                if (mTargetFile.isDirectory()) {
+                    messageStringId = R.string.confirmation_remove_folder_alert;
+                    posBtnStringId = R.string.confirmation_remove_remote_and_local;
+                    neuBtnStringId = R.string.confirmation_remove_folder_local;
+                } else if (mTargetFile.isDown()) {
+                    posBtnStringId = R.string.confirmation_remove_remote_and_local;
+                    neuBtnStringId = R.string.confirmation_remove_local;
+                }
                 ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
-                        R.string.confirmation_remove_alert,
+                        messageStringId,
                         new String[]{mTargetFile.getFileName()},
-                        mTargetFile.isDown() ? R.string.confirmation_remove_remote_and_local : R.string.confirmation_remove_remote,
-                        mTargetFile.isDown() ? R.string.confirmation_remove_local : -1,
+                        posBtnStringId,
+                        neuBtnStringId,
                         R.string.common_cancel);
                 confDialog.setOnConfirmationListener(this);
                 confDialog.show(getFragmentManager(), FileDetailFragment.FTAG_CONFIRMATION);
@@ -386,7 +397,11 @@ public class OCFileListFragment extends FragmentListView implements EditNameDial
     @Override
     public void onNeutral(String callerTag) {
         File f = null;
-        if (mTargetFile.isDown() && (f = new File(mTargetFile.getStoragePath())).exists()) {
+        if (mTargetFile.isDirectory()) {
+            // TODO run in a secondary thread?
+            mContainerActivity.getStorageManager().removeDirectory(mTargetFile, false, true);
+            
+        } else if (mTargetFile.isDown() && (f = new File(mTargetFile.getStoragePath())).exists()) {
             f.delete();
             mTargetFile.setStoragePath(null);
             mContainerActivity.getStorageManager().saveFile(mFile);