package carnero.cgeo; import android.app.Activity; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.res.Resources; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import java.io.File; import java.util.ArrayList; public class cgeogpxes extends ListActivity { private ArrayList<File> files = new ArrayList<File>(); private cgeoapplication app = null; private cgSettings settings = null; private cgBase base = null; private cgWarning warning = null; private Activity activity = null; private cgGPXListAdapter adapter = null; private ProgressDialog waitDialog = null; private ProgressDialog parseDialog = null; private Resources res = null; private loadFiles searchingThread = null; private boolean endSearching = false; private int listId = 1; private int imported = 0; final private Handler changeWaitDialogHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.obj != null && waitDialog != null) { waitDialog.setMessage(res.getString(R.string.gpx_import_searching_in) + " " + (String) msg.obj); } } }; final private Handler changeParseDialogHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.obj != null && parseDialog != null) { parseDialog.setMessage(res.getString(R.string.gpx_import_loading_stored) + " " + (Integer) msg.obj); } } }; final private Handler loadFilesHandler = new Handler() { @Override public void handleMessage(Message msg) { try { if (files == null || files.isEmpty()) { if (waitDialog != null) { waitDialog.dismiss(); } warning.showToast(res.getString(R.string.gpx_import_no_files)); finish(); return; } else { if (adapter != null) { adapter.notifyDataSetChanged(); } } if (waitDialog != null) { waitDialog.dismiss(); } } catch (Exception e) { if (waitDialog != null) { waitDialog.dismiss(); } Log.e(cgSettings.tag, "cgeogpxes.loadFilesHandler: " + e.toString()); } } }; final private Handler loadCachesHandler = new Handler() { @Override public void handleMessage(Message msg) { try { if (parseDialog != null) { parseDialog.dismiss(); } warning.helpDialog(res.getString(R.string.gpx_import_title_caches_imported), imported + " " + res.getString(R.string.gpx_import_caches_imported)); imported = 0; } catch (Exception e) { if (parseDialog != null) { parseDialog.dismiss(); } } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // init activity = this; res = this.getResources(); app = (cgeoapplication) this.getApplication(); settings = new cgSettings(this, getSharedPreferences(cgSettings.preferences, 0)); base = new cgBase(app, settings, getSharedPreferences(cgSettings.preferences, 0)); warning = new cgWarning(this); // set layout if (settings.skin == 1) { setTheme(R.style.light); } else { setTheme(R.style.dark); } setContentView(R.layout.gpx); base.setTitle(activity, res.getString(R.string.gpx_import_title)); // google analytics base.sendAnal(activity, "/gpx-import"); Bundle extras = getIntent().getExtras(); if (extras != null) { listId = extras.getInt("list"); } if (listId <= 0) { listId = 1; } setAdapter(); waitDialog = ProgressDialog.show( this, res.getString(R.string.gpx_import_title_searching), res.getString(R.string.gpx_import_searching), true, true, new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface arg0) { if (searchingThread != null && searchingThread.isAlive()) { searchingThread.notifyEnd(); } if (files.isEmpty() == true) { finish(); } } } ); endSearching = false; searchingThread = new loadFiles(); searchingThread.start(); } @Override public void onResume() { super.onResume(); settings.load(); } private void setAdapter() { if (adapter == null) { adapter = new cgGPXListAdapter(this, settings, files); setListAdapter(adapter); } } private class loadFiles extends Thread { public void notifyEnd() { endSearching = true; } @Override public void run() { ArrayList<File> list = new ArrayList<File>(); try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) == true) { final File gpx = new File(Environment.getExternalStorageDirectory().toString() + "/gpx"); if (gpx.exists() && gpx.isDirectory()) { listDir(list, gpx); } else { listDir(list, Environment.getExternalStorageDirectory()); } } else { Log.w(cgSettings.tag, "No external media mounted."); } } catch (Exception e) { Log.e(cgSettings.tag, "cgeogpxes.loadFiles.run: " + e.toString()); } final Message msg = new Message(); msg.obj = "loaded directories"; changeWaitDialogHandler.sendMessage(msg); files.addAll(list); list.clear(); loadFilesHandler.sendMessage(new Message()); } } private void listDir(ArrayList<File> list, File directory) { if (directory == null || directory.isDirectory() == false || directory.canRead() == false) { return; } final File[] listPre = directory.listFiles(); if (listPre != null && listPre.length > 0) { final int listCnt = listPre.length; for (int i = 0; i < listCnt; i++) { if (endSearching == true) { return; } if (listPre[i].canRead() == true && listPre[i].isFile() == true) { final String[] nameParts = listPre[i].getName().split("\\."); if (nameParts.length > 1) { final String extension = nameParts[(nameParts.length - 1)].toLowerCase(); if (extension.equals("gpx") == false) { continue; } } else { continue; // file has no extension } list.add(listPre[i]); // add file to list } else if (listPre[i].canRead() == true && listPre[i].isDirectory() == true) { final Message msg = new Message(); String name = listPre[i].getName(); if (name.substring(0, 1).equals(".") == true) { continue; // skip hidden directories } if (name.length() > 16) { name = name.substring(0, 14) + "..."; } msg.obj = name; changeWaitDialogHandler.sendMessage(msg); listDir(list, listPre[i]); // go deeper } } } return; } public void loadGPX(File file) { if (waitDialog != null) { waitDialog.dismiss(); } parseDialog = ProgressDialog.show( activity, res.getString(R.string.gpx_import_title_reading_file), res.getString(R.string.gpx_import_loading), true, false); new loadCaches(file).start(); } private class loadCaches extends Thread { File file = null; public loadCaches(File fileIn) { file = fileIn; } @Override public void run() { final long searchId = base.parseGPX(app, file, listId, changeParseDialogHandler); imported = app.getCount(searchId); loadCachesHandler.sendMessage(new Message()); } } public void goHome(View view) { base.goHome(activity); } }