package it.geosolutions.android.map.dialog;
import it.geosolutions.android.map.R;
import it.geosolutions.android.map.utils.MapFilesProvider;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
/**
* class which shows a dialog letting the user select a certain file
*
* @author Robert Oehler
*/
public class FilePickerDialog {
protected static AlertDialog currentAlert;
protected File mDirectory;
protected ArrayList<File> mFiles;
protected FilePickerListAdapter mAdapter;
protected boolean mShowHiddenFiles = false;
protected String[] acceptedFileExtensions;
public FilePickerDialog(final Context context,final String message,final String directory,final String extension,final FilePickCallback filePickCallback) {
LayoutInflater inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View mapSelectionView = inflator.inflate(R.layout.filepick_selection, null);
final ListView lv = (ListView) mapSelectionView.findViewById(R.id.waypoint_listview);
// Initialize the extensions array to allow any file extensions
acceptedFileExtensions = new String[] { extension };
// Set initial directory
mDirectory = new File(directory);
// Initialize the ArrayList
mFiles = new ArrayList<File>();
// Set the ListAdapter
mAdapter = new FilePickerListAdapter(context, mFiles);
refreshFilesList();
final AlertDialog.Builder builder = new AlertDialog.Builder((Activity)context);
final TextView message_tv = (TextView) mapSelectionView.findViewById(R.id.message_tv);
message_tv.setText(message);
final View emptyView = inflator.inflate(R.layout.file_picker_empty, null);
lv.setEmptyView(emptyView);
lv.setAdapter(mAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
File newFile = (File)parent.getItemAtPosition(position);
if(newFile.isFile()) {
String fileName = newFile.toString();
int dot = fileName.lastIndexOf('.');
if(fileName.substring(dot + 1).equals(extension)){
//picked
filePickCallback.filePicked(newFile);
currentAlert.dismiss();
}else{
Toast.makeText(context,"Invalid file, please select an ."+extension+" file", Toast.LENGTH_SHORT).show();
}
}
}
});
final Button cancelButton = (Button) mapSelectionView.findViewById(R.id.cancelButton);
cancelButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
currentAlert.dismiss();
}
});
builder.setIcon(R.drawable.ic_launcher)
.setTitle(MapFilesProvider.getBaseDir().substring(1).toUpperCase())
.setMessage(message)
.setView(mapSelectionView);
currentAlert = builder.create();
currentAlert.show();
}
/**
* Updates the list view to the current directory
*/
protected void refreshFilesList() {
// Clear the files ArrayList
mFiles.clear();
// Set the extension file filter
ExtensionFilenameFilter filter = new ExtensionFilenameFilter(acceptedFileExtensions);
// Get the files in the directory
File[] files = mDirectory.listFiles(filter);
if(files != null && files.length > 0) {
for(File f : files) {
if(f.isHidden() && !mShowHiddenFiles) {
// Don't add the file
continue;
}
// Add the file the ArrayAdapter
mFiles.add(f);
}
Collections.sort(mFiles, new FileComparator());
}
mAdapter.notifyDataSetChanged();
}
/**
* sets the properties of the view of a file in the listview
*/
private class FilePickerListAdapter extends ArrayAdapter<File> {
private List<File> mObjects;
public FilePickerListAdapter(Context context, List<File> objects) {
super(context, R.layout.file_picker_list_item, android.R.id.text1, objects);
mObjects = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = null;
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.file_picker_list_item, parent, false);
} else {
row = convertView;
}
File object = mObjects.get(position);
//ImageView imageView = (ImageView)row.findViewById(R.id.file_picker_image);
TextView textView = (TextView)row.findViewById(R.id.file_picker_text);
// Set single line
textView.setSingleLine(true);
textView.setText(object.getName());
return row;
}
}
private class FileComparator implements Comparator<File> {
@Override
public int compare(File f1, File f2) {
if(f1 == f2) {
return 0;
}
if(f1.isDirectory() && f2.isFile()) {
// Show directories above files
return -1;
}
if(f1.isFile() && f2.isDirectory()) {
// Show files below directories
return 1;
}
// Sort the directories alphabetically
return f1.getName().compareToIgnoreCase(f2.getName());
}
}
private class ExtensionFilenameFilter implements FilenameFilter {
private String[] mExtensions;
public ExtensionFilenameFilter(String[] extensions) {
super();
mExtensions = extensions;
}
@Override
public boolean accept(File dir, String filename) {
if(mExtensions != null && mExtensions.length > 0) {
for(int i = 0; i < mExtensions.length; i++) {
if(filename.endsWith(mExtensions[i])) {
// The filename ends with the extension
return true;
}
}
// The filename did not match any of the extensions
return false;
}
// No extensions has been set. Accept all file extensions.
return true;
}
}
public interface FilePickCallback {
public void filePicked(final File file);
public void noFilePicked();
}
}