ConversationsFileObserver.java

 1package eu.siacs.conversations.utils;
 2
 3
 4import android.os.FileObserver;
 5
 6import java.io.File;
 7import java.util.ArrayList;
 8import java.util.List;
 9import java.util.Stack;
10
11/**
12 * Copyright (C) 2012 Bartek Przybylski
13 * Copyright (C) 2015 ownCloud Inc.
14 * Copyright (C) 2016 Daniel Gultsch
15 */
16
17public abstract class ConversationsFileObserver {
18
19    private final String path;
20    private final List<SingleFileObserver> mObservers = new ArrayList<>();
21
22    public ConversationsFileObserver(String path) {
23        this.path = path;
24    }
25
26    public synchronized void startWatching() {
27        Stack<String> stack = new Stack<>();
28        stack.push(path);
29
30        while (!stack.empty()) {
31            String parent = stack.pop();
32            mObservers.add(new SingleFileObserver(parent, FileObserver.DELETE));
33            final File path = new File(parent);
34            final File[] files = path.listFiles();
35            if (files == null) {
36                continue;
37            }
38            for(File file : files) {
39                if (file.isDirectory() && !file.getName().equals(".") && !file.getName().equals("..")) {
40                    stack.push(file.getPath());
41                }
42            }
43        }
44        for(FileObserver observer : mObservers) {
45            observer.startWatching();
46        }
47    }
48
49    public synchronized void stopWatching() {
50        for(FileObserver observer : mObservers) {
51            observer.stopWatching();
52        }
53        mObservers.clear();
54    }
55
56    abstract public void onEvent(int event, String path);
57
58    private class SingleFileObserver extends FileObserver {
59        private final String path;
60
61        public SingleFileObserver(String path, int mask) {
62            super(path, mask);
63            this.path = path;
64        }
65
66        @Override
67        public void onEvent(int event, String filename) {
68            ConversationsFileObserver.this.onEvent(event, path+'/'+filename);
69        }
70
71    }
72}