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