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.intents.FileManagerIntents; 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.database.Cursor; 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.SimpleCursorAdapter; import android.widget.Spinner; import android.widget.Toast; import com.robert.maps.applib.R; import com.robert.maps.applib.kml.XMLparser.GpxPoiParser; import com.robert.maps.applib.kml.XMLparser.KmlPoiParser; import com.robert.maps.applib.utils.SimpleThreadFactory; import com.robert.maps.applib.utils.Ut; public class ImportPoiActivity extends Activity { EditText mFileName; Spinner mSpinner; private PoiManager mPoiManager; private ProgressDialog dlgWait; protected ExecutorService mThreadPool = Executors.newSingleThreadExecutor(new SimpleThreadFactory("ImportPoi")); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE); this.setContentView(R.layout.importpoi); if (mPoiManager == null) mPoiManager = new PoiManager(this); mFileName = (EditText) findViewById(R.id.FileName); mFileName.setText(settings.getString("IMPORT_POI_FILENAME", Ut.getRMapsImportDir(this).getAbsolutePath())); mSpinner = (Spinner) findViewById(R.id.spinnerCategory); Cursor c = mPoiManager.getGeoDatabase().getPoiCategoryListCursor(); startManagingCursor(c); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, new String[] { "name" }, new int[] { android.R.id.text1 }); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSpinner.setAdapter(adapter); ((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) { doImportPOI(); } }); ((Button) findViewById(R.id.discardButton)) .setOnClickListener(new OnClickListener() { public void onClick(View v) { ImportPoiActivity.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.setAction(FileManagerIntents.ACTION_PICK_FILE); intent.setData(Uri.parse(mFileName.getText().toString())); startActivityForResult(intent, R.id.ImportBtn); /* // Intent intent = new Intent("org.openintents.action.PICK_FILE"); // startActivityForResult(intent, 1); // String fileName = mFileName.getText().toString(); Intent intent = new Intent("org.openintents.action.PICK_FILE"); // Construct URI from file name. intent.setData(Uri.parse("file://" + fileName)); // Set fancy title and button (optional) // intent.putExtra(FileManagerIntents.EXTRA_TITLE, getString(R.string.open_title)); // intent.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT, getString(R.string.open_button)); try { startActivityForResult(intent, R.id.ImportBtn); } catch (ActivityNotFoundException e) { // No compatible file manager was found. Toast.makeText(this, "No compatible file manager found", Toast.LENGTH_SHORT).show(); } */ } @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 doImportPOI() { 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() { int CategoryId = (int)mSpinner.getSelectedItemId(); 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 KmlPoiParser(mPoiManager, CategoryId)); else if(FileUtils.getExtension(file.getName()).equalsIgnoreCase(".gpx")) parser.parse(file, new GpxPoiParser(mPoiManager, CategoryId)); 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(); ImportPoiActivity.this.finish(); }; }); } @Override protected void onDestroy() { mThreadPool.shutdown(); super.onDestroy(); mPoiManager.FreeDatabases(); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("IMPORT_POI_FILENAME", mFileName.toString()); super.onSaveInstanceState(outState); } @Override protected void onPause() { SharedPreferences uiState = getPreferences(0); SharedPreferences.Editor editor = uiState.edit(); editor.putString("IMPORT_POI_FILENAME", mFileName.getText().toString()); editor.commit(); super.onPause(); } }