/*
* Copyright (c) 2012 Hai Bison
*
* See the file LICENSE at the root directory of this project for copying
* permission.
*/
package group.pals.android.lib.ui.filechooser.utils;
import group.pals.android.lib.ui.filechooser.R;
import group.pals.android.lib.ui.filechooser.io.IFile;
import group.pals.android.lib.ui.filechooser.services.IFileProvider;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Utilities for files.
*
* @author Hai Bison
* @since v4.3 beta
*
*/
public class FileUtils {
/**
* Map of the regexes for file types corresponding to resource IDs for
* icons.
*/
private static final Map<String, Integer> _MapFileIcons = new HashMap<String, Integer>();
static {
_MapFileIcons.put(MimeTypes._RegexFileTypeAudios, R.drawable.afc_file_audio);
_MapFileIcons.put(MimeTypes._RegexFileTypeVideos, R.drawable.afc_file_video);
_MapFileIcons.put(MimeTypes._RegexFileTypeImages, R.drawable.afc_file_image);
_MapFileIcons.put(MimeTypes._RegexFileTypeCompressed, R.drawable.afc_file_compressed);
_MapFileIcons.put(MimeTypes._RegexFileTypePlainTexts, R.drawable.afc_file_plain_text);
}
/**
* Gets resource icon ID of an {@link IFile}.
*
* @param file
* {@link IFile}
* @return the resource icon ID
*/
public static int getResIcon(IFile file) {
if (file == null || !file.exists())
return android.R.drawable.ic_delete;
if (file.isFile()) {
String filename = file.getName();
for (String r : _MapFileIcons.keySet())
if (filename.matches(r))
return _MapFileIcons.get(r);
return R.drawable.afc_file;
} else if (file.isDirectory())
return R.drawable.afc_folder;
return android.R.drawable.ic_delete;
}// getResIcon()
/**
* Checks whether the filename given is valid or not.<br>
* See <a href="http://en.wikipedia.org/wiki/Filename">wiki</a> for more
* information.
*
* @param name
* name of the file
* @return {@code true} if the {@code name} is valid, and vice versa (if it
* contains invalid characters or it is {@code null}/ empty)
*/
public static boolean isFilenameValid(String name) {
return name != null && name.trim().matches("[^\\\\/?%*:|\"<>]+");
}
/**
* Deletes a file or directory.
*
* @param file
* {@link IFile}
* @param fileProvider
* {@link IFileProvider}
* @param recursive
* if {@code true} and {@code file} is a directory, browses the
* directory and deletes all of its sub files
* @return the thread which is deleting files
*/
public static Thread createDeleteFileThread(final IFile file, final IFileProvider fileProvider,
final boolean recursive) {
return new Thread() {
@Override
public void run() {
deleteFile(file);
}// run()
private void deleteFile(IFile file) {
if (isInterrupted())
return;
if (file.isFile()) {
file.delete();
return;
} else if (!file.isDirectory())
return;
if (!recursive) {
file.delete();
return;
}
try {
List<IFile> files = fileProvider.listAllFiles(file);
if (files == null) {
file.delete();
return;
}
for (IFile f : files) {
if (isInterrupted())
return;
if (f.isFile())
f.delete();
else if (f.isDirectory()) {
if (recursive)
deleteFile(f);
else
f.delete();
}
}
file.delete();
} catch (Throwable t) {
// TODO
}
}// deleteFile()
};
}// createDeleteFileThread()
}