From: <zo...@us...> - 2011-02-28 19:51:50
|
Revision: 4258 http://navit.svn.sourceforge.net/navit/?rev=4258&view=rev Author: zoff99 Date: 2011-02-28 19:51:44 +0000 (Mon, 28 Feb 2011) Log Message: ----------- Add:Android:get address search results on-the-fly, search for towns Modified Paths: -------------- trunk/navit/navit/android/src/org/navitproject/navit/Navit.java trunk/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java trunk/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java trunk/navit/navit/android.c trunk/navit/navit/android.h trunk/navit/navit/search.c Modified: trunk/navit/navit/android/src/org/navitproject/navit/Navit.java =================================================================== --- trunk/navit/navit/android/src/org/navitproject/navit/Navit.java 2011-02-28 18:35:15 UTC (rev 4257) +++ trunk/navit/navit/android/src/org/navitproject/navit/Navit.java 2011-02-28 19:51:44 UTC (rev 4258) @@ -61,6 +61,7 @@ { 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 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 @@ Log.e("Navit", "Result is too long"); needs_update = true; } + } catch (Exception e) { @@ -1103,6 +1108,9 @@ // 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("")) { Modified: trunk/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java =================================================================== --- trunk/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java 2011-02-28 18:35:15 UTC (rev 4257) +++ trunk/navit/navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java 2011-02-28 19:51:44 UTC (rev 4258) @@ -41,10 +41,32 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Log.e("Navit", "all ok"); + //Log.e("Navit", "all ok"); + 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()]; - Navit.Navit_Address_Result_Struct tmp = new Navit.Navit_Address_Result_Struct(); int j = 0; for (Iterator<Navit.Navit_Address_Result_Struct> i = Navit.NavitAddressResultList_foundItems .iterator(); i.hasNext();) Modified: trunk/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java =================================================================== --- trunk/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java 2011-02-28 18:35:15 UTC (rev 4257) +++ trunk/navit/navit/android/src/org/navitproject/navit/NavitGraphics.java 2011-02-28 19:51:44 UTC (rev 4258) @@ -1236,12 +1236,26 @@ 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 @@ 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) Modified: trunk/navit/navit/android.c =================================================================== --- trunk/navit/navit/android.c 2011-02-28 18:35:15 UTC (rev 4257) +++ trunk/navit/navit/android.c 2011-02-28 19:51:44 UTC (rev 4258) @@ -433,7 +433,18 @@ 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 @@ 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 @@ 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); Modified: trunk/navit/navit/android.h =================================================================== --- trunk/navit/navit/android.h 2011-02-28 18:35:15 UTC (rev 4257) +++ trunk/navit/navit/android.h 2011-02-28 19:51:44 UTC (rev 4258) @@ -1,3 +1,5 @@ +#ifdef HAVE_API_ANDROID + #include <jni.h> extern JNIEnv *jnienv; extern jobject *android_activity; @@ -6,3 +8,17 @@ 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 Modified: trunk/navit/navit/search.c =================================================================== --- trunk/navit/navit/search.c 2011-02-28 18:35:15 UTC (rev 4257) +++ trunk/navit/navit/search.c 2011-02-28 19:51:44 UTC (rev 4258) @@ -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 @@ } 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 @@ { //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 @@ //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 @@ 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 @@ } 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 @@ 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 @@ } 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 @@ { 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 @@ } 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 @@ { 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); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |