summaryrefslogtreecommitdiff
path: root/navit
diff options
context:
space:
mode:
authorzoff99 <zoff99@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-02-28 19:51:44 +0000
committerzoff99 <zoff99@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-02-28 19:51:44 +0000
commitca83430b395b6716bd646dc7f1156b99937e5d08 (patch)
tree945f740da8e7cd249607976de34741399b833658 /navit
parent4335966c8904c917c2152586758301f003e89203 (diff)
downloadnavit-svn-ca83430b395b6716bd646dc7f1156b99937e5d08.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.c47
-rw-r--r--navit/android.h16
-rw-r--r--navit/android/src/org/navitproject/navit/Navit.java8
-rw-r--r--navit/android/src/org/navitproject/navit/NavitAddressResultListActivity.java26
-rw-r--r--navit/android/src/org/navitproject/navit/NavitGraphics.java22
-rw-r--r--navit/search.c74
6 files changed, 158 insertions, 35 deletions
diff --git a/navit/android.c b/navit/android.c
index d0d16421..a9c12920 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 6fefd4b6..d26602e3 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 4b19c814..465b5deb 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 cb0b25dd..d2f6bc4a 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 03d17c36..0449ecd6 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 e238e9bd..158e4eb1 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);