package com.eleybourn.bookcatalogue.filechooser; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import android.app.Activity; import com.eleybourn.bookcatalogue.filechooser.FileChooserFragment.FileDetails; import com.eleybourn.bookcatalogue.utils.SimpleTaskQueue.SimpleTaskContext; import com.eleybourn.bookcatalogue.utils.SimpleTaskQueueProgressFragment; import com.eleybourn.bookcatalogue.utils.SimpleTaskQueueProgressFragment.FragmentTask; /** * Partially implements a FragmentTask to build a list of files in the background. * * @author pjw */ public abstract class FileLister implements FragmentTask { protected ArrayList<FileDetails> dirs; protected File mRoot; /** * Interface for the creating activity to allow the resulting list to be returned. * * @author pjw */ public interface FileListerListener { public void onGotFileList(File root, ArrayList<FileDetails> list); } /** * Constructor * * @param root */ public FileLister(File root) { mRoot = root; } /** Return a FileFilter appropriate to the types of files being listed */ protected abstract FileFilter getFilter(); /** Turn an array of Files into an ArrayList of FileDetails. */ protected abstract ArrayList<FileDetails> processList(File[] files); @Override public void run(SimpleTaskQueueProgressFragment fragment, SimpleTaskContext taskContext) { // Get a file list File[] files = mRoot.listFiles(getFilter()); // Filter/fill-in using the subclass dirs = processList(files); // Sort it Collections.sort(dirs, mComparator); } @Override public void onFinish(SimpleTaskQueueProgressFragment fragment, Exception exception) { // Display it in UI thread. Activity a = fragment.getActivity(); if (a != null && a instanceof FileListerListener) { ((FileListerListener)a).onGotFileList(mRoot, dirs); } } /** * Perform case-insensitive sorting using default locale. */ private static class FileDetailsComparator implements Comparator<FileDetails> { public int compare(FileDetails f1, FileDetails f2) { return f1.getFile().getName().toUpperCase().compareTo(f2.getFile().getName().toUpperCase()); } } private FileDetailsComparator mComparator = new FileDetailsComparator(); }