diff options
author | zoff99 <zoff99@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-02-28 19:51:44 +0000 |
---|---|---|
committer | zoff99 <zoff99@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-02-28 19:51:44 +0000 |
commit | 1218eef8de7de78d45b61ebcda3bb871a9395a2f (patch) | |
tree | 945f740da8e7cd249607976de34741399b833658 /navit | |
parent | 5c43a34b9949a417e0a3ec0888e0a2575fd57a32 (diff) | |
download | navit-1218eef8de7de78d45b61ebcda3bb871a9395a2f.tar.gz |
Add:Android:get address search results on-the-fly, search for towns
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4258 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit')
-rw-r--r-- | navit/android.c | 47 | ||||
-rw-r--r-- | navit/android.h | 16 | ||||
-rw-r--r-- | navit/android/src/org/navitproject/navit/Navit.java | 8 | ||||
-rw-r--r-- | navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java | 26 | ||||
-rw-r--r-- | navit/android/src/org/navitproject/navit/NavitGraphics.java | 22 | ||||
-rw-r--r-- | navit/search.c | 74 |
6 files changed, 158 insertions, 35 deletions
diff --git a/navit/android.c b/navit/android.c index d0d164218..a9c129209 100644 --- a/navit/android.c +++ b/navit/android.c @@ -433,6 +433,17 @@ Java_org_navitproject_navit_NavitSensors_SensorCallback( JNIEnv* env, jobject th callback_call_4((struct callback *)id, sensor, &x, &y, &z); } +void +android_return_search_result(struct jni_object *jni_o, char *str) +{ + jstring js2 = NULL; + JNIEnv* env2; + env2=jni_o->env; + js2 = (*env2)->NewStringUTF(jni_o->env,str); + (*env2)->CallVoidMethod(jni_o->env, jni_o->jo, jni_o->jm, js2); + (*env2)->DeleteLocalRef(jni_o->env, js2); +} + JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackSearchResultList( JNIEnv* env, jobject thiz, int id, int partial, jobject str) @@ -464,7 +475,7 @@ Java_org_navitproject_navit_NavitGraphics_CallbackSearchResultList( JNIEnv* env, struct gui_priv *gp; struct gui_priv gp_2; gp=&gp_2; - gp->nav=global_navit; + gp->nav=attr.u.navit; struct mapset *ms=navit_get_mapset(gp->nav); gp->sl=search_list_new(ms); @@ -514,32 +525,42 @@ Java_org_navitproject_navit_NavitGraphics_CallbackSearchResultList( JNIEnv* env, struct attr s_attr4; struct gui_priv *gp4; struct gui_priv gp_24; + + + struct jni_object my_jni_object; + my_jni_object.env=env; + my_jni_object.jo=thiz; + my_jni_object.jm=aMethodID; + gp4=&gp_24; - gp4->nav=global_navit; + gp4->nav=attr.u.navit; struct mapset *ms4=navit_get_mapset(gp4->nav); GList *ret=NULL; - ret=search_by_address(ret,ms4,s,partial); + ret=search_by_address(ret,ms4,s,partial,&my_jni_object); dbg(0,"ret=%p\n",ret); - struct search_list_result *res; + //struct search_list_result *res; // get the list in the right order - ret=g_list_reverse(ret); + //ret=g_list_reverse(ret); // set to first element - ret=g_list_first(ret); + //ret=g_list_first(ret); // iterate thru the list //dbg(0,"ret=%p\n",ret); - while (ret) - { + //while (ret) + //{ //dbg(0,"result list iterate %s\n",ret->data); // return all the results to java // return a string like: "16.766:48.76:full address name is at the end" - js2 = (*env)->NewStringUTF(env, ret->data); - (*env)->CallVoidMethod(env, thiz, aMethodID, js2); - (*env)->DeleteLocalRef(env, js2); - ret=g_list_next(ret); - } + // **android_return_search_result(&my_jni_object,ret->data); + + //## js2 = (*env)->NewStringUTF(env, ret->data); + //## (*env)->CallVoidMethod(env, thiz, aMethodID, js2); + //## (*env)->DeleteLocalRef(env, js2); + + // ret=g_list_next(ret); + //} // free the memory g_list_free(ret); //dbg(0,"ret=%p\n",ret); diff --git a/navit/android.h b/navit/android.h index 6fefd4b65..d26602e30 100644 --- a/navit/android.h +++ b/navit/android.h @@ -1,3 +1,5 @@ +#ifdef HAVE_API_ANDROID + #include <jni.h> extern JNIEnv *jnienv; extern jobject *android_activity; @@ -6,3 +8,17 @@ extern int android_version; int android_find_class_global(char *name, jclass *ret); int android_find_method(jclass class, char *name, char *args, jmethodID *ret); int android_find_static_method(jclass class, char *name, char *args, jmethodID *ret); + +struct jni_object { + JNIEnv* env; + jobject jo; + jmethodID jm; +}; + +#else + +struct jni_object { + int dummy; +}; + +#endif diff --git a/navit/android/src/org/navitproject/navit/Navit.java b/navit/android/src/org/navitproject/navit/Navit.java index 4b19c8147..465b5deb4 100644 --- a/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/android/src/org/navitproject/navit/Navit.java @@ -61,6 +61,7 @@ public class Navit extends Activity implements Handler.Callback {
public static final class Navit_Address_Result_Struct
{
+ String result_type; // TWN,STR,SHN
float lat;
float lon;
String addr;
@@ -94,6 +95,9 @@ public class Navit extends Activity implements Handler.Callback public static int download_map_id = 0;
ProgressThread progressThread_pri = null;
ProgressThread progressThread_sec = null;
+ public static int search_results_towns=0;
+ public static int search_results_streets=0;
+ public static int search_results_streets_hn=0;
SearchResultsThread searchresultsThread = null;
SearchResultsThreadSpinnerThread spinner_thread = null;
public static Boolean NavitAddressSearchSpinnerActive = false;
@@ -347,6 +351,7 @@ public class Navit extends Activity implements Handler.Callback Log.e("Navit", "Result is too long");
needs_update = true;
}
+
}
catch (Exception e)
{
@@ -1103,6 +1108,9 @@ public class Navit extends Activity implements Handler.Callback // clear results
Navit.NavitAddressResultList_foundItems.clear();
+ Navit.search_results_towns=0;
+ Navit.search_results_streets=0;
+ Navit.search_results_streets_hn=0;
if (addr.equals(""))
{
diff --git a/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java b/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java index cb0b25dd9..d2f6bc4ae 100644 --- a/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java +++ b/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java @@ -41,10 +41,32 @@ public class NavitAddressResultListActivity extends ListActivity public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
- Log.e("Navit", "all ok");
+ //Log.e("Navit", "all ok");
- this.result_list = new String[Navit.NavitAddressResultList_foundItems.size()];
Navit.Navit_Address_Result_Struct tmp = new Navit.Navit_Address_Result_Struct();
+
+ //Log.e("Navit", "###########11111111");
+ // show "town names" as results only when we dont have any street names in resultlist
+ if ((Navit.search_results_streets > 0)||(Navit.search_results_streets_hn > 0))
+ {
+ //Log.e("Navit", "###########22222222");
+ // clear out towns from result list
+ for (Iterator<Navit.Navit_Address_Result_Struct> k = Navit.NavitAddressResultList_foundItems
+ .iterator(); k.hasNext();)
+ {
+ //Log.e("Navit", "###########333333333");
+ tmp = k.next();
+ if (tmp.result_type.equals("TWN"))
+ {
+ //Log.e("Navit", "###########444444444");
+ k.remove();
+ }
+ }
+ }
+
+ Log.e("Navit", "########### "+Navit.NavitAddressResultList_foundItems.size());
+
+ this.result_list = new String[Navit.NavitAddressResultList_foundItems.size()];
int j = 0;
for (Iterator<Navit.Navit_Address_Result_Struct> i = Navit.NavitAddressResultList_foundItems
.iterator(); i.hasNext();)
diff --git a/navit/android/src/org/navitproject/navit/NavitGraphics.java b/navit/android/src/org/navitproject/navit/NavitGraphics.java index 03d17c363..0449ecd6f 100644 --- a/navit/android/src/org/navitproject/navit/NavitGraphics.java +++ b/navit/android/src/org/navitproject/navit/NavitGraphics.java @@ -1236,12 +1236,26 @@ public class NavitGraphics Navit.Navit_Address_Result_Struct tmp_addr = new Navit_Address_Result_Struct(); String[] tmp_s = s.split(":"); - tmp_addr.lat = Float.parseFloat(tmp_s[0]); - tmp_addr.lon = Float.parseFloat(tmp_s[1]); + tmp_addr.result_type = tmp_s[0]; + tmp_addr.lat = Float.parseFloat(tmp_s[1]); + tmp_addr.lon = Float.parseFloat(tmp_s[2]); // the rest ist address - tmp_addr.addr = s.substring(2 + tmp_s[0].length() + tmp_s[1].length(), s.length()); + tmp_addr.addr = s.substring(3 + tmp_s[0].length() + tmp_s[1].length() + tmp_s[2].length(), s.length()); Navit.NavitAddressResultList_foundItems.add(tmp_addr); + if (tmp_addr.result_type.equals("TWN")) + { + Navit.search_results_towns++; + } + else if (tmp_addr.result_type.equals("STR")) + { + Navit.search_results_streets++; + } + else if (tmp_addr.result_type.equals("SHN")) + { + Navit.search_results_streets_hn++; + } + // make the dialog move its bar ... Bundle b = new Bundle(); b.putInt("dialog_num", Navit.SEARCHRESULTS_WAIT_DIALOG); @@ -1249,7 +1263,7 @@ public class NavitGraphics b.putInt("cur", Navit.NavitAddressResultList_foundItems.size() % (Navit.ADDRESS_RESULTS_DIALOG_MAX + 1)); b.putString("title", "loading search results"); - b.putString("text", "found " + Navit.NavitAddressResultList_foundItems.size()); + b.putString("text", "towns:"+Navit.search_results_towns+" streets:"+(int)(Navit.search_results_streets+Navit.search_results_streets_hn)); Navit.msg_to_msg_handler(b, 10); } public void SearchResultList(int i, int partial_match, String text) diff --git a/navit/search.c b/navit/search.c index e238e9bde..158e4eb1c 100644 --- a/navit/search.c +++ b/navit/search.c @@ -30,6 +30,8 @@ #include "transform.h" #include "search.h" +#include "android.h" + struct search_list_level { struct mapset *ms; struct search_list_common *parent; @@ -860,8 +862,14 @@ search_split_phrases(char *str) } static GList * -search_address_housenumber(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude1, GList *exclude2, GList *exclude3, int partial) +search_address_housenumber(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude1, GList *exclude2, GList *exclude3, int partial, struct jni_object *jni) { + // title is wrong + // this is actually "street search" and "housenumber search" is at the bottom of this function + // + // housenumbers are not found as of now (2011-02-28) + // + //dbg(0,"enter\n"); struct search_list_result *slr; GList *tmp=phrases; @@ -874,7 +882,7 @@ search_address_housenumber(GList *result_list, struct search_list *sl, GList *ph { //dbg(0,"%p %p\n",slr->country,slr->town); //dbg(0,"%p\n",slr->street); - dbg(0,"###### Result without housenumber: country=%s country_name=%s town=%s street=%s\n",slr->country->iso2,slr->country->name,slr->town->common.town_name,slr->street->name); + //dbg(0,"###### Result without housenumber: country=%s country_name=%s town=%s street=%s\n",slr->country->iso2,slr->country->name,slr->town->common.town_name,slr->street->name); // coords of result c.x=slr->street->common.c->x; @@ -883,12 +891,18 @@ search_address_housenumber(GList *result_list, struct search_list *sl, GList *ph //dbg(0,"g=%f %f\n",g.lat,g.lng); //dbg(0,"xx1"); - // return a string like: "16.766:-48.76:full address name is at the end" + // STR -> street + // return a string like: "STR:16.766:-48.76:full address name is at the end" char buffer[400]; // ca. 9 chars : ca. 9 chars : max. 100 max. 100 max. 100 chars -> this sould be max. about 320 chars long - sprintf(&buffer,"%f:%f:%.101s, %.101s, %.101s",g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name); - dbg(0,"sprintf ok"); + sprintf(&buffer,"STR:%f:%f:%.101s, %.101s, %.101s",g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name); + //dbg(0,"sprintf ok"); result_list=g_list_prepend(result_list,g_strdup(buffer)); + +#ifdef HAVE_API_ANDROID + // return results to android as they come in ... + android_return_search_result(jni,buffer); +#endif //dbg(0,"xx3"); count++; @@ -913,12 +927,18 @@ search_address_housenumber(GList *result_list, struct search_list *sl, GList *ph transform_to_geo(slr->street->common.c->pro, &c, &g); //dbg(0,"g=%f %f\n",g.lat,g.lng); - dbg(0,"###### Result with housenumber: %s %s(%s) %s %s\n",slr->house_number->common.postal,slr->house_number->common.town_name, slr->house_number->common.district_name,slr->street->name,slr->house_number->house_number); - // return a string like: "16.766:48.76:full address name is at the end" + //dbg(0,"###### Result with housenumber: %s %s(%s) %s %s\n",slr->house_number->common.postal,slr->house_number->common.town_name, slr->house_number->common.district_name,slr->street->name,slr->house_number->house_number); + // SHN -> street with house number + // return a string like: "SHN:16.766:48.76:full address name is at the end" char buffer[400]; // ca. 9 chars : ca. 9 chars : max. 100 max. 100 max. 100 max. 15 chars -> this sould be max. about 335 chars long - sprintf(&buffer,"%f:%f:%.101s, %.101s, %.101s %.15s",g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); + sprintf(&buffer,"SHN:%f:%f:%.101s, %.101s, %.101s %.15s",g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); result_list=g_list_prepend(result_list,g_strdup(buffer)); +#ifdef HAVE_API_ANDROID + // return results to android as they come in ... + android_return_search_result(jni,buffer); +#endif + } } @@ -929,17 +949,39 @@ search_address_housenumber(GList *result_list, struct search_list *sl, GList *ph } static GList * -search_address_street(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude1, GList *exclude2, int partial) +search_address_street(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude1, GList *exclude2, int partial, struct jni_object *jni) { + // title is wrong + // this is actually "town search" !! + //dbg(0,"enter\n"); struct search_list_result *slr; GList *tmp=phrases; int count=0; + struct coord_geo g; + struct coord c; struct attr attr; attr.type=attr_street_name; while ((slr=search_list_get_result(sl))) { - //dbg(0,"##### sss1"); + dbg(0,"##### sss1"); + dbg(0,"###### Result town: country=%s country_name=%s town=%s",slr->country->iso2,slr->country->name,slr->town->common.town_name); + + // coords of result + c.x=slr->town->common.c->x; + c.y=slr->town->common.c->y; + transform_to_geo(slr->town->common.c->pro, &c, &g); + + char buffer[400]; + // TWN -> town + sprintf(&buffer,"TWN:%f:%f:%.101s, %.101s",g.lat,g.lng,slr->country->name,slr->town->common.town_name); + result_list=g_list_prepend(result_list,g_strdup(buffer)); +#ifdef HAVE_API_ANDROID + // return results to android as they come in ... + android_return_search_result(jni,buffer); +#endif + + #if 0 dbg(0,"%s %s %s %s",slr->country->car,slr->town->name,slr->town->district,slr->street->name); #endif @@ -960,7 +1002,7 @@ search_address_street(GList *result_list, struct search_list *sl, GList *phrases if (tmp != exclude1 && tmp != exclude2) { attr.u.str=tmp->data; search_list_search(sl, &attr, partial); - result_list=search_address_housenumber(result_list, sl, phrases, exclude1, exclude2, tmp, partial); + result_list=search_address_housenumber(result_list, sl, phrases, exclude1, exclude2, tmp, partial, jni); } tmp=g_list_next(tmp); } @@ -968,7 +1010,7 @@ search_address_street(GList *result_list, struct search_list *sl, GList *phrases } static GList * -search_address_town(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude, int partial) +search_address_town(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude, int partial, struct jni_object *jni) { GList *tmp=phrases; int count=0; @@ -996,7 +1038,7 @@ search_address_town(GList *result_list, struct search_list *sl, GList *phrases, { attr.u.str=tmp->data; search_list_search(sl, &attr, partial); - result_list=search_address_street(result_list, sl, phrases, exclude, tmp, partial); + result_list=search_address_street(result_list, sl, phrases, exclude, tmp, partial, jni); } tmp=g_list_next(tmp); } @@ -1004,7 +1046,7 @@ search_address_town(GList *result_list, struct search_list *sl, GList *phrases, } GList * -search_by_address(GList *result_list,struct mapset *ms, char *addr, int partial) +search_by_address(GList *result_list,struct mapset *ms, char *addr, int partial, struct jni_object *jni) { char *str=search_fix_spaces(addr); GList *tmp,*phrases=search_split_phrases(str); @@ -1019,11 +1061,11 @@ search_by_address(GList *result_list,struct mapset *ms, char *addr, int partial) { attr.u.str=tmp->data; search_list_search(sl, &attr, partial); - result_list=search_address_town(result_list, sl, phrases, tmp, partial); + result_list=search_address_town(result_list, sl, phrases, tmp, partial, jni); tmp=g_list_next(tmp); } search_list_search(sl, country_default(), partial); - ret=search_address_town(result_list, sl, phrases, NULL, partial); + ret=search_address_town(result_list, sl, phrases, NULL, partial, jni); g_free(str); dbg(0,"leave %p\n",ret); |