package com.google.android.diskusage;
import com.google.android.diskusage.entity.FileSystemEntry;
import com.google.android.diskusage.entity.FileSystemSuperRoot;
public class SearchManager {
private DiskUsageMenu menu;
private Search finishedSearch;
private Search activeSearch;
private String query;
private class Search extends Thread {
public final String query;
public FileSystemSuperRoot baseRoot;
public FileSystemSuperRoot newRoot;
Search(String query, FileSystemSuperRoot baseRoot) {
this.query = query;
this.baseRoot = baseRoot;
}
public void run() {
try {
FileSystemSuperRoot root = menu.masterRoot;
this.newRoot = (FileSystemSuperRoot)
root.filter(this.query, baseRoot.getDisplayBlockSize());
if (isInterrupted()) return;
menu.diskusage.handler.post(new Runnable() {
@Override
public void run() {
searchFinished(Search.this);
}
});
} catch (FileSystemEntry.SearchInterruptedException e) {}
}
}
public SearchManager(DiskUsageMenu menu) {
this.menu = menu;
}
public void search(String newQuery) {
newQuery = newQuery.toLowerCase();
query = newQuery;
if (activeSearch != null) {
if (newQuery.contains(activeSearch.query)) {
// pending search, return
return;
} else {
activeSearch.interrupt();
activeSearch = null;
}
}
startSearch();
}
private void startSearch() {
FileSystemSuperRoot baseRoot = menu.masterRoot;
if (finishedSearch != null) {
if (query.contains(finishedSearch.query)) {
baseRoot = finishedSearch.newRoot;
} else {
finishedSearch = null;
}
}
if (baseRoot != null) {
Search search = new Search(query, baseRoot);
search.start();
} else {
menu.finishedSearch(null, null);
}
}
private void searchFinished(Search search) {
if (activeSearch == search) {
activeSearch = null;
}
finishedSearch = search;
if (!query.equals(search.query)) {
startSearch();
}
menu.finishedSearch(search.newRoot, search.query);
}
public void cancelSearch() {
if (activeSearch != null) activeSearch.interrupt();
activeSearch = null;
finishedSearch = null;
}
}