Context handling made consistent
[pub/Android/ownCloud.git] / src / com / owncloud / android / files / OwnCloudFileObserver.java
index 42e4763..8572124 100644 (file)
@@ -1,8 +1,35 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2012 Bartek Przybylski
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
 package com.owncloud.android.files;
 
-import com.owncloud.android.datamodel.FileDataStorageManager;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.owncloud.android.datamodel.DataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.files.OwnCloudFileObserver.FileObserverStatusListener.Status;
 import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.network.OwnCloudClientUtils;
+import com.owncloud.android.operations.RemoteOperationResult;
+import com.owncloud.android.operations.SynchronizeFileOperation;
+
+import eu.alefzero.webdav.WebdavClient;
 
 import android.accounts.Account;
 import android.content.Context;
@@ -12,15 +39,16 @@ import android.util.Log;
 
 public class OwnCloudFileObserver extends FileObserver {
 
-    public static int CHANGES_ONLY = CLOSE_WRITE | MOVED_FROM | MODIFY;
+    public static int CHANGES_ONLY = CLOSE_WRITE;
     
-    private static String TAG = "OwnCloudFileObserver";
+    private static String TAG = OwnCloudFileObserver.class.getSimpleName();
     private String mPath;
     private int mMask;
-    FileDataStorageManager mStorage;
-    Account mOCAccount;
-    OCFile mFile;
-    static Context mContext;
+    private DataStorageManager mStorage;
+    private Account mOCAccount;
+    private OCFile mFile;
+    private Context mContext;
+    private List<FileObserverStatusListener> mListeners;
     
     public OwnCloudFileObserver(String path) {
         this(path, ALL_EVENTS);
@@ -30,13 +58,14 @@ public class OwnCloudFileObserver extends FileObserver {
         super(path, mask);
         mPath = path;
         mMask = mask;
+        mListeners = new LinkedList<FileObserverStatusListener>();
     }
     
     public void setAccount(Account account) {
         mOCAccount = account;
     }
     
-    public void setStorageManager(FileDataStorageManager manager) {
+    public void setStorageManager(DataStorageManager manager) {
         mStorage = manager;
     }
     
@@ -56,6 +85,10 @@ public class OwnCloudFileObserver extends FileObserver {
         return mFile.getRemotePath();
     }
     
+    public void addObserverStatusListener(FileObserverStatusListener listener) {
+        mListeners.add(listener);
+    }
+    
     @Override
     public void onEvent(int event, String path) {
         Log.d(TAG, "Got file modified with event " + event + " and path " + path);
@@ -63,8 +96,24 @@ public class OwnCloudFileObserver extends FileObserver {
             Log.wtf(TAG, "Incorrect event " + event + " sent for file " + path +
                          " with registered for " + mMask + " and original path " +
                          mPath);
+            for (FileObserverStatusListener l : mListeners)
+                l.OnObservedFileStatusUpdate(mPath, getRemotePath(), mOCAccount, Status.INCORRECT_MASK);
             return;
         }
+        WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mOCAccount, mContext);
+        SynchronizeFileOperation sfo = new SynchronizeFileOperation(mFile.getRemotePath(), mStorage, mOCAccount);
+        RemoteOperationResult result = sfo.execute(wc);
+        
+        if (result.getExtraData() == Boolean.TRUE) {
+            // inform user about conflict and let him decide what to do
+            for (FileObserverStatusListener l : mListeners)
+                l.OnObservedFileStatusUpdate(mPath, getRemotePath(), mOCAccount, Status.CONFLICT);
+            return;
+        }
+
+        for (FileObserverStatusListener l : mListeners)
+            l.OnObservedFileStatusUpdate(mPath, getRemotePath(), mOCAccount, Status.SENDING_TO_UPLOADER);
+        
         Intent i = new Intent(mContext, FileUploader.class);
         i.putExtra(FileUploader.KEY_ACCOUNT, mOCAccount);
         i.putExtra(FileUploader.KEY_REMOTE_FILE, mFile.getRemotePath());
@@ -74,4 +123,17 @@ public class OwnCloudFileObserver extends FileObserver {
         mContext.startService(i);
     }
     
+    public interface FileObserverStatusListener {
+        public enum Status {
+            SENDING_TO_UPLOADER,
+            CONFLICT,
+            INCORRECT_MASK
+        }
+        
+        public void OnObservedFileStatusUpdate(String localPath,
+                                               String remotePath,
+                                               Account account,
+                                               FileObserverStatusListener.Status status);
+    }
+    
 }