create changelog entry
[debian/openrocket] / android / src / net / sf / openrocket / android / filebrowser / SimpleFileBrowser.java
1 package net.sf.openrocket.android.filebrowser;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileFilter;\r
5 import java.util.ArrayList;\r
6 import java.util.Arrays;\r
7 import java.util.Comparator;\r
8 import java.util.List;\r
9 \r
10 import net.sf.openrocket.R;\r
11 import android.app.AlertDialog;\r
12 import android.app.Dialog;\r
13 import android.content.DialogInterface;\r
14 import android.content.Intent;\r
15 import android.content.SharedPreferences;\r
16 import android.content.res.Resources;\r
17 import android.net.Uri;\r
18 import android.os.Bundle;\r
19 import android.os.Environment;\r
20 import android.preference.PreferenceManager;\r
21 import android.view.View;\r
22 import android.view.ViewGroup;\r
23 import android.widget.BaseAdapter;\r
24 import android.widget.ImageView;\r
25 import android.widget.ListView;\r
26 import android.widget.TextView;\r
27 \r
28 import com.actionbarsherlock.app.SherlockListActivity;\r
29 \r
30 public class SimpleFileBrowser extends SherlockListActivity {\r
31 \r
32         private List<File> path = null;\r
33         private final static File root = new File("/");\r
34 \r
35         private File previousDirectory = root;\r
36         \r
37         private String baseDirPrefKey;\r
38         private String baseDirName;\r
39 \r
40         private boolean showOnlyOrkFiles;\r
41         \r
42         private static final OrkFileFilter filter = new OrkFileFilter();\r
43         private static final Comparator<String> sorter = new AlphanumComparator();\r
44 \r
45         /** Called when the activity is first created. */\r
46         @Override\r
47         public void onCreate(Bundle savedInstanceState) {\r
48                 super.onCreate(savedInstanceState);\r
49                 setContentView(R.layout.simplefilebrowser);\r
50 \r
51                 Resources resources = this.getResources();\r
52                 baseDirPrefKey = resources.getString(R.string.PreferenceFileBrowserBaseDirectory);\r
53                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
54 \r
55                 String showOnlyOrkFilesKey = resources.getString(R.string.PreferenceShowOnlyOrkFiles);\r
56                 showOnlyOrkFiles = pref.getBoolean(showOnlyOrkFilesKey, false);\r
57 \r
58                 baseDirName = pref.getString(baseDirPrefKey, Environment.getExternalStorageDirectory().getAbsolutePath() );\r
59                 getDir( new File(baseDirName) );\r
60         }\r
61 \r
62         private static class OrkFileFilter implements FileFilter {\r
63 \r
64                 /* (non-Javadoc)\r
65                  * @see java.io.FileFilter#accept(java.io.File)\r
66                  */\r
67                 @Override\r
68                 public boolean accept(File arg0) {\r
69                         if ( arg0.isDirectory() ) { \r
70                                 return true;\r
71                         }\r
72                         return isOrk(arg0);\r
73                 }\r
74 \r
75                 public boolean isOrk(File arg0) {\r
76                         if ( arg0.getName().endsWith(".ork") ) {\r
77                                 return true;\r
78                         }\r
79                         return false;\r
80                 }\r
81         }\r
82 \r
83         private static class FileComparator implements Comparator<File> {\r
84 \r
85                 /* (non-Javadoc)\r
86                  * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)\r
87                  */\r
88                 @Override\r
89                 public int compare(File arg0, File arg1) {\r
90                         // Directories come before files, otherwise alpha.\r
91                         if ( arg0.isDirectory() ) {\r
92                                 if ( ! arg1.isDirectory() ) {\r
93                                         return -1;\r
94                                 }\r
95                                 return sorter.compare(arg0.getName(), arg1.getName());\r
96                         }\r
97 \r
98                         // arg0 is not a directory.\r
99                         if ( arg1.isDirectory() ) {\r
100                                 return 1;\r
101                         }\r
102 \r
103                         return sorter.compare(arg0.getName(), arg1.getName());\r
104                 }\r
105 \r
106         }\r
107 \r
108         private void getDir(final File dirPath) {\r
109                 \r
110                 // A little sanity check.  It could be possible the directory saved in the preference\r
111                 // is no longer mounted, is not a directory (any more), or cannot be read.\r
112                 // if any of these are the case, we display a little dialog, then revert to the\r
113                 // previousDirectory.\r
114                 if ( !dirPath.exists() || !dirPath.isDirectory() || !dirPath.canRead() ) {\r
115                         \r
116                         AlertDialog.Builder builder = new AlertDialog.Builder(this);\r
117                         builder.setTitle("Unable to open directory " + dirPath.getAbsolutePath() );\r
118                         builder.setCancelable(true);\r
119                         builder.setOnCancelListener( new Dialog.OnCancelListener() {\r
120 \r
121                                 @Override\r
122                                 public void onCancel(DialogInterface arg0) {\r
123                                         if ( root.getAbsolutePath().equals(dirPath.getAbsolutePath()) ) {\r
124                                                 SimpleFileBrowser.this.finish();\r
125                                         } else {\r
126                                                 SimpleFileBrowser.this.getDir( previousDirectory );\r
127                                         }\r
128                                 }\r
129                                 \r
130                         });\r
131                         builder.show();\r
132                         return;\r
133                 }\r
134                 \r
135                 previousDirectory = dirPath;\r
136                 \r
137                 setTitle(dirPath.getAbsolutePath());\r
138                 path = new ArrayList<File>();\r
139 \r
140                 File[] files = dirPath.listFiles((showOnlyOrkFiles) ? filter : null );\r
141 \r
142                 boolean hasUp = false;\r
143                 if ( !dirPath.getAbsolutePath().equals("/")) {\r
144                         path.add(root);\r
145                         path.add( dirPath.getParentFile() );\r
146                         hasUp = true;\r
147                 }\r
148 \r
149                 Arrays.sort(files, new FileComparator() );\r
150                 for( File file : files ) {\r
151                         path.add(file);\r
152                 }\r
153 \r
154                 DirectoryList fileList = new DirectoryList(hasUp, path);\r
155                 setListAdapter(fileList);\r
156 \r
157         }\r
158 \r
159         @Override\r
160         protected void onListItemClick(ListView l, View v, int position, long id) {\r
161                 final File file = path.get(position);\r
162                 if (file.isDirectory()) {\r
163                         if (file.canRead())\r
164                                 getDir(file);\r
165                         else {\r
166                                 new AlertDialog.Builder(this).setIcon(R.drawable.or_launcher)\r
167                                 .setTitle("[" + file.getName() + "] folder can't be read!")\r
168                                 .setPositiveButton("OK",\r
169                                                 new DialogInterface.OnClickListener() {\r
170                                         @Override\r
171                                         public void onClick(DialogInterface dialog, int which) {\r
172                                                 // TODO Auto-generated method stub\r
173                                         }\r
174                                 }).show();\r
175                         }\r
176                 }\r
177                 else\r
178                 {\r
179                         Intent resultData = new Intent(Intent.ACTION_VIEW);\r
180                         resultData.setData( Uri.fromFile(file) );\r
181                         setResult(RESULT_OK,resultData);\r
182                         finish();\r
183                 }\r
184         }\r
185 \r
186         private class DirectoryList extends BaseAdapter {\r
187 \r
188                 List<File> listing;\r
189                 boolean hasUp;\r
190 \r
191                 DirectoryList( boolean hasUp ,List<File> listing ) {\r
192                         this.listing = listing;\r
193                         this.hasUp = hasUp;\r
194                 }\r
195 \r
196                 @Override\r
197                 public int getCount() {\r
198                         return listing.size();\r
199                 }\r
200 \r
201                 @Override\r
202                 public Object getItem(int arg0) {\r
203                         return listing.get(arg0);\r
204                 }\r
205 \r
206                 @Override\r
207                 public long getItemId(int position) {\r
208                         return position;\r
209                 }\r
210 \r
211                 @Override\r
212                 public View getView(int position, View convertView, ViewGroup parent) {\r
213                         if ( convertView == null ) {\r
214                                 convertView = getLayoutInflater().inflate(R.layout.filebrowser_list_item, parent, false);\r
215                         }\r
216 \r
217                         File file = (File) getItem(position);\r
218 \r
219                         // Set the name of the field.\r
220                         {\r
221                                 String fileName = file.getName();\r
222                                 if ( hasUp ) {\r
223                                         if (position == 0 ) {\r
224                                                 fileName = root.getAbsolutePath();\r
225                                         } else if (position == 1) {\r
226                                                 fileName = "..";\r
227                                         }\r
228                                 }\r
229 \r
230                                 ((TextView) convertView.findViewById(R.id.filebrowser_list_item_name)).setText(fileName);\r
231                         }\r
232                         \r
233                         // Set the "type icon"  directory, ork file, or none.\r
234                         {\r
235                                 ImageView v = (ImageView) (convertView.findViewById(R.id.filebrowser_list_item_typeicon));\r
236                                 if ( file.isDirectory() ) {\r
237                                         v.setVisibility(View.VISIBLE);\r
238                                         v.setImageResource(R.drawable.ic_directory);\r
239                                 } else if ( filter.isOrk( file ) ) {\r
240                                         v.setVisibility(View.VISIBLE);\r
241                                         v.setImageResource(R.drawable.or_launcher);\r
242                                 } else {\r
243                                         v.setVisibility(View.INVISIBLE);\r
244                                 }\r
245                         }\r
246 \r
247                         // Set the "favorite directory" thing.\r
248                         {\r
249                                 ImageView v = (ImageView) (convertView.findViewById(R.id.filebrowser_list_item_homeicon));\r
250                                 if ( file.isDirectory() && hasUp && position > 1 ) {\r
251                                         v.setVisibility(View.VISIBLE);\r
252                                         if ( baseDirName.equals( file.getAbsolutePath() ) )  {\r
253                                                 v.setSelected(true);\r
254                                         } else {\r
255                                                 v.setSelected(false);\r
256                                                 v.setClickable(true);\r
257                                                 v.setOnClickListener( new ChangeBaseDirectory(file.getAbsolutePath()));\r
258                                         }\r
259                                 } else {\r
260                                         v.setVisibility(View.INVISIBLE);\r
261                                         v.setClickable(false);\r
262                                 }\r
263                         }\r
264                         return convertView;\r
265                 }\r
266         }\r
267 \r
268         private class ChangeBaseDirectory implements View.OnClickListener {\r
269 \r
270                 private final String dirname;\r
271                 \r
272                 ChangeBaseDirectory ( String dirname ) {\r
273                         this.dirname = dirname;\r
274                 }\r
275                 \r
276                 @Override\r
277                 public void onClick(View v) {\r
278                         if ( v.isSelected() == false ) {\r
279                                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(SimpleFileBrowser.this);\r
280                                 baseDirName = dirname;\r
281                                 pref.edit().putString(baseDirPrefKey, dirname).commit();\r
282                                 ((BaseAdapter)SimpleFileBrowser.this.getListAdapter()).notifyDataSetChanged();\r
283                         }\r
284                 }\r
285                 \r
286         }\r
287         \r
288 }\r