\r
import java.io.File;\r
import java.io.FileFilter;\r
-import java.text.Collator;\r
import java.util.ArrayList;\r
import java.util.Arrays;\r
import java.util.Comparator;\r
import java.util.List;\r
\r
import net.sf.openrocket.R;\r
-import net.sf.openrocket.android.actionbarcompat.ActionBarListActivity;\r
import android.app.AlertDialog;\r
+import android.app.Dialog;\r
import android.content.DialogInterface;\r
import android.content.Intent;\r
+import android.content.SharedPreferences;\r
+import android.content.res.Resources;\r
import android.net.Uri;\r
import android.os.Bundle;\r
import android.os.Environment;\r
+import android.preference.PreferenceManager;\r
import android.view.View;\r
-import android.widget.ArrayAdapter;\r
+import android.view.ViewGroup;\r
+import android.widget.BaseAdapter;\r
+import android.widget.ImageView;\r
import android.widget.ListView;\r
+import android.widget.TextView;\r
\r
-public class SimpleFileBrowser extends ActionBarListActivity {\r
+import com.actionbarsherlock.app.SherlockListActivity;\r
\r
- private List<String> item = null;\r
- private List<String> path = null;\r
- private String root = "/";\r
+public class SimpleFileBrowser extends SherlockListActivity {\r
\r
+ private List<File> path = null;\r
+ private final static File root = new File("/");\r
+\r
+ private File previousDirectory = root;\r
+ \r
+ private String baseDirPrefKey;\r
+ private String baseDirName;\r
+\r
+ private boolean showOnlyOrkFiles;\r
+ \r
private static final OrkFileFilter filter = new OrkFileFilter();\r
- private static final Collator sorter = Collator.getInstance();\r
- static {\r
- sorter.setStrength(Collator.TERTIARY);\r
- sorter.setDecomposition(Collator.CANONICAL_DECOMPOSITION);\r
- }\r
+ private static final Comparator<String> sorter = new AlphanumComparator();\r
\r
/** Called when the activity is first created. */\r
@Override\r
public void onCreate(Bundle savedInstanceState) {\r
super.onCreate(savedInstanceState);\r
setContentView(R.layout.simplefilebrowser);\r
- getDir( Environment.getExternalStorageDirectory().getAbsolutePath() );\r
+\r
+ Resources resources = this.getResources();\r
+ baseDirPrefKey = resources.getString(R.string.PreferenceFileBrowserBaseDirectory);\r
+ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
+\r
+ String showOnlyOrkFilesKey = resources.getString(R.string.PreferenceShowOnlyOrkFiles);\r
+ showOnlyOrkFiles = pref.getBoolean(showOnlyOrkFilesKey, false);\r
+\r
+ baseDirName = pref.getString(baseDirPrefKey, Environment.getExternalStorageDirectory().getAbsolutePath() );\r
+ getDir( new File(baseDirName) );\r
}\r
\r
private static class OrkFileFilter implements FileFilter {\r
if ( arg0.isDirectory() ) { \r
return true;\r
}\r
+ return isOrk(arg0);\r
+ }\r
+\r
+ public boolean isOrk(File arg0) {\r
if ( arg0.getName().endsWith(".ork") ) {\r
return true;\r
}\r
return false;\r
}\r
-\r
}\r
\r
private static class FileComparator implements Comparator<File> {\r
\r
}\r
\r
- private void getDir(String dirPath) {\r
- setTitle(dirPath);\r
- item = new ArrayList<String>();\r
- path = new ArrayList<String>();\r
+ private void getDir(final File dirPath) {\r
+ \r
+ // A little sanity check. It could be possible the directory saved in the preference\r
+ // is no longer mounted, is not a directory (any more), or cannot be read.\r
+ // if any of these are the case, we display a little dialog, then revert to the\r
+ // previousDirectory.\r
+ if ( !dirPath.exists() || !dirPath.isDirectory() || !dirPath.canRead() ) {\r
+ \r
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);\r
+ builder.setTitle("Unable to open directory " + dirPath.getAbsolutePath() );\r
+ builder.setCancelable(true);\r
+ builder.setOnCancelListener( new Dialog.OnCancelListener() {\r
+\r
+ @Override\r
+ public void onCancel(DialogInterface arg0) {\r
+ if ( root.getAbsolutePath().equals(dirPath.getAbsolutePath()) ) {\r
+ SimpleFileBrowser.this.finish();\r
+ } else {\r
+ SimpleFileBrowser.this.getDir( previousDirectory );\r
+ }\r
+ }\r
+ \r
+ });\r
+ builder.show();\r
+ return;\r
+ }\r
+ \r
+ previousDirectory = dirPath;\r
+ \r
+ setTitle(dirPath.getAbsolutePath());\r
+ path = new ArrayList<File>();\r
\r
- File f = new File(dirPath);\r
- File[] files = f.listFiles(filter);\r
+ File[] files = dirPath.listFiles((showOnlyOrkFiles) ? filter : null );\r
\r
- if (!dirPath.equals(root)) {\r
- item.add(root);\r
+ boolean hasUp = false;\r
+ if ( !dirPath.getAbsolutePath().equals("/")) {\r
path.add(root);\r
- item.add("../");\r
- path.add(f.getParent());\r
+ path.add( dirPath.getParentFile() );\r
+ hasUp = true;\r
}\r
\r
Arrays.sort(files, new FileComparator() );\r
- for (int i = 0; i < files.length; i++) {\r
- File file = files[i];\r
- path.add(file.getPath());\r
- if (file.isDirectory())\r
- item.add(file.getName() + "/");\r
- else\r
- item.add(file.getName());\r
+ for( File file : files ) {\r
+ path.add(file);\r
}\r
\r
- ArrayAdapter<String> fileList = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, item);\r
+ DirectoryList fileList = new DirectoryList(hasUp, path);\r
setListAdapter(fileList);\r
\r
}\r
\r
@Override\r
protected void onListItemClick(ListView l, View v, int position, long id) {\r
- final File file = new File(path.get(position));\r
+ final File file = path.get(position);\r
if (file.isDirectory()) {\r
if (file.canRead())\r
- getDir(path.get(position));\r
+ getDir(file);\r
else {\r
new AlertDialog.Builder(this).setIcon(R.drawable.or_launcher)\r
.setTitle("[" + file.getName() + "] folder can't be read!")\r
finish();\r
}\r
}\r
+\r
+ private class DirectoryList extends BaseAdapter {\r
+\r
+ List<File> listing;\r
+ boolean hasUp;\r
+\r
+ DirectoryList( boolean hasUp ,List<File> listing ) {\r
+ this.listing = listing;\r
+ this.hasUp = hasUp;\r
+ }\r
+\r
+ @Override\r
+ public int getCount() {\r
+ return listing.size();\r
+ }\r
+\r
+ @Override\r
+ public Object getItem(int arg0) {\r
+ return listing.get(arg0);\r
+ }\r
+\r
+ @Override\r
+ public long getItemId(int position) {\r
+ return position;\r
+ }\r
+\r
+ @Override\r
+ public View getView(int position, View convertView, ViewGroup parent) {\r
+ if ( convertView == null ) {\r
+ convertView = getLayoutInflater().inflate(R.layout.filebrowser_list_item, parent, false);\r
+ }\r
+\r
+ File file = (File) getItem(position);\r
+\r
+ // Set the name of the field.\r
+ {\r
+ String fileName = file.getName();\r
+ if ( hasUp ) {\r
+ if (position == 0 ) {\r
+ fileName = root.getAbsolutePath();\r
+ } else if (position == 1) {\r
+ fileName = "..";\r
+ }\r
+ }\r
+\r
+ ((TextView) convertView.findViewById(R.id.filebrowser_list_item_name)).setText(fileName);\r
+ }\r
+ \r
+ // Set the "type icon" directory, ork file, or none.\r
+ {\r
+ ImageView v = (ImageView) (convertView.findViewById(R.id.filebrowser_list_item_typeicon));\r
+ if ( file.isDirectory() ) {\r
+ v.setVisibility(View.VISIBLE);\r
+ v.setImageResource(R.drawable.ic_directory);\r
+ } else if ( filter.isOrk( file ) ) {\r
+ v.setVisibility(View.VISIBLE);\r
+ v.setImageResource(R.drawable.or_launcher);\r
+ } else {\r
+ v.setVisibility(View.INVISIBLE);\r
+ }\r
+ }\r
+\r
+ // Set the "favorite directory" thing.\r
+ {\r
+ ImageView v = (ImageView) (convertView.findViewById(R.id.filebrowser_list_item_homeicon));\r
+ if ( file.isDirectory() && hasUp && position > 1 ) {\r
+ v.setVisibility(View.VISIBLE);\r
+ if ( baseDirName.equals( file.getAbsolutePath() ) ) {\r
+ v.setSelected(true);\r
+ } else {\r
+ v.setSelected(false);\r
+ v.setClickable(true);\r
+ v.setOnClickListener( new ChangeBaseDirectory(file.getAbsolutePath()));\r
+ }\r
+ } else {\r
+ v.setVisibility(View.INVISIBLE);\r
+ v.setClickable(false);\r
+ }\r
+ }\r
+ return convertView;\r
+ }\r
+ }\r
+\r
+ private class ChangeBaseDirectory implements View.OnClickListener {\r
+\r
+ private final String dirname;\r
+ \r
+ ChangeBaseDirectory ( String dirname ) {\r
+ this.dirname = dirname;\r
+ }\r
+ \r
+ @Override\r
+ public void onClick(View v) {\r
+ if ( v.isSelected() == false ) {\r
+ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(SimpleFileBrowser.this);\r
+ baseDirName = dirname;\r
+ pref.edit().putString(baseDirPrefKey, dirname).commit();\r
+ ((BaseAdapter)SimpleFileBrowser.this.getListAdapter()).notifyDataSetChanged();\r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
}\r