20de3d68d46c9151c1938a6c65a5c89e29759ab7
[pub/Android/ownCloud.git] / src / com / owncloud / android / utils / RecursiveFileObserver.java
1 package com.owncloud.android.utils;
2
3 import java.io.File;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Stack;
7
8 import android.os.FileObserver;
9
10 public class RecursiveFileObserver extends FileObserver {
11
12 public static int CHANGES_ONLY = CLOSE_WRITE | MOVE_SELF | MOVED_FROM;
13
14 List<SingleFileObserver> mObservers;
15 String mPath;
16 int mMask;
17
18 public RecursiveFileObserver(String path) {
19 this(path, ALL_EVENTS);
20 }
21
22 public RecursiveFileObserver(String path, int mask) {
23 super(path, mask);
24 mPath = path;
25 mMask = mask;
26 }
27
28 @Override
29 public void startWatching() {
30 if (mObservers != null) return;
31 mObservers = new ArrayList<SingleFileObserver>();
32 Stack<String> stack = new Stack<String>();
33 stack.push(mPath);
34
35 while (!stack.empty()) {
36 String parent = stack.pop();
37 mObservers.add(new SingleFileObserver(parent, mMask));
38 File path = new File(parent);
39 File[] files = path.listFiles();
40 if (files == null) continue;
41 for (int i = 0; i < files.length; ++i) {
42 if (files[i].isDirectory() && !files[i].getName().equals(".")
43 && !files[i].getName().equals("..")) {
44 stack.push(files[i].getPath());
45 }
46 }
47 }
48 for (int i = 0; i < mObservers.size(); i++)
49 mObservers.get(i).startWatching();
50 }
51
52 @Override
53 public void stopWatching() {
54 if (mObservers == null) return;
55
56 for (int i = 0; i < mObservers.size(); ++i)
57 mObservers.get(i).stopWatching();
58
59 mObservers.clear();
60 mObservers = null;
61 }
62
63 @Override
64 public void onEvent(int event, String path) {
65
66 }
67
68 private class SingleFileObserver extends FileObserver {
69 private String mPath;
70
71 public SingleFileObserver(String path, int mask) {
72 super(path, mask);
73 mPath = path;
74 }
75
76 @Override
77 public void onEvent(int event, String path) {
78 String newPath = mPath + "/" + path;
79 RecursiveFileObserver.this.onEvent(event, newPath);
80 }
81
82 }
83 }