import java.io.FileInputStream;\r
import java.io.FileOutputStream;\r
import java.io.InputStream;\r
-import java.net.URLDecoder;\r
import java.util.ArrayList;\r
+import java.util.HashMap;\r
import java.util.List;\r
import java.util.Locale;\r
+import java.util.Map;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
\r
import android.app.Activity;\r
import android.app.AlertDialog;\r
super.onResume();\r
Log.e("Navit", "OnResume");\r
//InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
-\r
- String intent_data = null;\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
if (startup_intent != null)\r
{\r
if (System.currentTimeMillis() <= Navit.startup_intent_timestamp + 4000L)\r
{\r
Log.e("Navit", "**2**A " + startup_intent.getAction());\r
Log.e("Navit", "**2**D " + startup_intent.getDataString());\r
- intent_data = startup_intent.getDataString();\r
+ String navi_scheme = startup_intent.getScheme();\r
+ if ( navi_scheme != null && navi_scheme.equals("google.navigation")) {\r
+ parseNavigationURI(startup_intent.getData().getSchemeSpecificPart());\r
+ }\r
}\r
- else\r
- {\r
+ else {\r
Log.e("Navit", "timestamp for navigate_to expired! not using data");\r
}\r
}\r
+ }\r
\r
- if ((intent_data != null) && (intent_data.substring(0, 18).equals("google.navigation:")))\r
- {\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
- // 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
-\r
- String temp1 = null;\r
- String temp2 = null;\r
- String temp3 = null;\r
- boolean parsable = false;\r
- boolean unparsable_info_box = true;\r
-\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
-\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
- 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 < 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 > 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
+ private void parseNavigationURI(String schemeSpecificPart) {\r
+ String naviData[]= schemeSpecificPart.split("&");\r
+ Pattern p = Pattern.compile("(.*)=(.*)");\r
+ Map<String,String> params = new HashMap<String,String>();\r
+ for (int count=0; count < naviData.length; count++) {\r
+ Matcher m = p.matcher(naviData[count]);\r
+ \r
+ if (m.matches()) {\r
+ params.put(m.group(1), m.group(2));\r
}\r
-\r
-\r
- if (parsable)\r
- {\r
- // now string should be in form --> a:\r
- // now split the parts off\r
- temp1 = intent_data.split("&q=", -1)[0];\r
- try\r
- {\r
- temp3 = temp1.split("ll=", -1)[1];\r
- temp2 = intent_data.split("&q=", -1)[1];\r
- }\r
- catch (Exception e)\r
- {\r
- // java.lang.ArrayIndexOutOfBoundsException most likely\r
- // so let's assume we dont have '&q=xxxx'\r
- temp3 = temp1;\r
- }\r
-\r
- if (temp2 == null)\r
- {\r
- // use some default name\r
- temp2 = "Target";\r
+ }\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
+ // c: google.navigation:ll=48.25676,16.643\r
+ // b: google.navigation:q=48.25676,16.643\r
+ \r
+ Float lat;\r
+ Float lon;\r
+ Bundle b = new Bundle();\r
+ \r
+ String geoString = params.get("ll");\r
+ if (geoString != null) {\r
+ String address = params.get("q");\r
+ if (address != null) b.putString("q", address);\r
+ }\r
+ else {\r
+ geoString = params.get("q");\r
+ }\r
+ \r
+ if ( geoString != null) {\r
+ if (geoString.matches("^[+-]{0,1}\\d+(|\\.\\d*),[+-]{0,1}\\d+(|\\.\\d*)$")) {\r
+ String geo[] = geoString.split(",");\r
+ if (geo.length == 2) {\r
+ try {\r
+ lat = Float.valueOf(geo[0]);\r
+ lon = Float.valueOf(geo[1]);\r
+ b.putFloat("lat", lat);\r
+ b.putFloat("lon", lon);\r
+ Message msg = Message.obtain(N_NavitGraphics.callback_handler\r
+ , NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal());\r
+\r
+ msg.setData(b);\r
+ msg.sendToTarget();\r
+ Log.e("Navit", "target found (b): " + geoString);\r
+ } catch (NumberFormatException e) { } // nothing to do here\r
}\r
-\r
- lat = temp3.split(",", -1)[0];\r
- lon = temp3.split(",", -1)[1];\r
- q = temp2;\r
-\r
- Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal());\r
-\r
- Bundle b = new Bundle();\r
- b.putString("lat", lat);\r
- b.putString("lon", lon);\r
- b.putString("q", q);\r
- msg.setData(b);\r
- msg.sendToTarget();\r
}\r
- else\r
- {\r
- if (unparsable_info_box && !searchBoxShown)\r
- {\r
-\r
- searchBoxShown = true;\r
- String searchString = intent_data.split("q=")[1];\r
- searchString = searchString.split("&")[0];\r
- searchString = URLDecoder.decode(searchString); // decode the URL: e.g. %20 -> space\r
- Log.e("Navit", "Search String :" + searchString);\r
- executeSearch(searchString);\r
- }\r
+ else {\r
+ start_targetsearch_from_intent(geoString);\r
}\r
}\r
}\r