package com.robert.maps.applib.kml; import java.io.File; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.openintents.filemanager.FileManagerActivity; import org.openintents.filemanager.util.FileUtils; import org.xml.sax.SAXException; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.robert.maps.applib.R; import com.robert.maps.applib.kml.XMLparser.GpxTrackParser; import com.robert.maps.applib.kml.XMLparser.KmlTrackParser; import com.robert.maps.applib.utils.SimpleThreadFactory; import com.robert.maps.applib.utils.Ut; public class ImportTrackActivity extends Activity { EditText mFileName; private PoiManager mPoiManager; private ProgressDialog dlgWait; protected ExecutorService mThreadPool = Executors.newSingleThreadExecutor(new SimpleThreadFactory("ImportTrack")); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE); this.setContentView(R.layout.importtrack); if (mPoiManager == null) mPoiManager = new PoiManager(this); mFileName = (EditText) findViewById(R.id.FileName); mFileName.setText(settings.getString("IMPORT_TRACK_FILENAME", Ut.getRMapsImportDir(this).getAbsolutePath())); ((Button) findViewById(R.id.SelectFileBtn)) .setOnClickListener(new OnClickListener() { public void onClick(View v) { doSelectFile(); } }); ((Button) findViewById(R.id.ImportBtn)) .setOnClickListener(new OnClickListener() { public void onClick(View v) { doImportTrack(); } }); ((Button) findViewById(R.id.discardButton)) .setOnClickListener(new OnClickListener() { public void onClick(View v) { ImportTrackActivity.this.finish(); } }); } @Override protected Dialog onCreateDialog(int id) { if(id == R.id.dialog_wait) { dlgWait = new ProgressDialog(this); dlgWait.setMessage("Please wait while loading..."); dlgWait.setIndeterminate(true); dlgWait.setCancelable(false); return dlgWait; } return null; } protected void doSelectFile() { Intent intent = new Intent(this, FileManagerActivity.class); intent.setData(Uri.parse(mFileName.getText().toString())); startActivityForResult(intent, R.id.ImportBtn); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == R.id.ImportBtn) { if (resultCode == RESULT_OK && data != null) { // obtain the filename String filename = Uri.decode(data.getDataString()); if (filename != null) { // Get rid of URI prefix: if (filename.startsWith("file://")) { filename = filename.substring(7); } mFileName.setText(filename); } } } } private void doImportTrack() { File file = new File(mFileName.getText().toString()); if(!file.exists()){ Toast.makeText(this, "No such file", Toast.LENGTH_LONG).show(); return; } showDialog(R.id.dialog_wait); this.mThreadPool.execute(new Runnable() { public void run() { File file = new File(mFileName.getText().toString()); SAXParserFactory fac = SAXParserFactory.newInstance(); SAXParser parser = null; try { parser = fac.newSAXParser(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(parser != null){ mPoiManager.beginTransaction(); Ut.dd("Start parsing file " + file.getName()); try { if(FileUtils.getExtension(file.getName()).equalsIgnoreCase(".kml")) parser.parse(file, new KmlTrackParser(mPoiManager)); else if(FileUtils.getExtension(file.getName()).equalsIgnoreCase(".gpx")) parser.parse(file, new GpxTrackParser(mPoiManager)); mPoiManager.commitTransaction(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); mPoiManager.rollbackTransaction(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); mPoiManager.rollbackTransaction(); } catch (IllegalStateException e) { } catch (OutOfMemoryError e) { Ut.w("OutOfMemoryError"); mPoiManager.rollbackTransaction(); } Ut.dd("Pois commited"); } dlgWait.dismiss(); ImportTrackActivity.this.finish(); }; }); } @Override protected void onDestroy() { mThreadPool.shutdown(); super.onDestroy(); mPoiManager.FreeDatabases(); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("IMPORT_TRACK_FILENAME", mFileName.toString()); super.onSaveInstanceState(outState); } @Override protected void onPause() { SharedPreferences uiState = getPreferences(0); SharedPreferences.Editor editor = uiState.edit(); editor.putString("IMPORT_TRACK_FILENAME", mFileName.getText().toString()); editor.commit(); super.onPause(); } }