Merge branch 'develop' into refactor_remote_operation_to_create_folder
[pub/Android/ownCloud.git] / src / com / owncloud / android / files / OwnCloudFileObserver.java
index 5383520..68c97e4 100644 (file)
@@ -20,14 +20,13 @@ package com.owncloud.android.files;
 
 import java.io.File;
 
-import com.owncloud.android.Log_OC;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.operations.SynchronizeFileOperation;
-import com.owncloud.android.operations.RemoteOperationResult.ResultCode;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.ui.activity.ConflictsResolveActivity;
-
+import com.owncloud.android.utils.Log_OC;
 
 import android.accounts.Account;
 import android.content.Context;
@@ -36,45 +35,57 @@ import android.os.FileObserver;
 
 public class OwnCloudFileObserver extends FileObserver {
 
-    public static int CHANGES_ONLY = CLOSE_WRITE;
+    private static int MASK = (FileObserver.MODIFY | FileObserver.CLOSE_WRITE);
     
     private static String TAG = OwnCloudFileObserver.class.getSimpleName();
     
     private String mPath;
     private int mMask;
     private Account mOCAccount;
-    //private OCFile mFile;
     private Context mContext;
+    private boolean mModified;
 
     
-    public OwnCloudFileObserver(String path, Account account, Context context, int mask) {
-        super(path, mask);
+    public OwnCloudFileObserver(String path, Account account, Context context) {
+        super(path, MASK);
         if (path == null)
             throw new IllegalArgumentException("NULL path argument received"); 
-        /*if (file == null)
-            throw new IllegalArgumentException("NULL file argument received");*/ 
         if (account == null)
             throw new IllegalArgumentException("NULL account argument received"); 
         if (context == null)
             throw new IllegalArgumentException("NULL context argument received");
-        /*if (!path.equals(file.getStoragePath()) && !path.equals(FileStorageUtils.getDefaultSavePathFor(account.name, file)))
-            throw new IllegalArgumentException("File argument is not linked to the local file set in path argument"); */
         mPath = path;
-        //mFile = file;
         mOCAccount = account;
         mContext = context; 
-        mMask = mask;
+        mModified = false;
     }
     
+    
     @Override
     public void onEvent(int event, String path) {
         Log_OC.d(TAG, "Got file modified with event " + event + " and path " + mPath + ((path != null) ? File.separator + path : ""));
-        if ((event & mMask) == 0) {
+        if ((event & MASK) == 0) {
             Log_OC.wtf(TAG, "Incorrect event " + event + " sent for file " + mPath + ((path != null) ? File.separator + path : "") +
                          " with registered for " + mMask + " and original path " +
                          mPath);
-            return;
-        }
+        } else {
+            if ((event & FileObserver.MODIFY) != 0) {
+                // file changed
+                mModified = true;
+            }
+            // not sure if it's possible, but let's assume that both kind of events can be received at the same time
+            if ((event & FileObserver.CLOSE_WRITE) != 0) {
+                // file closed
+                if (mModified) {
+                    mModified = false;
+                    startSyncOperation();
+                }
+            }
+        }  
+    }
+
+    
+    private void startSyncOperation() {
         FileDataStorageManager storageManager = new FileDataStorageManager(mOCAccount, mContext.getContentResolver());
         OCFile file = storageManager.getFileByLocalPath(mPath);     // a fresh object is needed; many things could have occurred to the file since it was registered to observe
                                                                     // again, assuming that local files are linked to a remote file AT MOST, SOMETHING TO BE DONE;