Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / android / src / net / sf / openrocket / android / filebrowser / SimpleFileBrowser.java
index 1c4ff406a72d7a8b6864535058ce8dfd8df646aa..1ca68f65c3a21a0c34aad10fe045906ef158ca57 100644 (file)
@@ -2,43 +2,61 @@ package net.sf.openrocket.android.filebrowser;
 \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
@@ -51,12 +69,15 @@ public class SimpleFileBrowser extends ActionBarListActivity {
                        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
@@ -84,42 +105,63 @@ public class SimpleFileBrowser extends ActionBarListActivity {
 \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
@@ -140,4 +182,107 @@ public class SimpleFileBrowser extends ActionBarListActivity {
                        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