mirror of https://github.com/tasks/tasks
Added a file browser to select and attach files from the sdcard. Minor code cleanup and polish
parent
3f97682595
commit
a45ffb0c79
@ -0,0 +1,218 @@
|
||||
package com.todoroo.astrid.files;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.AlertDialog.Builder;
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.timsu.astrid.R;
|
||||
import com.todoroo.andlib.utility.DialogUtilities;
|
||||
|
||||
/**
|
||||
* Based on the Android-File-Explore project by Manish Burman
|
||||
* https://github.com/mburman/Android-File-Explore
|
||||
*
|
||||
*/
|
||||
public class FileExplore extends Activity {
|
||||
|
||||
// Stores names of traversed directories
|
||||
ArrayList<String> str = new ArrayList<String>();
|
||||
|
||||
// Check if the first level of the directory structure is the one showing
|
||||
private Boolean firstLvl = true;
|
||||
|
||||
private static final String TAG = "F_PATH"; //$NON-NLS-1$
|
||||
|
||||
public static final String EXTRA_FILE_SELECTED = "fileSelected"; //$NON-NLS-1$
|
||||
|
||||
private Item[] fileList;
|
||||
private File path = new File(Environment.getExternalStorageDirectory().toString());
|
||||
private String chosenFile;
|
||||
private static final int DIALOG_LOAD_FILE = 1000;
|
||||
private String upString;
|
||||
|
||||
ListAdapter adapter;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
loadFileList();
|
||||
|
||||
showDialog(DIALOG_LOAD_FILE);
|
||||
upString = getString(R.string.file_browser_up);
|
||||
Log.d(TAG, path.getAbsolutePath());
|
||||
|
||||
}
|
||||
|
||||
private void loadFileList() {
|
||||
try {
|
||||
path.mkdirs();
|
||||
} catch (SecurityException e) {
|
||||
DialogUtilities.okDialog(this, getString(R.string.file_browser_err_permissions), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Checks whether path exists
|
||||
if (path.exists()) {
|
||||
FilenameFilter filter = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(File dir, String filename) {
|
||||
File sel = new File(dir, filename);
|
||||
// Filters based on whether the file is hidden or not
|
||||
return (sel.isFile() || sel.isDirectory())
|
||||
&& !sel.isHidden();
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
String[] fList = path.list(filter);
|
||||
fileList = new Item[fList.length];
|
||||
for (int i = 0; i < fList.length; i++) {
|
||||
fileList[i] = new Item(fList[i], R.drawable.file_icon);
|
||||
|
||||
// Convert into file path
|
||||
File sel = new File(path, fList[i]);
|
||||
|
||||
// Set drawables
|
||||
if (sel.isDirectory()) {
|
||||
fileList[i].icon = R.drawable.directory_icon;
|
||||
}
|
||||
}
|
||||
|
||||
if (!firstLvl) {
|
||||
Item temp[] = new Item[fileList.length + 1];
|
||||
for (int i = 0; i < fileList.length; i++) {
|
||||
temp[i + 1] = fileList[i];
|
||||
}
|
||||
temp[0] = new Item(upString, R.drawable.directory_up);
|
||||
fileList = temp;
|
||||
}
|
||||
} else {
|
||||
Log.e(TAG, "path does not exist"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
adapter = new ArrayAdapter<Item>(this,
|
||||
android.R.layout.select_dialog_item, android.R.id.text1,
|
||||
fileList) {
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
// creates view
|
||||
View view = super.getView(position, convertView, parent);
|
||||
TextView textView = (TextView) view
|
||||
.findViewById(android.R.id.text1);
|
||||
|
||||
// put the image on the text view
|
||||
textView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
fileList[position].icon, 0, 0, 0);
|
||||
|
||||
// add margin between image and text (support various screen
|
||||
// densities)
|
||||
int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f);
|
||||
textView.setCompoundDrawablePadding(dp5);
|
||||
|
||||
return view;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
private class Item {
|
||||
public String file;
|
||||
public int icon;
|
||||
|
||||
public Item(String file, Integer icon) {
|
||||
this.file = file;
|
||||
this.icon = icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return file;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Dialog onCreateDialog(int id) {
|
||||
Dialog dialog = null;
|
||||
AlertDialog.Builder builder = new Builder(this);
|
||||
|
||||
if (fileList == null) {
|
||||
dialog = builder.create();
|
||||
return dialog;
|
||||
}
|
||||
|
||||
switch (id) {
|
||||
case DIALOG_LOAD_FILE:
|
||||
builder.setTitle(getString(R.string.file_browser_title));
|
||||
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface d, int which) {
|
||||
chosenFile = fileList[which].file;
|
||||
File sel = new File(path + File.separator + chosenFile);
|
||||
if (sel.isDirectory()) {
|
||||
firstLvl = false;
|
||||
|
||||
// Adds chosen directory to list
|
||||
str.add(chosenFile);
|
||||
fileList = null;
|
||||
path = new File(sel.toString());
|
||||
|
||||
loadFileList();
|
||||
|
||||
removeDialog(DIALOG_LOAD_FILE);
|
||||
showDialog(DIALOG_LOAD_FILE);
|
||||
} else if (chosenFile.equals(upString) && !sel.exists()) { // Checks if 'up' was clicked
|
||||
// present directory removed from list
|
||||
String s = str.remove(str.size() - 1);
|
||||
|
||||
// path modified to exclude present directory
|
||||
path = new File(path.toString().substring(0,
|
||||
path.toString().lastIndexOf(s)));
|
||||
fileList = null;
|
||||
|
||||
// if there are no more directories in the list, then
|
||||
// its the first level
|
||||
if (str.isEmpty()) {
|
||||
firstLvl = true;
|
||||
}
|
||||
loadFileList();
|
||||
|
||||
removeDialog(DIALOG_LOAD_FILE);
|
||||
showDialog(DIALOG_LOAD_FILE);
|
||||
} else {
|
||||
Intent result = new Intent();
|
||||
result.putExtra(EXTRA_FILE_SELECTED, sel.getAbsolutePath());
|
||||
setResult(RESULT_OK, result);
|
||||
removeDialog(DIALOG_LOAD_FILE);
|
||||
finish();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
dialog = builder.show();
|
||||
return dialog;
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 3.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
Loading…
Reference in New Issue