ETag used to detect changes in remote files (not only in folders)
[pub/Android/ownCloud.git] / src / com / owncloud / android / files / FileOperationsHelper.java
index 5899e7a..848f8cf 100644 (file)
@@ -21,8 +21,6 @@
 
 package com.owncloud.android.files;
 
 
 package com.owncloud.android.files;
 
-import org.apache.http.protocol.HTTP;
-
 import android.accounts.Account;
 import android.content.Intent;
 import android.net.Uri;
 import android.accounts.Account;
 import android.content.Intent;
 import android.net.Uri;
@@ -35,7 +33,6 @@ import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-
 import com.owncloud.android.lib.common.network.WebdavUtils;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.lib.common.network.WebdavUtils;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
@@ -44,20 +41,22 @@ import com.owncloud.android.services.observer.FileObserverService;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.dialog.ShareLinkToDialog;
 
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.dialog.ShareLinkToDialog;
 
+import org.apache.http.protocol.HTTP;
+
 /**
  *
  */
 public class FileOperationsHelper {
 
     private static final String TAG = FileOperationsHelper.class.getName();
 /**
  *
  */
 public class FileOperationsHelper {
 
     private static final String TAG = FileOperationsHelper.class.getName();
-    
-    private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG"; 
+
+    private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG";
 
     protected FileActivity mFileActivity = null;
 
     /// Identifier of operation in progress which result shouldn't be lost 
     private long mWaitingForOpId = Long.MAX_VALUE;
 
     protected FileActivity mFileActivity = null;
 
     /// Identifier of operation in progress which result shouldn't be lost 
     private long mWaitingForOpId = Long.MAX_VALUE;
-    
+
     public FileOperationsHelper(FileActivity fileActivity) {
         mFileActivity = fileActivity;
     }
     public FileOperationsHelper(FileActivity fileActivity) {
         mFileActivity = fileActivity;
     }
@@ -67,7 +66,7 @@ public class FileOperationsHelper {
         if (file != null) {
             String storagePath = file.getStoragePath();
             String encodedStoragePath = WebdavUtils.encodePath(storagePath);
         if (file != null) {
             String storagePath = file.getStoragePath();
             String encodedStoragePath = WebdavUtils.encodePath(storagePath);
-            
+
             Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
             intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
             intentForSavedMimeType.setFlags(
             Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
             intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath), file.getMimetype());
             intentForSavedMimeType.setFlags(
@@ -94,29 +93,29 @@ public class FileOperationsHelper {
             } else {
                 chooserIntent = Intent.createChooser(intentForSavedMimeType, mFileActivity.getString(R.string.actionbar_open_with));
             }
             } else {
                 chooserIntent = Intent.createChooser(intentForSavedMimeType, mFileActivity.getString(R.string.actionbar_open_with));
             }
-            
+
             mFileActivity.startActivity(chooserIntent);
             mFileActivity.startActivity(chooserIntent);
-            
+
         } else {
             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
         }
     }
         } else {
             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
         }
     }
-    
-    
+
+
     public void shareFileWithLink(OCFile file) {
     public void shareFileWithLink(OCFile file) {
-        
+
         if (isSharedSupported()) {
             if (file != null) {
                 String link = "https://fake.url";
                 Intent intent = createShareWithLinkIntent(link);
         if (isSharedSupported()) {
             if (file != null) {
                 String link = "https://fake.url";
                 Intent intent = createShareWithLinkIntent(link);
-                String[] packagesToExclude = new String[] { mFileActivity.getPackageName() };
+                String[] packagesToExclude = new String[]{mFileActivity.getPackageName()};
                 DialogFragment chooserDialog = ShareLinkToDialog.newInstance(intent, packagesToExclude, file);
                 chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
                 DialogFragment chooserDialog = ShareLinkToDialog.newInstance(intent, packagesToExclude, file);
                 chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
-                
+
             } else {
                 Log_OC.wtf(TAG, "Trying to share a NULL OCFile");
             }
             } else {
                 Log_OC.wtf(TAG, "Trying to share a NULL OCFile");
             }
-            
+
         } else {
             // Show a Message
             Toast t = Toast.makeText(
         } else {
             // Show a Message
             Toast t = Toast.makeText(
@@ -125,13 +124,13 @@ public class FileOperationsHelper {
             t.show();
         }
     }
             t.show();
         }
     }
-    
-    
+
+
     public void shareFileWithLinkToApp(OCFile file, String password, Intent sendIntent) {
         
         if (file != null) {
             mFileActivity.showLoadingDialog();
     public void shareFileWithLinkToApp(OCFile file, String password, Intent sendIntent) {
         
         if (file != null) {
             mFileActivity.showLoadingDialog();
-            
+
             Intent service = new Intent(mFileActivity, OperationsService.class);
             service.setAction(OperationsService.ACTION_CREATE_SHARE);
             service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
             Intent service = new Intent(mFileActivity, OperationsService.class);
             service.setAction(OperationsService.ACTION_CREATE_SHARE);
             service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
@@ -144,18 +143,18 @@ public class FileOperationsHelper {
             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
         }
     }
             Log_OC.wtf(TAG, "Trying to open a NULL OCFile");
         }
     }
-    
-    
+
+
     private Intent createShareWithLinkIntent(String link) {
         Intent intentToShareLink = new Intent(Intent.ACTION_SEND);
         intentToShareLink.putExtra(Intent.EXTRA_TEXT, link);
         intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE);
     private Intent createShareWithLinkIntent(String link) {
         Intent intentToShareLink = new Intent(Intent.ACTION_SEND);
         intentToShareLink.putExtra(Intent.EXTRA_TEXT, link);
         intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE);
-        return intentToShareLink; 
+        return intentToShareLink;
     }
     }
-    
-    
+
+
     /**
     /**
-     *  @return 'True' if the server supports the Share API
+     * @return 'True' if the server supports the Share API
      */
     public boolean isSharedSupported() {
         if (mFileActivity.getAccount() != null) {
      */
     public boolean isSharedSupported() {
         if (mFileActivity.getAccount() != null) {
@@ -164,10 +163,10 @@ public class FileOperationsHelper {
         }
         return false;
     }
         }
         return false;
     }
-    
-    
+
+
     public void unshareFileWithLink(OCFile file) {
     public void unshareFileWithLink(OCFile file) {
-        
+
         if (isSharedSupported()) {
             // Unshare the file
             Intent service = new Intent(mFileActivity, OperationsService.class);
         if (isSharedSupported()) {
             // Unshare the file
             Intent service = new Intent(mFileActivity, OperationsService.class);
@@ -177,25 +176,27 @@ public class FileOperationsHelper {
             mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service);
             
             mFileActivity.showLoadingDialog();
             mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service);
             
             mFileActivity.showLoadingDialog();
-            
+
         } else {
             // Show a Message
             Toast t = Toast.makeText(mFileActivity, mFileActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
             t.show();
         } else {
             // Show a Message
             Toast t = Toast.makeText(mFileActivity, mFileActivity.getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG);
             t.show();
-            
+
         }
     }
         }
     }
-    
+
     public void sendDownloadedFile(OCFile file) {
         if (file != null) {
     public void sendDownloadedFile(OCFile file) {
         if (file != null) {
+            String storagePath = file.getStoragePath();
+            String encodedStoragePath = WebdavUtils.encodePath(storagePath);
             Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
             // set MimeType
             sendIntent.setType(file.getMimetype());
             Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
             // set MimeType
             sendIntent.setType(file.getMimetype());
-            sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + file.getStoragePath()));
+            sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + encodedStoragePath));
             sendIntent.putExtra(Intent.ACTION_SEND, true);      // Send Action
             sendIntent.putExtra(Intent.ACTION_SEND, true);      // Send Action
-            
+
             // Show dialog, without the own app
             // Show dialog, without the own app
-            String[] packagesToExclude = new String[] { mFileActivity.getPackageName() };
+            String[] packagesToExclude = new String[]{mFileActivity.getPackageName()};
             DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
             chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
 
             DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
             chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
 
@@ -203,10 +204,13 @@ public class FileOperationsHelper {
             Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
         }
     }
             Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
         }
     }
-    
-    
+
+    /**
+     * Request the synchronization of a file or folder with the OC server, including its contents.
+     *
+     * @param file          The file or folder to synchronize
+     */
     public void syncFile(OCFile file) {
     public void syncFile(OCFile file) {
-        
         if (!file.isFolder()){
             Intent intent = new Intent(mFileActivity, OperationsService.class);
             intent.setAction(OperationsService.ACTION_SYNC_FILE);
         if (!file.isFolder()){
             Intent intent = new Intent(mFileActivity, OperationsService.class);
             intent.setAction(OperationsService.ACTION_SYNC_FILE);
@@ -222,12 +226,12 @@ public class FileOperationsHelper {
             intent.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
             intent.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath());
             mFileActivity.startService(intent);
             intent.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
             intent.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath());
             mFileActivity.startService(intent);
+
         }
     }
 
         }
     }
 
-    public void toggleKeepInSync(OCFile file, boolean isFavorite) {
-        Log_OC.e(TAG, "KeepInSync");
-        file.setKeepInSync(isFavorite);
+    public void toggleFavorite(OCFile file, boolean isFavorite) {
+        file.setFavorite(isFavorite);
         mFileActivity.getStorageManager().saveFile(file);
 
         /// register the OCFile instance in the observer service to monitor local updates
         mFileActivity.getStorageManager().saveFile(file);
 
         /// register the OCFile instance in the observer service to monitor local updates
@@ -239,7 +243,7 @@ public class FileOperationsHelper {
         mFileActivity.startService(observedFileIntent);
 
         /// immediate content synchronization
         mFileActivity.startService(observedFileIntent);
 
         /// immediate content synchronization
-        if (file.keepInSync()) {
+        if (file.isFavorite()) {
             syncFile(file);
         }
     }
             syncFile(file);
         }
     }
@@ -268,8 +272,8 @@ public class FileOperationsHelper {
         
         mFileActivity.showLoadingDialog();
     }
         
         mFileActivity.showLoadingDialog();
     }
-    
-    
+
+
     public void createFolder(String remotePath, boolean createFullPath) {
         // Create Folder
         Intent service = new Intent(mFileActivity, OperationsService.class);
     public void createFolder(String remotePath, boolean createFullPath) {
         // Create Folder
         Intent service = new Intent(mFileActivity, OperationsService.class);
@@ -297,27 +301,20 @@ public class FileOperationsHelper {
 
         // for both files and folders
         FileDownloaderBinder downloaderBinder = mFileActivity.getFileDownloaderBinder();
 
         // for both files and folders
         FileDownloaderBinder downloaderBinder = mFileActivity.getFileDownloaderBinder();
-        FileUploaderBinder uploaderBinder = mFileActivity.getFileUploaderBinder();
         if (downloaderBinder != null && downloaderBinder.isDownloading(account, file)) {
             downloaderBinder.cancel(account, file);
         if (downloaderBinder != null && downloaderBinder.isDownloading(account, file)) {
             downloaderBinder.cancel(account, file);
-
-            // TODO - review why is this here, and solve in a better way
-            // Remove etag for parent, if file is a keep_in_sync
-            if (file.keepInSync()) {
-                OCFile parent = mFileActivity.getStorageManager().getFileById(file.getParentId());
-                parent.setEtag("");
-                mFileActivity.getStorageManager().saveFile(parent);
-            }
-
-        } else if (uploaderBinder != null && uploaderBinder.isUploading(account, file)) {
+        }
+        FileUploaderBinder uploaderBinder = mFileActivity.getFileUploaderBinder();
+        if (uploaderBinder != null && uploaderBinder.isUploading(account, file)) {
             uploaderBinder.cancel(account, file);
         }
     }
 
     /**
      * Start move file operation
             uploaderBinder.cancel(account, file);
         }
     }
 
     /**
      * Start move file operation
-     * @param newfile           File where it is going to be moved
-     * @param currentFile       File with the previous info
+     *
+     * @param newfile     File where it is going to be moved
+     * @param currentFile File with the previous info
      */
     public void moveFile(OCFile newfile, OCFile currentFile) {
         // Move files
      */
     public void moveFile(OCFile newfile, OCFile currentFile) {
         // Move files
@@ -331,6 +328,23 @@ public class FileOperationsHelper {
         mFileActivity.showLoadingDialog();
     }
 
         mFileActivity.showLoadingDialog();
     }
 
+    /**
+     * Start copy file operation
+     *
+     * @param newfile     File where it is going to be moved
+     * @param currentFile File with the previous info
+     */
+    public void copyFile(OCFile newfile, OCFile currentFile) {
+        // Copy files
+        Intent service = new Intent(mFileActivity, OperationsService.class);
+        service.setAction(OperationsService.ACTION_COPY_FILE);
+        service.putExtra(OperationsService.EXTRA_NEW_PARENT_PATH, newfile.getRemotePath());
+        service.putExtra(OperationsService.EXTRA_REMOTE_PATH, currentFile.getRemotePath());
+        service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
+        mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service);
+
+        mFileActivity.showLoadingDialog();
+    }
 
     public long getOpIdWaitingFor() {
         return mWaitingForOpId;
 
     public long getOpIdWaitingFor() {
         return mWaitingForOpId;
@@ -340,7 +354,7 @@ public class FileOperationsHelper {
     public void setOpIdWaitingFor(long waitingForOpId) {
         mWaitingForOpId = waitingForOpId;
     }
     public void setOpIdWaitingFor(long waitingForOpId) {
         mWaitingForOpId = waitingForOpId;
     }
-    
+
     /**
      *  @return 'True' if the server doesn't need to check forbidden characters
      */
     /**
      *  @return 'True' if the server doesn't need to check forbidden characters
      */