complete two way synchronization
[pub/Android/ownCloud.git] / src / com / owncloud / android / utils / RecursiveFileObserver.java
diff --git a/src/com/owncloud/android/utils/RecursiveFileObserver.java b/src/com/owncloud/android/utils/RecursiveFileObserver.java
new file mode 100644 (file)
index 0000000..20de3d6
--- /dev/null
@@ -0,0 +1,83 @@
+package com.owncloud.android.utils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+import android.os.FileObserver;
+
+public class RecursiveFileObserver extends FileObserver {
+
+    public static int CHANGES_ONLY = CLOSE_WRITE | MOVE_SELF | MOVED_FROM;
+    
+    List<SingleFileObserver> mObservers;
+    String mPath;
+    int mMask;
+    
+    public RecursiveFileObserver(String path) {
+        this(path, ALL_EVENTS);
+    }
+    
+    public RecursiveFileObserver(String path, int mask) {
+        super(path, mask);
+        mPath = path;
+        mMask = mask;
+    }
+
+    @Override
+    public void startWatching() {
+        if (mObservers != null) return;
+        mObservers = new ArrayList<SingleFileObserver>();
+        Stack<String> stack = new Stack<String>();
+        stack.push(mPath);
+        
+        while (!stack.empty()) {
+            String parent = stack.pop();
+            mObservers.add(new SingleFileObserver(parent, mMask));
+            File path = new File(parent);
+            File[] files = path.listFiles();
+            if (files == null) continue;
+            for (int i = 0; i < files.length; ++i) {
+                if (files[i].isDirectory() && !files[i].getName().equals(".")
+                    && !files[i].getName().equals("..")) {
+                    stack.push(files[i].getPath());
+                }
+            }
+        }
+        for (int i = 0; i < mObservers.size(); i++)
+            mObservers.get(i).startWatching();
+    }
+    
+    @Override
+    public void stopWatching() {
+        if (mObservers == null) return;
+        
+        for (int i = 0; i < mObservers.size(); ++i)
+            mObservers.get(i).stopWatching();
+
+        mObservers.clear();
+        mObservers = null;
+    }
+    
+    @Override
+    public void onEvent(int event, String path) {
+        
+    }
+    
+    private class SingleFileObserver extends FileObserver {
+        private String mPath;
+
+        public SingleFileObserver(String path, int mask) {
+            super(path, mask);
+            mPath = path;
+        }
+        
+        @Override
+        public void onEvent(int event, String path) {
+            String newPath = mPath + "/" + path;
+            RecursiveFileObserver.this.onEvent(event, newPath);
+        } 
+        
+    }
+}