package com.openfarmanager.android.filesystem; import android.os.Build; import android.text.TextUtils; import com.openfarmanager.android.App; import com.openfarmanager.android.core.Settings; import com.openfarmanager.android.filesystem.actions.RootTask; import com.openfarmanager.android.filesystem.filter.Filter; import com.openfarmanager.android.filesystem.filter.FilterFactory; import com.openfarmanager.android.model.exeptions.FileIsNotDirectoryException; import com.openfarmanager.android.utils.StorageUtils; import org.apache.commons.io.IOCase; import org.apache.commons.io.filefilter.PrefixFileFilter; import java.io.File; import java.util.*; /** * Vlad Namashko */ public class FileSystemScanner { public static String ROOT = "/"; public static final FileSystemScanner sInstance; private LinkedList<Filter> mFilters; static { sInstance = new FileSystemScanner(); } private Comparator<FileProxy> mComparator = new Comparator<FileProxy>() { public int compare(FileProxy f1, FileProxy f2) { int result = 0; for (Filter filter : mFilters) { if ((result = filter.doFilter(f1, f2)) != 0) { return result; } } return result; } }; private FileSystemScanner() { initFilters(); } public void initFilters() { ROOT = App.sInstance.getSettings().isSDCardRoot() ? StorageUtils.getSdPath() : "/"; mFilters = new LinkedList<Filter>(); if (App.sInstance.getSettings().isFoldersFirst()) { mFilters.add(FilterFactory.createDirectoryUpFilter()); } mFilters.add(FilterFactory.createPreferredFilter()); } public static Collection<File> getTree(File... root) { ArrayList<File> tree = new ArrayList<File>(); for (File f : root) { addFilesRecursively(f, tree); } return tree; } private static void addFilesRecursively(File file, Collection<File> all) { final File[] children = file.listFiles(); if (children != null) { for (File child : children) { all.add(child); addFilesRecursively(child, all); } } } public File getRoot() { return new File(ROOT); } public boolean isRoot(File node) { return node.getAbsolutePath().equals(ROOT); } public List<FileProxy> fallingDown(File currentNode, String mFilter) throws FileIsNotDirectoryException { if (!currentNode.isFile()) { String[] files = null; List<FileProxy> result = new LinkedList<FileProxy>(); if (currentNode.canRead()) { if (!TextUtils.isEmpty(mFilter)) { try { files = currentNode.list(new PrefixFileFilter(mFilter, IOCase.INSENSITIVE)); } catch (Exception e) { e.printStackTrace(); } } if (files == null) { files = currentNode.list(); } } else { files = RootTask.ls(currentNode); } if (files == null) { return Build.VERSION.SDK_INT >= 24 ? null : result; } else { for (String f : files) { FileSystemFile file = new FileSystemFile(currentNode, f); if (App.sInstance.getSettings().isHideSystemFiles() && file.isHidden()) { continue; } result.add(file); } sort(result); return result; } } else { throw new FileIsNotDirectoryException(currentNode.getAbsolutePath()); } } public void sort(List<FileProxy> filesToSort) { Collections.sort(filesToSort, mComparator); } }