Fix:android:Fix and cleanup of google.navigation intent parsing
authorrikky <rikky@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 29 Sep 2011 22:26:12 +0000 (22:26 +0000)
committerrikky <rikky@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 29 Sep 2011 22:26:12 +0000 (22:26 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4802 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/android/src/org/navitproject/navit/Navit.java

index f1fe1af..34534b2 100644 (file)
@@ -23,10 +23,13 @@ import java.io.File;
 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
@@ -422,137 +425,78 @@ public class Navit extends Activity
                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