private static long startup_intent_timestamp = 0L;\r
public static String my_display_density = "mdpi";\r
private boolean parseErrorShown = false;\r
- //private static NavitMapDownloader map_download = null;\r
public static final int MAPDOWNLOAD_PRI_DIALOG = 1;\r
public static final int MAPDOWNLOAD_SEC_DIALOG = 2;\r
+ public static final int SEARCHRESULTS_WAIT_DIALOG = 3;\r
+ public static final int ADDRESS_RESULTS_DIALOG_MAX = 10;\r
public ProgressDialog mapdownloader_dialog_pri = null;\r
public ProgressDialog mapdownloader_dialog_sec = null;\r
+ public ProgressDialog search_results_wait = null;\r
+ public static Handler Navit_progress_h = null;\r
public static NavitMapDownloader mapdownloader_pri = null;\r
public static NavitMapDownloader mapdownloader_sec = null;\r
public static final int NavitDownloaderPriSelectMap_id = 967;\r
public static int download_map_id = 0;\r
ProgressThread progressThread_pri = null;\r
ProgressThread progressThread_sec = null;\r
+ SearchResultsThread searchresultsThread = null;\r
+ SearchResultsThreadSpinnerThread spinner_thread = null;\r
+ public static Boolean NavitAddressSearchSpinnerActive = false;\r
public static final int MAP_NUM_PRIMARY = 11;\r
public static final int NavitAddressSearch_id = 70;\r
public static final int NavitAddressResultList_id = 71;\r
* show info box for first time users\r
*/\r
\r
+ // make handler statically available for use in "msg_to_msg_handler"\r
+ Navit_progress_h = this.progress_handler;\r
\r
Display display_ = getWindowManager().getDefaultDisplay();\r
int width_ = display_.getWidth();\r
// better use regex later, but for now to test this feature its ok :-)\r
// better use regex later, but for now to test this feature its ok :-)\r
\r
+ // d: google.navigation:q=blabla-strasse # (this happens when you are offline, or from contacts)\r
// a: google.navigation:ll=48.25676,16.643&q=blabla-strasse\r
- // b: google.navigation:q=48.25676,16.643\r
// c: google.navigation:ll=48.25676,16.643\r
+ // b: google.navigation:q=48.25676,16.643\r
+\r
String lat;\r
String lon;\r
String q;\r
String temp2 = null;\r
String temp3 = null;\r
boolean parsable = false;\r
-\r
+ boolean unparsable_info_box = true;\r
+\r
+ // DEBUG\r
+ // DEBUG\r
+ // DEBUG\r
+ // intent_data = "google.navigation:q=Wien Burggasse 27";\r
+ // intent_data = "google.navigation:q=48.25676,16.643";\r
+ // intent_data = "google.navigation:ll=48.25676,16.643&q=blabla-strasse";\r
+ // intent_data = "google.navigation:ll=48.25676,16.643";\r
+ // DEBUG\r
+ // DEBUG\r
+ // DEBUG\r
+\r
+ Log.e("Navit", "found DEBUG 1: " + intent_data.substring(0, 20));\r
+ Log.e("Navit", "found DEBUG 2: " + intent_data.substring(20, 22));\r
+ Log.e("Navit", "found DEBUG 3: " + intent_data.substring(20, 21));\r
+\r
+ // if d: then start target search\r
+ if ((intent_data.substring(0, 20).equals("google.navigation:q="))\r
+ && ((!intent_data.substring(20, 21).equals('+'))\r
+ && (!intent_data.substring(20, 21).equals('-')) && (!intent_data.substring(20,\r
+ 22).matches("[0-9][0-9]"))))\r
+ {\r
+ Log.e("Navit", "target found (d): " + intent_data.split("q=", -1)[1]);\r
+ start_targetsearch_from_intent(intent_data.split("q=", -1)[1]);\r
+ // dont use this here, already starting search, so set to "false"\r
+ parsable = false;\r
+ unparsable_info_box = false;\r
+ }\r
// if b: then remodel the input string to look like a:\r
- if (intent_data.substring(0, 20).equals("google.navigation:q="))\r
+ else if (intent_data.substring(0, 20).equals("google.navigation:q="))\r
{\r
intent_data = "ll=" + intent_data.split("q=", -1)[1] + "&q=Target";\r
+ Log.e("Navit", "target found (b): " + intent_data);\r
parsable = true;\r
}\r
// if c: then remodel the input string to look like a:\r
else if ((intent_data.substring(0, 21).equals("google.navigation:ll="))\r
- && (intent_data.split("&q=").length == 0))\r
+ && (intent_data.split("&q=").length < 2))\r
{\r
intent_data = intent_data + "&q=Target";\r
+ Log.e("Navit", "target found (c): " + intent_data);\r
parsable = true;\r
}\r
// already looks like a: just set flag\r
else if ((intent_data.substring(0, 21).equals("google.navigation:ll="))\r
- && (intent_data.split("&q=").length > 0))\r
+ && (intent_data.split("&q=").length > 1))\r
{\r
// dummy, just set the flag\r
+ Log.e("Navit", "target found (a): " + intent_data);\r
+ Log.e("Navit", "target found (a): " + intent_data.split("&q=").length);\r
parsable = true;\r
}\r
\r
}\r
else\r
{\r
- // string not parsable, display alert and continue w/o string\r
- AlertDialog.Builder alertbox = new AlertDialog.Builder(this);\r
- alertbox.setMessage("Navit recieved the query " + intent_data\r
- + "\nThis is not yet parsable.");\r
- alertbox.setPositiveButton("Ok", new DialogInterface.OnClickListener()\r
+ if (unparsable_info_box)\r
{\r
- public void onClick(DialogInterface arg0, int arg1)\r
+ // string not parsable, display alert and continue w/o string\r
+ AlertDialog.Builder alertbox = new AlertDialog.Builder(this);\r
+ alertbox.setMessage("Navit recieved the query " + intent_data\r
+ + "\nThis is not yet parsable.");\r
+ alertbox.setPositiveButton("Ok", new DialogInterface.OnClickListener()\r
{\r
- Log.e("Navit", "Accepted non-parsable string");\r
- }\r
- });\r
- alertbox.setNeutralButton("More info", new DialogInterface.OnClickListener()\r
- {\r
- public void onClick(DialogInterface arg0, int arg1)\r
+ public void onClick(DialogInterface arg0, int arg1)\r
+ {\r
+ Log.e("Navit", "Accepted non-parsable string");\r
+ }\r
+ });\r
+ alertbox.setNeutralButton("More info", new DialogInterface.OnClickListener()\r
+ {\r
+ public void onClick(DialogInterface arg0, int arg1)\r
+ {\r
+ String url = "http://wiki.navit-project.org/index.php/Navit_on_Android#Parse_error";\r
+ Intent i = new Intent(Intent.ACTION_VIEW);\r
+ i.setData(Uri.parse(url));\r
+ startActivity(i);\r
+ }\r
+ });\r
+ if (!parseErrorShown)\r
{\r
- String url = "http://wiki.navit-project.org/index.php/Navit_on_Android#Parse_error";\r
- Intent i = new Intent(Intent.ACTION_VIEW);\r
- i.setData(Uri.parse(url));\r
- startActivity(i);\r
+ alertbox.show();\r
+ parseErrorShown = true;\r
}\r
- });\r
- if (!parseErrorShown)\r
- {\r
- alertbox.show();\r
- parseErrorShown = true;\r
}\r
}\r
}\r
\r
//public native void KeypressCallback(int id, String s);\r
\r
+ public void start_targetsearch_from_intent(String target_address)\r
+ {\r
+ Navit_last_address_partial_match = false;\r
+ Navit_last_address_search_string = target_address;\r
+\r
+ // clear results\r
+ Navit.NavitAddressResultList_foundItems.clear();\r
+\r
+ if (Navit_last_address_search_string.equals(""))\r
+ {\r
+ // empty search string entered\r
+ Toast.makeText(getApplicationContext(), "No address found", Toast.LENGTH_LONG).show();\r
+ }\r
+ else\r
+ {\r
+ // show dialog\r
+ Message msg = progress_handler.obtainMessage();\r
+ Bundle b = new Bundle();\r
+ msg.what = 11;\r
+ b.putInt("dialog_num", Navit.SEARCHRESULTS_WAIT_DIALOG);\r
+ msg.setData(b);\r
+ progress_handler.sendMessage(msg);\r
+ }\r
+ }\r
\r
@Override\r
public boolean onOptionsItemSelected(MenuItem item)\r
{\r
String addr = data.getStringExtra("address_string");\r
Boolean partial_match = data.getStringExtra("partial_match").equals("1");\r
- int partial_match_i = 0;\r
- if (partial_match)\r
- {\r
- partial_match_i = 1;\r
- }\r
+\r
Navit_last_address_partial_match = partial_match;\r
Navit_last_address_search_string = addr;\r
\r
// clear results\r
Navit.NavitAddressResultList_foundItems.clear();\r
\r
- // start the search, this could take a long time!!\r
- N_NavitGraphics.SearchResultList(2, partial_match_i, addr);\r
-\r
- if (Navit.NavitAddressResultList_foundItems.size() > 0)\r
+ if (addr.equals(""))\r
{\r
- // open result list\r
- Intent address_result_list_activity = new Intent(this,\r
- NavitAddressResultListActivity.class);\r
- this.startActivityForResult(address_result_list_activity,\r
- Navit.NavitAddressResultList_id);\r
+ // empty search string entered\r
+ Toast.makeText(getApplicationContext(), "No search string entered",\r
+ Toast.LENGTH_LONG).show();\r
}\r
else\r
{\r
- Toast\r
- .makeText(\r
- getApplicationContext(),\r
- "No Results found!", Toast.LENGTH_LONG).show();\r
+ // show dialog, and start search for the results\r
+ // make it indirect, to give our activity a chance to startup\r
+ // (remember we come straight from another activity and ours is still paused!)\r
+ Message msg = progress_handler.obtainMessage();\r
+ Bundle b = new Bundle();\r
+ msg.what = 11;\r
+ b.putInt("dialog_num", Navit.SEARCHRESULTS_WAIT_DIALOG);\r
+ msg.setData(b);\r
+ progress_handler.sendMessage(msg);\r
}\r
}\r
catch (NumberFormatException e)\r
break;\r
}\r
}\r
+\r
+ public class SearchResultsThreadSpinnerThread extends Thread\r
+ {\r
+ int dialog_num;\r
+ int spinner_current_value;\r
+ private Boolean running;\r
+ Handler mHandler;\r
+ SearchResultsThreadSpinnerThread(Handler h, int dialog_num)\r
+ {\r
+ this.dialog_num = dialog_num;\r
+ this.mHandler = h;\r
+ this.spinner_current_value = 0;\r
+ this.running = true;\r
+ Log.e("Navit", "SearchResultsThreadSpinnerThread created");\r
+ }\r
+ public void run()\r
+ {\r
+ Log.e("Navit", "SearchResultsThreadSpinnerThread started");\r
+ while (this.running)\r
+ {\r
+ if (Navit.NavitAddressSearchSpinnerActive == false)\r
+ {\r
+ this.running = false;\r
+ }\r
+ else\r
+ {\r
+ Message msg = mHandler.obtainMessage();\r
+ Bundle b = new Bundle();\r
+ msg.what = 10;\r
+ b.putInt("dialog_num", this.dialog_num);\r
+ b.putInt("max", Navit.ADDRESS_RESULTS_DIALOG_MAX);\r
+ b.putInt("cur", this.spinner_current_value % (Navit.ADDRESS_RESULTS_DIALOG_MAX + 1));\r
+ b.putString("title", "getting search results");\r
+ b.putString("text", "searching ...");\r
+ msg.setData(b);\r
+ mHandler.sendMessage(msg);\r
+ try\r
+ {\r
+ Thread.sleep(700);\r
+ }\r
+ catch (InterruptedException e)\r
+ {\r
+ // e.printStackTrace();\r
+ }\r
+ this.spinner_current_value++;\r
+ }\r
+ }\r
+ Log.e("Navit", "SearchResultsThreadSpinnerThread ended");\r
+ }\r
+ }\r
+\r
+\r
+ public class SearchResultsThread extends Thread\r
+ {\r
+ private Boolean running;\r
+ Handler mHandler;\r
+ int my_dialog_num;\r
+\r
+ SearchResultsThread(Handler h, int dialog_num)\r
+ {\r
+ this.running = true;\r
+ this.mHandler = h;\r
+ this.my_dialog_num = dialog_num;\r
+ Log.e("Navit", "SearchResultsThread created");\r
+ }\r
+\r
+ public void stop_me()\r
+ {\r
+ this.running = false;\r
+ }\r
+\r
+ public void run()\r
+ {\r
+ Log.e("Navit", "SearchResultsThread started");\r
+\r
+ // initialize the dialog with sane values\r
+ Message msg = mHandler.obtainMessage();\r
+ Bundle b = new Bundle();\r
+ msg.what = 10;\r
+ b.putInt("dialog_num", this.my_dialog_num);\r
+ b.putInt("max", Navit.ADDRESS_RESULTS_DIALOG_MAX);\r
+ b.putInt("cur", 0);\r
+ b.putString("title", "getting search results");\r
+ b.putString("text", "searching ...");\r
+ msg.setData(b);\r
+ mHandler.sendMessage(msg);\r
+\r
+ int partial_match_i = 0;\r
+ if (Navit_last_address_partial_match)\r
+ {\r
+ partial_match_i = 1;\r
+ }\r
+\r
+ // start the search, this could take a long time!!\r
+ Log.e("Navit", "SearchResultsThread run1");\r
+ N_NavitGraphics.SearchResultList(2, partial_match_i, Navit_last_address_search_string);\r
+ Log.e("Navit", "SearchResultsThread run2");\r
+\r
+ Navit.NavitAddressSearchSpinnerActive = false;\r
+\r
+ if (Navit.NavitAddressResultList_foundItems.size() > 0)\r
+ {\r
+ open_search_result_list();\r
+ }\r
+ else\r
+ {\r
+ //Toast.makeText(getApplicationContext(), "No Results found!", Toast.LENGTH_LONG).show();\r
+ // not results found, show toast\r
+ msg = mHandler.obtainMessage();\r
+ b = new Bundle();\r
+ msg.what = 3;\r
+ b.putString("text", "No Results found!");\r
+ msg.setData(b);\r
+ mHandler.sendMessage(msg);\r
+ }\r
+\r
+ // ok, remove dialog\r
+ msg = mHandler.obtainMessage();\r
+ b = new Bundle();\r
+ msg.what = 99;\r
+ b.putInt("dialog_num", this.my_dialog_num);\r
+ msg.setData(b);\r
+ mHandler.sendMessage(msg);\r
+\r
+ Log.e("Navit", "SearchResultsThread ended");\r
+ }\r
+ }\r
+\r
+ public static void msg_to_msg_handler(Bundle b, int id)\r
+ {\r
+ Message msg = Navit_progress_h.obtainMessage();\r
+ msg.what = id;\r
+ b.putInt("dialog_num", Navit.SEARCHRESULTS_WAIT_DIALOG);\r
+ b.putInt("max", Navit.ADDRESS_RESULTS_DIALOG_MAX);\r
+ b.putInt("cur", Navit.NavitAddressResultList_foundItems.size()\r
+ % Navit.ADDRESS_RESULTS_DIALOG_MAX);\r
+ b.putString("title", "getting search results");\r
+ b.putString("text", "searching ...");\r
+ msg.setData(b);\r
+ Navit_progress_h.sendMessage(msg);\r
+ }\r
+\r
+ public void open_search_result_list()\r
+ {\r
+ // open result list\r
+ Intent address_result_list_activity = new Intent(this, NavitAddressResultListActivity.class);\r
+ this.startActivityForResult(address_result_list_activity, Navit.NavitAddressResultList_id);\r
+ }\r
+\r
public Handler progress_handler = new Handler()\r
{\r
public void handleMessage(Message msg)\r
msg.getData().getString("text"),\r
Toast.LENGTH_SHORT).show();\r
break;\r
+ case 3 :\r
+ Toast.makeText(getApplicationContext(),\r
+ msg.getData().getString("text"),\r
+ Toast.LENGTH_LONG).show();\r
+ break;\r
+ case 10 :\r
+ // change values - generic\r
+ int what_dialog_generic = msg.getData().getInt(\r
+ "dialog_num");\r
+ if (what_dialog_generic == SEARCHRESULTS_WAIT_DIALOG)\r
+ {\r
+ search_results_wait.setMax(msg.getData().getInt(\r
+ "max"));\r
+ search_results_wait.setProgress(msg.getData()\r
+ .getInt("cur"));\r
+ search_results_wait.setTitle(msg.getData()\r
+ .getString("title"));\r
+ search_results_wait.setMessage(msg.getData()\r
+ .getString("text"));\r
+ }\r
+ break;\r
+ case 11 :\r
+ // show dialog - generic\r
+ showDialog(msg.getData().getInt("dialog_num"));\r
+ break;\r
+ case 99 :\r
+ // dismiss dialog, remove dialog - generic\r
+ dismissDialog(msg.getData().getInt("dialog_num"));\r
+ removeDialog(msg.getData().getInt("dialog_num"));\r
+ break;\r
}\r
}\r
};\r
{\r
switch (id)\r
{\r
+ case Navit.SEARCHRESULTS_WAIT_DIALOG :\r
+ search_results_wait = new ProgressDialog(this);\r
+ search_results_wait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);\r
+ search_results_wait.setTitle("--");\r
+ search_results_wait.setMessage("--");\r
+ search_results_wait.setCancelable(false);\r
+ search_results_wait.setProgress(0);\r
+ search_results_wait.setMax(10);\r
+ DialogInterface.OnDismissListener mOnDismissListener3 = new DialogInterface.OnDismissListener()\r
+ {\r
+ public void onDismiss(DialogInterface dialog)\r
+ {\r
+ Log.e("Navit", "onDismiss: search_results_wait");\r
+ dialog.dismiss();\r
+ dialog.cancel();\r
+ searchresultsThread.stop_me();\r
+ }\r
+ };\r
+ search_results_wait.setOnDismissListener(mOnDismissListener3);\r
+ searchresultsThread = new SearchResultsThread(progress_handler,\r
+ Navit.SEARCHRESULTS_WAIT_DIALOG);\r
+ searchresultsThread.start();\r
+\r
+ NavitAddressSearchSpinnerActive = true;\r
+ spinner_thread = new SearchResultsThreadSpinnerThread(progress_handler,\r
+ Navit.SEARCHRESULTS_WAIT_DIALOG);\r
+ spinner_thread.start();\r
+\r
+ return search_results_wait;\r
case Navit.MAPDOWNLOAD_PRI_DIALOG :\r
mapdownloader_dialog_pri = new ProgressDialog(this);\r
mapdownloader_dialog_pri.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);\r
// should never get here!!\r
return null;\r
}\r
+\r
public void disableSuspend()\r
{\r
wl.acquire();\r
return true;\r
}\r
\r
- /*\r
- * A native method that is implemented by the\r
- * 'hello-jni' native library, which is packaged\r
- * with this application.\r
- */\r
public native void NavitMain(Navit x, String lang, int version, String display_density_string);\r
+\r
public native void NavitActivity(int activity);\r
\r
/*\r
- * this is used to load the 'hello-jni' library on application\r
- * startup. The library has already been unpacked into\r
- * /data/data/com.example.Navit/lib/libhello-jni.so at\r
+ * this is used to load the 'navit' native library on\r
+ * application startup. The library has already been unpacked at\r
* installation time by the package manager.\r
*/\r
static\r