#include "start_real.h"
#include "track.h"
-
JNIEnv *jnienv;
jobject *android_activity;
int android_version;
+struct android_search_priv
+{
+ struct jni_object search_result_obj;
+ struct event_idle *idle_ev;
+ struct callback *idle_clb;
+ struct search_list *search_list;
+ struct attr search_attr;
+ gchar **phrases;
+ int current_phrase_per_level[4];
+ int partial;
+ int found;
+};
+
int
android_find_class_global(char *name, jclass *ret)
{
JNIEXPORT void JNICALL
Java_org_navitproject_navit_Navit_NavitMain( JNIEnv* env, jobject thiz, jobject activity, jobject lang, int version, jobject display_density_string, jobject path)
{
- char *strings[]={NULL,NULL};
const char *langstr;
const char *displaydensitystr;
android_version=version;
dbg(0,"*****displaydensity=%s\n",displaydensitystr);
setenv("ANDROID_DENSITY",displaydensitystr,1);
(*env)->ReleaseStringUTFChars(env, display_density_string, displaydensitystr);
- strings[0]=(*env)->GetStringUTFChars(env, path, NULL);
- main_real(1, strings);
- (*env)->ReleaseStringUTFChars(env, path, strings[0]);
-
+ const char *strings=(*env)->GetStringUTFChars(env, path, NULL);
+ main_real(1, &strings);
+ (*env)->ReleaseStringUTFChars(env, path, strings);
}
JNIEXPORT void JNICALL
callback_call_0((struct callback *)id);
}
-
JNIEXPORT void JNICALL
Java_org_navitproject_navit_NavitSensors_SensorCallback( JNIEnv* env, jobject thiz, int id, int sensor, float x, float y, float z)
{
callback_call_4((struct callback *)id, sensor, &x, &y, &z);
}
+// type: 0=town, 1=street, 2=House#
void
-android_return_search_result(struct jni_object *jni_o, char *str)
+android_return_search_result(struct jni_object *jni_o, int type, struct pcoord *location, const char *address)
{
- 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);
+ struct coord_geo geo_location;
+ struct coord c;
+ jstring jaddress = NULL;
+ JNIEnv* env;
+ env=jni_o->env;
+ jaddress = (*env)->NewStringUTF(jni_o->env,address);
+
+ c.x=location->x;
+ c.y=location->y;
+ transform_to_geo(location->pro, &c, &geo_location);
+
+ (*env)->CallVoidMethod(jni_o->env, jni_o->jo, jni_o->jm, type, geo_location.lat, geo_location.lng, jaddress);
+ (*env)->DeleteLocalRef(jni_o->env, jaddress);
}
-JNIEXPORT void JNICALL
-Java_org_navitproject_navit_NavitGraphics_CallbackSearchResultList( JNIEnv* env, jobject thiz, int partial, jobject country, jobject str)
-{
- struct attr attr;
- const char *search_string =(*env)->GetStringUTFChars(env, str, NULL);
- dbg(0,"search '%s'\n", search_string);
-
- config_get_attr(config_get(), attr_navit, &attr, NULL);
-
- jclass cls = (*env)->GetObjectClass(env,thiz);
- jmethodID aMethodID = (*env)->GetMethodID(env, cls, "fillStringArray", "(Ljava/lang/String;)V");
- if(aMethodID != 0)
- {
- struct jni_object my_jni_object;
- GList *ret = NULL;
- struct mapset *ms4=navit_get_mapset(attr.u.navit);
- struct search_list *sl = search_list_new(ms4);
- struct attr country_attr;
- const char *str_country=(*env)->GetStringUTFChars(env, country, NULL);
-
- country_attr.type=attr_country_iso2;
- country_attr.u.str=str_country;
-
- search_list_search(sl, &country_attr, 0);
- (*env)->ReleaseStringUTFChars(env, country, str_country);
-
- my_jni_object.env=env;
- my_jni_object.jo=thiz;
- my_jni_object.jm=aMethodID;
-
- /* TODO (rikky#1#): does return nothing yet, also should use a generic callback instead of jni_object */
- ret=search_by_address(sl,search_string,partial,&my_jni_object);
- search_list_destroy(sl);
-
- dbg(0,"ret=%p\n",ret);
-
- g_list_free(ret);
- }
- else
- dbg(0,"**** Unable to get methodID: fillStringArray");
-
- (*env)->ReleaseStringUTFChars(env, str, search_string);
-}
-
-
JNIEXPORT jstring JNICALL
Java_org_navitproject_navit_NavitGraphics_CallbackLocalizedString( JNIEnv* env, jobject thiz, jobject str)
{
{
struct mapset *ms = navit_get_mapset(attr.u.navit);
struct attr type, name, data, *attrs[4];
- char *map_location=(*env)->GetStringUTFChars(env, str, NULL);
+ const char *map_location=(*env)->GetStringUTFChars(env, str, NULL);
dbg(0,"*****string=%s\n",map_location);
type.type=attr_type;
type.u.str="binfile";
{
struct mapset *ms = navit_get_mapset(attr.u.navit);
struct attr map_r;
- char *map_location=(*env)->GetStringUTFChars(env, str, NULL);
+ const char *map_location=(*env)->GetStringUTFChars(env, str, NULL);
struct map * delete_map = mapset_get_map_by_name(ms, map_location);
dbg(0,"delete map %s (%p)", map_location, delete_map);
}
return all_countries;
}
+
+static char *
+postal_str(struct search_list_result *res, int level)
+{
+ char *ret=NULL;
+ if (res->town->common.postal)
+ ret=res->town->common.postal;
+ if (res->town->common.postal_mask)
+ ret=res->town->common.postal_mask;
+ if (level == 1)
+ return ret;
+ if (res->street->common.postal)
+ ret=res->street->common.postal;
+ if (res->street->common.postal_mask)
+ ret=res->street->common.postal_mask;
+ if (level == 2)
+ return ret;
+ if (res->house_number->common.postal)
+ ret=res->house_number->common.postal;
+ if (res->house_number->common.postal_mask)
+ ret=res->house_number->common.postal_mask;
+ return ret;
+}
+
+static char *
+district_str(struct search_list_result *res, int level)
+{
+ char *ret=NULL;
+ if (res->town->common.district_name)
+ ret=res->town->common.district_name;
+ if (level == 1)
+ return ret;
+ if (res->street->common.district_name)
+ ret=res->street->common.district_name;
+ if (level == 2)
+ return ret;
+ if (res->house_number->common.district_name)
+ ret=res->house_number->common.district_name;
+ return ret;
+}
+
+static char *
+town_str(struct search_list_result *res, int level)
+{
+ char *town=res->town->common.town_name;
+ char *district=district_str(res, level);
+ char *postal=postal_str(res, level);
+ char *postal_sep=" ";
+ char *district_begin=" (";
+ char *district_end=")";
+ char *county_sep = ", Co. ";
+ char *county = res->town->common.county_name;
+ if (!postal)
+ postal_sep=postal="";
+ if (!district)
+ district_begin=district_end=district="";
+ if (!county)
+ county_sep=county="";
+
+ return g_strdup_printf("%s%s%s%s%s%s%s%s", postal, postal_sep, town, district_begin, district, district_end, county_sep, county);
+}
+
+static void
+android_search_end(struct android_search_priv *search_priv)
+{
+ dbg(1, "End search");
+ JNIEnv* env = search_priv->search_result_obj.env;
+ if (search_priv->idle_ev) {
+ event_remove_idle(search_priv->idle_ev);
+ search_priv->idle_ev=NULL;
+ }
+ if (search_priv->idle_clb) {
+ callback_destroy(search_priv->idle_clb);
+ search_priv->idle_clb=NULL;
+ }
+ jclass cls = (*env)->GetObjectClass(env,search_priv->search_result_obj.jo);
+ jmethodID finish_MethodID = (*env)->GetMethodID(env, cls, "finishAddressSearch", "()V");
+ if(finish_MethodID != 0) {
+ (*env)->CallVoidMethod(env, search_priv->search_result_obj.jo, finish_MethodID);
+ } else {
+ dbg(0, "Error method finishAddressSearch not found");
+ }
+
+ search_list_destroy(search_priv->search_list);
+ g_strfreev(search_priv->phrases);
+ g_free(search_priv);
+}
+
+static enum attr_type android_search_level[] = {
+ attr_town_or_district_name,
+ attr_street_name,
+ attr_house_number
+};
+
+static void
+android_search_idle(struct android_search_priv *search_priv)
+{
+ dbg(1, "enter android_search_idle");
+
+ struct search_list_result *res = search_list_get_result(search_priv->search_list);
+ if (res) {
+ dbg(1, "Town: %s, Street: %s\n",res->town ? res->town->common.town_name : "no town", res->street ? res->street->name : "no street");
+ search_priv->found = 1;
+ switch (search_priv->search_attr.type)
+ {
+ case attr_town_or_district_name:
+ {
+ gchar *town = town_str(res, 1);
+ android_return_search_result(&search_priv->search_result_obj, 0, res->town->common.c, town);
+ g_free(town);
+ break;
+ }
+ case attr_street_name:
+ {
+ gchar *town = town_str(res, 2);
+ gchar *address = g_strdup_printf("%.101s,%.101s, %.101s", res->country->name, town, res->street->name);
+ android_return_search_result(&search_priv->search_result_obj, 1, res->street->common.c, address);
+ g_free(address);
+ g_free(town);
+ break;
+ }
+ case attr_house_number:
+ {
+ gchar *town = town_str(res, 3);
+ gchar *address = g_strdup_printf("%.101s, %.101s, %.101s %.15s", res->country->name, town, res->street->name, res->house_number->house_number);
+ android_return_search_result(&search_priv->search_result_obj, 2, res->house_number->common.c, address);
+ g_free(address);
+ g_free(town);
+ break;
+ }
+ default:
+ dbg(0, "Unhandled search type %d", search_priv->search_attr.type);
+ }
+ } else {
+ int level = search_list_level(search_priv->search_attr.type) - 1;
+
+ if (search_priv->found) {
+ search_priv->found = 0;
+ if (search_priv->search_attr.type != attr_house_number) {
+ level++;
+ }
+ }
+ dbg(2, "test phrase: %d,%d, %d, level %d", search_priv->current_phrase_per_level[0], search_priv->current_phrase_per_level[1], search_priv->current_phrase_per_level[2] , level)
+ do {
+ while (!search_priv->phrases[++search_priv->current_phrase_per_level[level]]) {
+ dbg(2, "next phrase: %d,%d, %d, level %d", search_priv->current_phrase_per_level[0], search_priv->current_phrase_per_level[1], search_priv->current_phrase_per_level[2] , level)
+ if (level > 0) {
+ search_priv->current_phrase_per_level[level] = -1;
+ level--;
+ } else {
+ android_search_end(search_priv);
+ return;
+ }
+ }
+ } while (level > 0 ? search_priv->current_phrase_per_level[level] == search_priv->current_phrase_per_level[level-1] : 0);
+ dbg(2, "used phrase: %d,%d, %d, level %d, '%s'", search_priv->current_phrase_per_level[0], search_priv->current_phrase_per_level[1], search_priv->current_phrase_per_level[2] , level, attr_to_name(android_search_level[level]))
+ dbg(1, "Search for '%s'", search_priv->phrases[search_priv->current_phrase_per_level[level]]);
+ search_priv->search_attr.type = android_search_level[level];
+ search_priv->search_attr.u.str = search_priv->phrases[search_priv->current_phrase_per_level[level]];
+ struct attr test;
+ test.type = android_search_level[level];
+ test.u.str = search_priv->phrases[search_priv->current_phrase_per_level[level]];
+ search_list_search(search_priv->search_list, &test, search_priv->partial);
+ }
+ dbg(2, "leave");
+}
+
+static char *
+search_fix_spaces(const char *str)
+{
+ int i;
+ int len=strlen(str);
+ char c,*s,*d,*ret=g_strdup(str);
+
+ for (i = 0 ; i < len ; i++) {
+ if (ret[i] == ',' || ret[i] == ',' || ret[i] == '/')
+ ret[i]=' ';
+ }
+ s=ret;
+ d=ret;
+ len=0;
+ do {
+ c=*s++;
+ if (c != ' ' || len != 0) {
+ *d++=c;
+ len++;
+ }
+ while (c == ' ' && *s == ' ')
+ s++;
+ if (c == ' ' && *s == '\0') {
+ d--;
+ len--;
+ }
+ } while (c);
+ return ret;
+}
+
+static void start_search(struct android_search_priv *search_priv, const char *search_string)
+{
+ dbg(1,"enter %s\n", search_string);
+ char *str=search_fix_spaces(search_string);
+ search_priv->phrases = g_strsplit(str, " ", 0);
+ //ret=search_address_town(ret, sl, phrases, NULL, partial, jni);
+
+ dbg(1,"First search phrase %s", search_priv->phrases[0]);
+ search_priv->search_attr.u.str= search_priv->phrases[0];
+ search_priv->search_attr.type=attr_town_or_district_name;
+ search_list_search(search_priv->search_list, &search_priv->search_attr, search_priv->partial);
+
+ search_priv->idle_clb = callback_new_1(callback_cast(android_search_idle), search_priv);
+ search_priv->idle_ev = event_add_idle(50,search_priv->idle_clb);
+ //callback_call_0(search_priv->idle_clb);
+
+ g_free(str);
+ dbg(1,"leave\n");
+}
+
+JNIEXPORT jlong JNICALL
+Java_org_navitproject_navit_NavitAddressSearchActivity_CallbackStartAddressSearch( JNIEnv* env, jobject thiz, int partial, jobject country, jobject str)
+{
+ struct attr attr;
+ const char *search_string =(*env)->GetStringUTFChars(env, str, NULL);
+ dbg(0,"search '%s'\n", search_string);
+
+ config_get_attr(config_get(), attr_navit, &attr, NULL);
+
+ jclass cls = (*env)->GetObjectClass(env,thiz);
+ jmethodID aMethodID = (*env)->GetMethodID(env, cls, "receiveAddress", "(IFFLjava/lang/String;)V");
+ struct android_search_priv *search_priv = NULL;
+
+ if(aMethodID != 0)
+ {
+ struct mapset *ms4=navit_get_mapset(attr.u.navit);
+ struct attr country_attr;
+ const char *str_country=(*env)->GetStringUTFChars(env, country, NULL);
+ struct search_list_result *slr;
+ int count = 0;
+
+ search_priv = g_new0( struct android_search_priv, 1);
+ search_priv->search_list = search_list_new(ms4);
+ search_priv->partial = partial;
+ search_priv->current_phrase_per_level[1] = -1;
+ search_priv->current_phrase_per_level[2] = -1;
+
+ country_attr.type=attr_country_iso2;
+ country_attr.u.str=g_strdup(str_country);
+ search_list_search(search_priv->search_list, &country_attr, 0);
+
+ while ((slr=search_list_get_result(search_priv->search_list)))
+ {
+ count++;
+ }
+ if (!count)
+ dbg(0,"Country not found");
+
+ dbg(1,"search in country '%s'\n", str_country);
+ (*env)->ReleaseStringUTFChars(env, country, str_country);
+
+ search_priv->search_result_obj.env = env;
+ search_priv->search_result_obj.jo = (*env)->NewGlobalRef(env, thiz);
+ search_priv->search_result_obj.jm = aMethodID;
+
+ start_search(search_priv, search_string);
+ }
+ else
+ dbg(0,"**** Unable to get methodID: fillStringArray");
+
+ (*env)->ReleaseStringUTFChars(env, str, search_string);
+
+ return (jlong)(long)search_priv;
+}
+
+JNIEXPORT void JNICALL
+Java_org_navitproject_navit_NavitAddressSearchActivity_CallbackCancelAddressSearch( JNIEnv* env, jobject thiz, jlong handle)
+{
+ struct android_search_priv *priv = (void*)(long)handle;
+
+ if (priv)
+ android_search_end(priv);
+ else
+ dbg(0, "Error: Cancel search failed");
+}
-#ifdef HAVE_API_ANDROID
-
#include <jni.h>
extern JNIEnv *jnienv;
extern jobject *android_activity;
jobject jo;
jmethodID jm;
};
-
-#else
-
-struct jni_object {
- int dummy;
-};
-
-#endif
import java.io.File;\r
import java.io.FileOutputStream;\r
import java.io.InputStream;\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
\r
public class Navit extends Activity\r
{\r
- public static final class NavitAddress\r
- {\r
- String result_type; // TWN,STR,SHN\r
- String item_id; // H<ddddd>L<ddddd> -> item.id_hi item.id_lo\r
- float lat;\r
- float lon;\r
- String addr;\r
- }\r
\r
public NavitDialogs dialogs;\r
private PowerManager.WakeLock wl;\r
private static Intent startup_intent = null;\r
private static long startup_intent_timestamp = 0L;\r
public static String my_display_density = "mdpi";\r
- private boolean searchBoxShown = false;\r
- public static final int ADDRESS_RESULTS_DIALOG_MAX = 10;\r
public static final int NavitDownloaderSelectMap_id = 967;\r
- public static int search_results_towns = 0;\r
- public static int search_results_streets = 0;\r
- public static int search_results_streets_hn = 0;\r
public static final int MAP_NUM_PRIMARY = 11;\r
public static final int NavitAddressSearch_id = 70;\r
- public static final int NavitAddressResultList_id = 71;\r
public static String NavitLanguage;\r
-\r
- public static List<NavitAddress> NavitAddressResultList_foundItems = new ArrayList<NavitAddress>();\r
+ public static Resources NavitResources = null;\r
\r
public static final int MAP_NUM_SECONDARY = 12;\r
static final String NAVIT_PACKAGE_NAME = "org.navitproject.navit";\r
\r
private boolean extractRes(String resname, String result) {\r
boolean needs_update = false;\r
- Resources res = getResources();\r
Log.e(TAG, "Res Name " + resname + ", result " + result);\r
- int id = res.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME);\r
+ int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME);\r
Log.e(TAG, "Res ID " + id);\r
if (id == 0)\r
return false;\r
Log.e(TAG, "Extracting resource");\r
\r
try {\r
- InputStream resourcestream = res.openRawResource(id);\r
+ InputStream resourcestream = NavitResources.openRawResource(id);\r
FileOutputStream resultfilestream = new FileOutputStream(resultfile);\r
byte[] buf = new byte[1024];\r
int i = 0;\r
\r
dialogs = new NavitDialogs(this);\r
\r
+ NavitResources = getResources();\r
+\r
// only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.)\r
Navit.startup_intent = this.getIntent();\r
// hack! Remember time stamps, and only allow 4 secs. later in onResume to set target!\r
\r
public void start_targetsearch_from_intent(String target_address)\r
{\r
- NavitDialogs.Navit_last_address_partial_match = false;\r
- NavitDialogs.Navit_last_address_search_string = target_address;\r
-\r
- // clear results\r
- Navit.NavitAddressResultList_foundItems.clear();\r
-\r
- if (NavitDialogs.Navit_last_address_search_string.equals(""))\r
+ if (target_address == null || target_address.equals(""))\r
{\r
// empty search string entered\r
Toast.makeText(getApplicationContext(), getString(R.string.address_search_not_found), Toast.LENGTH_LONG).show(); //TRANS\r
}\r
else\r
{\r
- // show dialog\r
- dialogs.obtainMessage(NavitDialogs.MSG_SEARCH).sendToTarget();\r
+ Intent search_intent = new Intent(this, NavitAddressSearchActivity.class);\r
+ search_intent.putExtra("search_string", target_address);\r
+ this.startActivityForResult(search_intent, NavitAddressSearch_id);\r
}\r
}\r
\r
case 6 :\r
// ok startup address search activity\r
Intent search_intent = new Intent(this, NavitAddressSearchActivity.class);\r
- search_intent.putExtra("title", getString(R.string.address_search_title)); //TRANS\r
- search_intent.putExtra("address_string", NavitDialogs.Navit_last_address_search_string);\r
- search_intent.putExtra("partial_match", NavitDialogs.Navit_last_address_partial_match);\r
this.startActivityForResult(search_intent, NavitAddressSearch_id);\r
break;\r
case 99 :\r
break;\r
case NavitAddressSearch_id :\r
if (resultCode == Activity.RESULT_OK) {\r
- Boolean addr_selected = data.getBooleanExtra("addr_selected", false);\r
- \r
- // address already choosen, or do we have to search?\r
- if (addr_selected) {\r
- setDestination( NavitAddressResultList_foundItems .get(0).lat\r
- , NavitAddressResultList_foundItems.get(0).lon\r
- , NavitAddressResultList_foundItems.get(0).addr);\r
- } else {\r
- String addr = data.getStringExtra("address_string");\r
- Boolean partial_match = data.getBooleanExtra("partial_match", false);\r
- String country = data.getStringExtra("country");\r
- \r
- NavitDialogs.Navit_last_address_partial_match = partial_match;\r
- NavitDialogs.Navit_last_address_search_string = addr;\r
- NavitDialogs.Navit_last_country = country;\r
- \r
- // clear results\r
- Navit.NavitAddressResultList_foundItems.clear();\r
- Navit.search_results_towns = 0;\r
- Navit.search_results_streets = 0;\r
- Navit.search_results_streets_hn = 0;\r
- \r
- if (addr.equals("")) {\r
- // empty search string entered\r
- Toast.makeText(getApplicationContext(),getString(R.string.address_search_no_text_entered), Toast.LENGTH_LONG).show(); //TRANS\r
- } else {\r
- // show dialog, and start search for the results\r
- // make it indirect, to give our activity a chance to startup\r
- // (remember we come straight from another activity and ours is still paused!)\r
- dialogs.obtainMessage(NavitDialogs.MSG_SEARCH).sendToTarget();\r
- }\r
- }\r
- }\r
- break;\r
- case Navit.NavitAddressResultList_id :\r
- try\r
- {\r
- if (resultCode == Activity.RESULT_OK)\r
- {\r
- int destination_id = data.getIntExtra("selected_id", 0);\r
- \r
- setDestination( NavitAddressResultList_foundItems .get(destination_id).lat\r
- , NavitAddressResultList_foundItems.get(destination_id).lon\r
- , NavitAddressResultList_foundItems.get(destination_id).addr);\r
- }\r
- }\r
- catch (Exception e)\r
- {\r
- Log.d("Navit", "error on onActivityResult");\r
+ Bundle destination = data.getExtras();\r
+ Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + destination.getString("q"), Toast.LENGTH_LONG).show(); //TRANS\r
+\r
+ Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal());\r
+ msg.setData(destination);\r
+ msg.sendToTarget();\r
}\r
break;\r
default :\r
{\r
System.loadLibrary("navit");\r
}\r
-\r
- /*\r
- * Show a search activity with the string "search" filled in\r
- */\r
- private void executeSearch(String search)\r
- {\r
- Intent search_intent = new Intent(this, NavitAddressSearchActivity.class);\r
- search_intent.putExtra("title", getString(R.string.address_search_title)); //TRANS\r
- search_intent.putExtra("address_string", search);\r
- search_intent.putExtra("partial_match", NavitDialogs.Navit_last_address_partial_match);\r
- this.startActivityForResult(search_intent, NavitAddressSearch_id);\r
- }\r
}\r
+++ /dev/null
-package org.navitproject.navit;\r
-\r
-/**\r
- * Navit, a modular navigation system.\r
- * Copyright (C) 2005-2008 Navit Team\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * version 2 as published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the\r
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\r
- * Boston, MA 02110-1301, USA.\r
- */\r
-\r
-import java.util.Iterator;\r
-\r
-import android.app.Activity;\r
-import android.app.ListActivity;\r
-import android.content.Intent;\r
-import android.os.Bundle;\r
-import android.util.Log;\r
-import android.view.View;\r
-import android.widget.ArrayAdapter;\r
-import android.widget.ListView;\r
-\r
-public class NavitAddressResultListActivity extends ListActivity\r
-{\r
- private int selected_id = -1;\r
- private Boolean is_empty = true;\r
- public String[] result_list = new String[]{"loading results ..."};\r
-\r
- @Override\r
- public void onCreate(Bundle savedInstanceState)\r
- {\r
- super.onCreate(savedInstanceState);\r
- //Log.e("Navit", "all ok");\r
-\r
- Navit.NavitAddress tmp = new Navit.NavitAddress();\r
-\r
- Log.e("Navit", "full result count: " + Navit.NavitAddressResultList_foundItems.size());\r
-\r
- // show "town names" as results only when we dont have any street names in resultlist\r
- if ((Navit.search_results_streets > 0) || (Navit.search_results_streets_hn > 0))\r
- {\r
- // clear out towns from result list\r
- for (Iterator<Navit.NavitAddress> k = Navit.NavitAddressResultList_foundItems\r
- .iterator(); k.hasNext();)\r
- {\r
- tmp = k.next();\r
- if (tmp.result_type.equals("TWN"))\r
- {\r
- k.remove();\r
- }\r
- }\r
- }\r
-\r
- Log.e("Navit", "final result count: " + Navit.NavitAddressResultList_foundItems.size());\r
-\r
- this.result_list = new String[Navit.NavitAddressResultList_foundItems.size()];\r
- int j = 0;\r
- for (Iterator<Navit.NavitAddress> i = Navit.NavitAddressResultList_foundItems\r
- .iterator(); i.hasNext();)\r
- {\r
- tmp = i.next();\r
- this.result_list[j] = tmp.addr;\r
- j++;\r
- }\r
-\r
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,\r
- android.R.layout.simple_list_item_1, result_list);\r
- setListAdapter(adapter);\r
- is_empty = true;\r
- }\r
-\r
- public void add_item_(String item)\r
- {\r
- if (item == null)\r
- {\r
- // empty item?\r
- return;\r
- }\r
-\r
- if (this.is_empty)\r
- {\r
- // clear dummy text, and add this item\r
- this.result_list = new String[1];\r
- this.result_list[0] = item;\r
- }\r
- else\r
- {\r
- // add the item to the end of the list\r
- String[] tmp_list = this.result_list;\r
- this.result_list = new String[tmp_list.length + 1];\r
- for (int i = 0; i < tmp_list.length; i = i + 1)\r
- {\r
- this.result_list[i] = tmp_list[i];\r
- }\r
- this.result_list[tmp_list.length] = item;\r
- }\r
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,\r
- android.R.layout.simple_list_item_1, result_list);\r
- setListAdapter(adapter);\r
- this.is_empty = false;\r
- }\r
-\r
- @Override\r
- protected void onListItemClick(ListView l, View v, int position, long id)\r
- {\r
- super.onListItemClick(l, v, position, id);\r
- this.selected_id = position;\r
- Log.e("Navit", "p:" + position);\r
- Log.e("Navit", "i:" + id);\r
-\r
- // close this activity\r
- executeDone();\r
- }\r
-\r
- private void executeDone()\r
- {\r
- Intent resultIntent = new Intent();\r
- resultIntent.putExtra("selected_id", selected_id);\r
- setResult(Activity.RESULT_OK, resultIntent);\r
- \r
- NavitAppConfig navitConfig = (NavitAppConfig)getApplicationContext();\r
- navitConfig.addLastAddress(Navit.NavitAddressResultList_foundItems.get(selected_id));\r
-\r
- finish();\r
- }\r
-\r
-}\r
\r
package org.navitproject.navit;\r
\r
-\r
import java.lang.reflect.Field;\r
-import java.util.Arrays;
-import java.util.Comparator;
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Comparator;\r
import java.util.List;\r
import java.util.Locale;\r
\r
import android.app.Activity;\r
import android.app.AlertDialog;\r
+import android.app.Dialog;\r
+import android.app.ProgressDialog;\r
import android.content.DialogInterface;\r
import android.content.Intent;\r
import android.content.SharedPreferences;\r
import android.view.Gravity;\r
import android.view.View;\r
import android.view.View.OnClickListener;\r
-import android.view.WindowManager;
+import android.view.WindowManager;\r
import android.widget.AdapterView;\r
import android.widget.AdapterView.OnItemClickListener;\r
import android.widget.ArrayAdapter;\r
import android.widget.LinearLayout;\r
import android.widget.ListView;\r
import android.widget.RelativeLayout;\r
+import android.widget.Toast;\r
import android.widget.RelativeLayout.LayoutParams;\r
-import android.widget.TextView;
-\r
+import android.widget.TextView;\r
+\r
+public class NavitAddressSearchActivity extends Activity {\r
+ public static final class NavitAddress {\r
+ public NavitAddress(int type, float latitude, float longitude, String address) {\r
+ result_type = type;\r
+ lat = latitude;\r
+ lon = longitude;\r
+ addr = address;\r
+ }\r
\r
-public class NavitAddressSearchActivity extends Activity\r
-{\r
- private EditText address_string;\r
- private CheckBox pm_checkbox;\r
- private String mCountry;\r
- private ImageButton mCountryButton;\r
- \r
- public RelativeLayout NavitAddressSearchActivity_layout;\r
+ int result_type;\r
+ float lat;\r
+ float lon;\r
+ String addr;\r
+ }\r
\r
+ private static final String TAG = "NavitAddress";\r
+ private static final int ADDRESS_RESULT_PROGRESS_MAX = 10;\r
\r
- private int getDrawableID(String resourceName)\r
- {\r
+ private List<NavitAddress> Addresses_found = null;\r
+ private List<NavitAddress> addresses_shown = null;\r
+ private EditText address_string;\r
+ private CheckBox pm_checkbox;\r
+ private String mCountry;\r
+ private ImageButton mCountryButton;\r
+ ProgressDialog search_results_wait = null;\r
+ public RelativeLayout NavitAddressSearchActivity_layout;\r
+ private int search_results_towns = 0;\r
+ private int search_results_streets = 0;\r
+ private int search_results_streets_hn = 0;\r
+ private long search_handle = 0;\r
+\r
+ // TODO remember settings\r
+ private static String last_address_search_string = "";\r
+ private static Boolean last_address_partial_match = false;\r
+ private static String last_country = "";\r
+\r
+ private int getDrawableID(String resourceName) {\r
int drawableId = 0;\r
try {\r
Class<?> res = R.drawable.class;\r
Field field = res.getField(resourceName);\r
drawableId = field.getInt(null);\r
- }\r
- catch (Exception e) {\r
+ } catch (Exception e) {\r
Log.e("NavitAddressSearch", "Failure to get drawable id.", e);\r
}\r
return drawableId;\r
}\r
\r
@Override\r
- protected void onCreate(Bundle savedInstanceState)\r
- {\r
+ protected void onCreate(Bundle savedInstanceState) {\r
super.onCreate(savedInstanceState);\r
+ \r
+ Bundle extras = getIntent().getExtras();\r
+ if ( extras != null )\r
+ {\r
+ String search_string = extras.getString("search_string");\r
+ if (search_string != null) {\r
+ pm_checkbox.setChecked(true);\r
+ address_string.setText(search_string);\r
+ executeSearch();\r
+ return;\r
+ }\r
+ }\r
\r
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,\r
- WindowManager.LayoutParams.FLAG_BLUR_BEHIND);\r
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND);\r
LinearLayout panel = new LinearLayout(this);\r
panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));\r
panel.setOrientation(LinearLayout.VERTICAL);\r
SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE);\r
mCountry = settings.getString("DefaultCountry", null);\r
\r
- if (mCountry == null)\r
- {\r
+ if (mCountry == null) {\r
Locale defaultLocale = Locale.getDefault();\r
mCountry = defaultLocale.getCountry().toLowerCase(defaultLocale);\r
SharedPreferences.Editor edit_settings = settings.edit();\r
\r
mCountryButton.setImageResource(getDrawableID("country_" + mCountry + "_32_32"));\r
\r
- mCountryButton.setOnClickListener(new OnClickListener()\r
- {\r
- public void onClick(View v)\r
- {\r
+ mCountryButton.setOnClickListener(new OnClickListener() {\r
+ public void onClick(View v) {\r
requestCountryDialog();\r
}\r
});\r
\r
// address: label and text field\r
TextView addr_view = new TextView(this);\r
- addr_view.setText(Navit.get_text("Enter Destination")); //TRANS\r
+ addr_view.setText(Navit.get_text("Enter Destination")); // TRANS\r
addr_view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);\r
- addr_view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,\r
- LayoutParams.WRAP_CONTENT));\r
+ addr_view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));\r
addr_view.setPadding(4, 4, 4, 4);\r
\r
// partial match checkbox\r
pm_checkbox = new CheckBox(this);\r
- pm_checkbox.setText(Navit.get_text("partial match")); //TRANS\r
- pm_checkbox.setChecked(false);\r
+ pm_checkbox.setText(Navit.get_text("partial match")); // TRANS\r
+ pm_checkbox.setChecked(last_address_partial_match);\r
pm_checkbox.setGravity(Gravity.CENTER);\r
\r
// search button\r
final Button btnSearch = new Button(this);\r
- btnSearch.setText(Navit.get_text("Search")); //TRANS\r
- btnSearch.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,\r
- LayoutParams.WRAP_CONTENT));\r
+ btnSearch.setText(Navit.get_text("Search")); // TRANS\r
+ btnSearch.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));\r
btnSearch.setGravity(Gravity.CENTER);\r
- btnSearch.setOnClickListener(new OnClickListener()\r
- {\r
- public void onClick(View v)\r
- {\r
- executeDone();\r
+ btnSearch.setOnClickListener(new OnClickListener() {\r
+ public void onClick(View v) {\r
+ last_address_partial_match = pm_checkbox.isChecked();\r
+ last_address_search_string = address_string.getText().toString();\r
+ executeSearch();\r
}\r
});\r
\r
ListView lastAddresses = new ListView(this);\r
- NavitAppConfig navitConfig = (NavitAppConfig)getApplicationContext();\r
+ NavitAppConfig navitConfig = (NavitAppConfig) getApplicationContext();\r
\r
- final List<Navit.NavitAddress> addresses = navitConfig.getLastAddresses();\r
+ final List<NavitAddress> addresses = navitConfig.getLastAddresses();\r
int addressCount = addresses.size();\r
if (addressCount > 0) {\r
String[] strAddresses = new String[addressCount];\r
for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) {\r
strAddresses[addrIndex] = addresses.get(addrIndex).addr;\r
}\r
- ArrayAdapter<String> addressList = new ArrayAdapter<String>(this,\r
- android.R.layout.simple_list_item_1, strAddresses);\r
+ ArrayAdapter<String> addressList =\r
+ new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strAddresses);\r
lastAddresses.setAdapter(addressList);\r
lastAddresses.setOnItemClickListener(new OnItemClickListener() {\r
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {\r
+ NavitAddress addressSelected = addresses.get(arg2);\r
Intent resultIntent = new Intent();\r
- resultIntent.putExtra("addr_selected", true);\r
- \r
- Navit.NavitAddressResultList_foundItems.clear();\r
- Navit.NavitAddressResultList_foundItems.add(addresses.get(arg2));\r
\r
+ resultIntent.putExtra("lat", addressSelected.lat);\r
+ resultIntent.putExtra("lon", addressSelected.lon);\r
+ resultIntent.putExtra("q", addressSelected.addr);\r
+\r
setResult(Activity.RESULT_OK, resultIntent);\r
finish();\r
}\r
});\r
}\r
- \r
- Bundle extras = getIntent().getExtras();\r
- if ( extras != null )\r
- {\r
- String title = extras.getString("title");\r
- Boolean partial = extras.getBoolean("partial_match");\r
- String address = extras.getString("address_string");\r
\r
- if ( title != null && title.length() > 0)\r
- this.setTitle(title);\r
+ String title = getString(R.string.address_search_title);\r
\r
- pm_checkbox.setChecked(partial);\r
+ if (title != null && title.length() > 0)\r
+ this.setTitle(title);\r
\r
- address_string = new EditText(this);\r
- if (address != null)\r
- address_string.setText(address);\r
- }\r
+ address_string = new EditText(this);\r
+ address_string.setText(last_address_search_string);\r
+ address_string.setSelectAllOnFocus(true);\r
\r
LinearLayout searchSettingsLayout = new LinearLayout(this);\r
searchSettingsLayout.setOrientation(LinearLayout.HORIZONTAL);\r
setContentView(panel);\r
}\r
\r
- private void requestCountryDialog()\r
- {\r
- final String [][]all_countries = NavitGraphics.GetAllCountries();\r
-
- Comparator<String[]> country_comperator = new Comparator<String[]>(){
- public int compare(String[] object1, String[] object2) {
- return object1[1].compareTo(object2[1]);
- }};
-
- Arrays.sort(all_countries, country_comperator );
+ private void requestCountryDialog() {\r
+ final String[][] all_countries = NavitGraphics.GetAllCountries();\r
+\r
+ Comparator<String[]> country_comperator = new Comparator<String[]>() {\r
+ public int compare(String[] object1, String[] object2) {\r
+ return object1[1].compareTo(object2[1]);\r
+ }\r
+ };\r
+\r
+ Arrays.sort(all_countries, country_comperator);\r
\r
AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this);\r
// ToDo also show icons and country code\r
- String []country_name = new String[all_countries.length];\r
+ String[] country_name = new String[all_countries.length];\r
\r
- for (int country_index = 0; country_index < all_countries.length; country_index++)\r
- {\r
+ for (int country_index = 0; country_index < all_countries.length; country_index++) {\r
country_name[country_index] = all_countries[country_index][1];\r
}\r
\r
edit_settings.commit();\r
\r
mCountryButton.setImageResource(getDrawableID("country_" + mCountry + "_32_32"));\r
- }\r
+ }\r
});\r
\r
mapModeChooser.show();\r
}\r
\r
- private void executeDone()\r
- {\r
- Intent resultIntent = new Intent();\r
- resultIntent.putExtra("address_string", address_string.getText().toString());\r
- resultIntent.putExtra("country", mCountry);\r
- resultIntent.putExtra("partial_match", pm_checkbox.isChecked());\r
- setResult(Activity.RESULT_OK, resultIntent);\r
- finish();\r
+ /**\r
+ * start a search on the map\r
+ */\r
+ public void receiveAddress(int type, float latitude, float longitude, String address) {\r
+ Log.e(TAG, "(" + String.valueOf(latitude) + ", " + String.valueOf(longitude) + ") " + address);\r
+\r
+ switch (type) {\r
+ case 0:\r
+ search_results_towns++;\r
+ break;\r
+ case 1:\r
+ search_results_streets++;\r
+ break;\r
+ case 2:\r
+ search_results_streets_hn++;\r
+ break;\r
+\r
+ }\r
+ search_results_wait.setMessage(Navit.get_text("towns") + ":" + search_results_towns + " "\r
+ + Navit.get_text("Streets") + ":" + search_results_streets + "/"\r
+ + search_results_streets_hn);\r
+\r
+ search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1));\r
+\r
+ Addresses_found.add(new NavitAddress(type, latitude, longitude, address));\r
+ }\r
+\r
+ public void finishAddressSearch() {\r
+ if (Addresses_found.isEmpty()) {\r
+ Toast.makeText( getApplicationContext(),getString(R.string.address_search_not_found) + "\n" + address_string.getText().toString(), Toast.LENGTH_LONG).show(); //TRANS\r
+ setResult(Activity.RESULT_CANCELED);\r
+ finish();\r
+ }\r
+ ListView addressesFound = new ListView(this);\r
+ ArrayAdapter<String> addressList =\r
+ new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);\r
+ \r
+ addresses_shown = new ArrayList<NavitAddress>();\r
+ \r
+ for (NavitAddress currentAddress : Addresses_found) {\r
+ if (currentAddress.result_type != 0 || search_results_streets == 0) {\r
+ addressList.add(currentAddress.addr);\r
+ addresses_shown.add(currentAddress);\r
+ }\r
+ }\r
+\r
+ addressesFound.setAdapter(addressList);\r
+\r
+ addressesFound.setOnItemClickListener(new OnItemClickListener() {\r
+ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {\r
+ NavitAddress addressSelected = addresses_shown.get(arg2);\r
+ Intent resultIntent = new Intent();\r
+ \r
+ resultIntent.putExtra("lat", addressSelected.lat);\r
+ resultIntent.putExtra("lon", addressSelected.lon);\r
+ resultIntent.putExtra("q", addressSelected.addr);\r
+\r
+ setResult(Activity.RESULT_OK, resultIntent);\r
+ finish();\r
+ }\r
+ });\r
+\r
+ setContentView(addressesFound);\r
+ search_results_wait.dismiss();\r
+ }\r
+\r
+ public native long CallbackStartAddressSearch(int partial_match, String country, String s);\r
+ public native void CallbackCancelAddressSearch(long handle);\r
+\r
+ @Override\r
+ protected Dialog onCreateDialog(int id) {\r
+ search_results_wait = new ProgressDialog(this);\r
+ search_results_wait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);\r
+ search_results_wait.setTitle("loading search results");\r
+ search_results_wait.setMessage("--");\r
+ search_results_wait.setCancelable(true);\r
+ search_results_wait.setProgress(0);\r
+ search_results_wait.setMax(10);\r
+ \r
+ Addresses_found = new ArrayList<NavitAddress>();\r
+ search_results_towns = 0;\r
+ search_results_streets = 0;\r
+ search_results_streets_hn = 0;\r
+\r
+ search_handle = CallbackStartAddressSearch(pm_checkbox.isChecked() ? 1 : 0, mCountry, address_string.getText().toString());\r
+\r
+ search_results_wait.setOnCancelListener(new DialogInterface.OnCancelListener() {\r
+ @Override\r
+ public void onCancel(DialogInterface dialog) {\r
+ CallbackCancelAddressSearch(search_handle);\r
+ search_handle = 0;\r
+ search_results_wait.dismiss();\r
+ }\r
+ });\r
+ return search_results_wait;\r
+ }\r
+ \r
+ void executeSearch() {\r
+ showDialog(0);\r
}\r
}\r
+\r
import java.util.ArrayList;\r
import java.util.List;\r
\r
-import org.navitproject.navit.Navit.NavitAddress;\r
+import org.navitproject.navit.NavitAddressSearchActivity.NavitAddress;\r
\r
import android.app.Application;\r
import android.content.SharedPreferences;\r
\r
private static final int MAX_LAST_ADDRESSES = 10;\r
\r
- private List<Navit.NavitAddress> mLastAddresses = null;\r
+ private List<NavitAddress> mLastAddresses = null;\r
private int mLastAddressField;\r
private SharedPreferences mSettings;\r
\r
\r
public List<NavitAddress> getLastAddresses() {\r
if (mLastAddresses == null) {\r
- mLastAddresses = new ArrayList<Navit.NavitAddress>();\r
+ mLastAddresses = new ArrayList<NavitAddress>();\r
int mLastAddressField = mSettings.getInt("LastAddress", -1);\r
if (mLastAddressField >= 0) {\r
int index = mLastAddressField;\r
String addr_str = mSettings.getString("LastAddress_" + String.valueOf(index), "");\r
\r
if (addr_str.length() > 0) {\r
- Navit.NavitAddress address = new Navit.NavitAddress();\r
- address.addr = addr_str;\r
- address.lat = mSettings.getFloat("LastAddress_Lat_" + String.valueOf(index), 0);\r
- address.lon = mSettings.getFloat("LastAddress_Lon_" + String.valueOf(index), 0);\r
- mLastAddresses.add(address);\r
+ mLastAddresses.add(new NavitAddress(\r
+ 1,\r
+ mSettings.getFloat("LastAddress_Lat_" + String.valueOf(index), 0),\r
+ mSettings.getFloat("LastAddress_Lon_" + String.valueOf(index), 0),\r
+ addr_str));\r
}\r
\r
if (--index < 0) index = MAX_LAST_ADDRESSES - 1;\r
return mLastAddresses;\r
}\r
\r
- public void addLastAddress(Navit.NavitAddress newAddress) {\r
+ public void addLastAddress(NavitAddress newAddress) {\r
getLastAddresses();\r
\r
mLastAddresses.add(newAddress);\r
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
-import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
public class NavitDialogs extends Handler{
-
- public static Boolean NavitAddressSearchSpinnerActive = false;
- public static String Navit_last_address_search_string = "";
- public static Boolean Navit_last_address_partial_match = false;
- public static String Navit_last_country = "";
-
// Dialogs
public static final int DIALOG_MAPDOWNLOAD = 1;
- public static final int DIALOG_SEARCHRESULTS_WAIT = 3;
// dialog messages
static final int MSG_MAP_DOWNLOAD_FINISHED = 0;
static final int MSG_PROGRESS_BAR = 1;
static final int MSG_TOAST = 2;
static final int MSG_TOAST_LONG = 3;
- static final int MSG_SEARCH = 4;
- static final int MSG_PROGRESS_BAR_SEARCH = 5;
static final int MSG_POSITION_MENU = 6;
static final int MSG_START_MAP_DOWNLOAD = 7;
static final int MSG_REMOVE_DIALOG_GENERIC = 99;
static Handler mHandler;
private ProgressDialog mapdownloader_dialog = null;
- private ProgressDialog search_results_wait = null;
- private SearchResultsThread searchresultsThread = null;
- private SearchResultsThreadSpinner searchresultsSpinner = null;
private NavitMapDownloader mapdownloader = null;
private Navit mActivity;
mHandler.sendMessage(msg);
}
-
@Override
public void handleMessage(Message msg)
{
case MSG_TOAST_LONG :
Toast.makeText(mActivity, msg.getData().getString("text"), Toast.LENGTH_LONG).show();
break;
- case MSG_PROGRESS_BAR_SEARCH :
- // change values - generic
- int what_dialog_generic = msg.getData().getInt("dialog_num");
- if (what_dialog_generic == DIALOG_SEARCHRESULTS_WAIT)
- {
- search_results_wait.setMax(msg.getData().getInt("value1"));
- search_results_wait.setProgress(msg.getData().getInt("value2"));
- search_results_wait.setTitle(msg.getData().getString("title"));
- search_results_wait.setMessage(msg.getData().getString("text"));
- }
- break;
- case MSG_SEARCH :
- // show dialog - generic
- mActivity.showDialog(DIALOG_SEARCHRESULTS_WAIT);
- break;
case MSG_START_MAP_DOWNLOAD:
{
int download_map_id = msg.arg1;
{
mActivity.showDialog(NavitDialogs.DIALOG_MAPDOWNLOAD);
- mapdownloader = new NavitMapDownloader(download_map_id, NavitDialogs.DIALOG_MAPDOWNLOAD);
+ mapdownloader = new NavitMapDownloader(download_map_id);
mapdownloader.start();
}
}
{
switch (id)
{
- case DIALOG_SEARCHRESULTS_WAIT :
- search_results_wait = new ProgressDialog(mActivity);
- search_results_wait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- search_results_wait.setTitle("--");
- search_results_wait.setMessage("--");
- search_results_wait.setCancelable(false);
- search_results_wait.setProgress(0);
- search_results_wait.setMax(10);
- searchresultsThread = new SearchResultsThread(this, DIALOG_SEARCHRESULTS_WAIT);
- searchresultsThread.start();
-
- NavitAddressSearchSpinnerActive = true;
- searchresultsSpinner = new SearchResultsThreadSpinner(this, DIALOG_SEARCHRESULTS_WAIT);
- post(searchresultsSpinner);
-
- return search_results_wait;
case DIALOG_MAPDOWNLOAD :
mapdownloader_dialog = new ProgressDialog(mActivity);
mapdownloader_dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// should never get here!!
return null;
}
-
- public class SearchResultsThreadSpinner implements Runnable
- {
- int dialog_num;
- int spinner_current_value;
-
- SearchResultsThreadSpinner(Handler h, int dialog_num)
- {
- this.dialog_num = dialog_num;
- this.spinner_current_value = 0;
- Log.e("Navit", "SearchResultsThreadSpinnerThread created");
- }
- public void run()
- {
- if ( NavitAddressSearchSpinnerActive ) {
-
- sendDialogMessage( MSG_PROGRESS_BAR_SEARCH
- , Navit.get_text("getting search results")
- , Navit.get_text("searching ...")
- , dialog_num
- , Navit.ADDRESS_RESULTS_DIALOG_MAX
- , spinner_current_value % (Navit.ADDRESS_RESULTS_DIALOG_MAX + 1));
-
- spinner_current_value++;
- postDelayed(this, 700);
- }
- }
- }
-
-
- public class SearchResultsThread extends Thread
- {
- Handler mHandler;
- int my_dialog_num;
-
- SearchResultsThread(Handler h, int dialog_num)
- {
- this.mHandler = h;
- this.my_dialog_num = dialog_num;
- Log.e("Navit", "SearchResultsThread created");
- }
-
- public void run()
- {
- Log.e("Navit", "SearchResultsThread started");
- Message msg;
- Bundle bundle;
- // initialize the dialog with sane values
- sendDialogMessage( MSG_PROGRESS_BAR_SEARCH
- , Navit.get_text("getting search results")
- , Navit.get_text("searching ...")
- , my_dialog_num
- , Navit.ADDRESS_RESULTS_DIALOG_MAX
- , 0);
-
- int partial_match_i = 0;
- if (Navit_last_address_partial_match)
- {
- partial_match_i = 1;
- }
-
- // start the search, this could take a long time!!
- Log.e("Navit", "SearchResultsThread run1");
- Navit_last_address_search_string = filter_bad_chars(Navit_last_address_search_string);
- Navit.N_NavitGraphics.CallbackSearchResultList(partial_match_i, Navit_last_country, Navit_last_address_search_string);
- Log.e("Navit", "SearchResultsThread run2");
- NavitAddressSearchSpinnerActive = false;
-
- if (Navit.NavitAddressResultList_foundItems.size() > 0)
- {
- open_search_result_list();
- }
- else
- {
- // not results found, show toast
- msg = mHandler.obtainMessage(MSG_TOAST);
- bundle = new Bundle();
- bundle.putString("text", Navit.get_text("No Results found!")); //TRANS
- msg.setData(bundle);
- mHandler.sendMessage(msg);
- }
-
- // ok, remove dialog
- msg = mHandler.obtainMessage(MSG_REMOVE_DIALOG_GENERIC);
- bundle = new Bundle();
- bundle.putInt("dialog_num", this.my_dialog_num);
- msg.setData(bundle);
- mHandler.sendMessage(msg);
-
- Log.e("Navit", "SearchResultsThread ended");
- }
-
- public String filter_bad_chars(String in)
- {
- String out = in;
- out = out.replaceAll("\\n", " "); // newline -> space
- out = out.replaceAll("\\r", " "); // return -> space
- out = out.replaceAll("\\t", " "); // tab -> space
- return out;
- }
- }
-
- public void open_search_result_list()
- {
- // open result list
- Intent address_result_list_activity = new Intent(mActivity, NavitAddressResultListActivity.class);
- mActivity.startActivityForResult(address_result_list_activity, Navit.NavitAddressResultList_id);
- }
}
import java.lang.reflect.Method;
import java.util.ArrayList;
-import org.navitproject.navit.Navit.NavitAddress;
-
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
}
- /**
- * start a search on the map
- */
- public void fillStringArray(String s)
- {
- // Log.e("NavitGraphics", "**** fillStringArray s=" + s);
- // deactivate the spinner
- NavitDialogs.NavitAddressSearchSpinnerActive = false;
-
- Navit.NavitAddress tmp_addr = new NavitAddress();
- String[] tmp_s = s.split(":");
- tmp_addr.result_type = tmp_s[0];
- tmp_addr.item_id = tmp_s[1];
- tmp_addr.lat = Float.parseFloat(tmp_s[2]);
- tmp_addr.lon = Float.parseFloat(tmp_s[3]);
- // the rest ist address
- tmp_addr.addr = s.substring(4 + tmp_s[0].length() + tmp_s[1].length() + tmp_s[2].length()
- + tmp_s[3].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 ...
- NavitDialogs.sendDialogMessage( NavitDialogs.MSG_PROGRESS_BAR_SEARCH
- , Navit.get_text("loading search results")
- , Navit.get_text("towns") + ":" + Navit.search_results_towns + " "
- + Navit.get_text("Streets") + ":" + Navit.search_results_streets + "/"
- + Navit.search_results_streets_hn
- , NavitDialogs.DIALOG_SEARCHRESULTS_WAIT
- , Navit.ADDRESS_RESULTS_DIALOG_MAX
- , Navit.NavitAddressResultList_foundItems.size() % (Navit.ADDRESS_RESULTS_DIALOG_MAX + 1));
- }
-
- public native void CallbackSearchResultList(int partial_match, String country, String s);
/**
Log.d(TAG, "stop_me -> true");\r
}\r
\r
- public NavitMapDownloader(int map_id, int dialog_num)\r
+ public NavitMapDownloader(int map_id)\r
{\r
this.map_values = osm_maps[map_id];\r
}\r
* @param attr_type attribute value
* @return corresponding search list level (country=0, town=1, ...)
*/
-static int
+int
search_list_level(enum attr_type attr_type)
{
switch(attr_type) {
search_init(void)
{
}
-
-
-static char *
-search_fix_spaces(const char *str)
-{
- int i;
- int len=strlen(str);
- char c,*s,*d,*ret=g_strdup(str);
-
- for (i = 0 ; i < len ; i++) {
- if (ret[i] == ',' || ret[i] == ',' || ret[i] == '/')
- ret[i]=' ';
- }
- s=ret;
- d=ret;
- len=0;
- do {
- c=*s++;
- if (c != ' ' || len != 0) {
- *d++=c;
- len++;
- }
- while (c == ' ' && *s == ' ')
- s++;
- if (c == ' ' && *s == '\0') {
- d--;
- len--;
- }
- } while (c);
- return ret;
-}
-
-static GList *
-search_split_phrases(char *str)
-{
- char *tmp,*s,*d;
- GList *ret=NULL;
- s=str;
- do {
- tmp=g_strdup(s);
- d=tmp+strlen(s)-1;
- ret=g_list_append(ret, g_strdup(s));
- while (d >= tmp) {
- if (*d == ' ') {
- *d = '\0';
- ret=g_list_append(ret, g_strdup(tmp));
- }
- d--;
- }
- g_free(tmp);
- do {
- s++;
- if (*s == ' ') {
- s++;
- break;
- }
- } while (*s != '\0');
- } while (*s != '\0');
- return ret;
-}
-
-static GList *
-search_address_housenumber_real(GList *result_list, struct search_list *sl, char *street_name, GList *phrases, GList *exclude1, GList *exclude2, GList *exclude3, int partial, struct jni_object *jni)
-{
- // here we search actually for the housenumber
- struct search_list_result *slr;
- struct coord_geo g;
- struct coord c;
-
- dbg(1,"street:%s\n",street_name);
- while ((slr=search_list_get_result(sl)))
- {
- // does the streetname of the housenumber match the street we want?
- if (slr->street != NULL)
- if ((street_name != NULL)&&(slr->street->name != NULL))
- {
- //dbg(0,"ffffff 1.1 %s %s",street_name,slr->street->name);
- if (strcmp(slr->street->name, street_name)==0)
- {
- char *buffer;
- // coords of result
- c.x=slr->house_number->common.c->x;
- c.y=slr->house_number->common.c->y;
- transform_to_geo(slr->house_number->common.c->pro, &c, &g);
- //dbg(0,"g=%f %f\n",g.lat,g.lng);
- //dbg(0,"###### Result with housenumber: streetname=%s\n",slr->street->name);
- //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:H111L5555:16.766:48.76:full address name is at the end"
- // ca. 9 chars : ca. 9 chars : max. 100 max. 100 max. 100 max. 15 chars -> this sould be max. about 335 chars long
- if (slr->town->common.postal == NULL)
- {
- buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s, %.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name,slr->house_number->house_number);
- }
- else
- {
- buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s, %.7s %.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name,slr->street->name,slr->house_number->house_number);
- }
- // deactivated now * 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
- g_free(buffer);
- }
- }
-
- }
- return result_list;
-}
-
-static GList *
-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;
- int count=0;
- struct attr attr;
- struct coord_geo g;
- struct coord c;
- struct attr attr2;
- attr.type=attr_street_name;
- while ((slr=search_list_get_result(sl)))
- {
- char *buffer;
- //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: postal:%s\n",slr->town->common.postal);
- //dbg(0,"###### Result without housenumber: postal_mask:%s\n",slr->town->common.postal_mask);
- //dbg(0,"###### Result without housenumber: STR postal:%s\n",slr->street->common.postal);
- //dbg(0,"###### Result without housenumber: STR postal_mask:%s\n",slr->street->common.postal_mask);
- //dbg(0,"###### Result without housenumber: item id_hi:%d id_lo:%d\n",slr->street->common.item.id_hi,slr->street->common.item.id_lo);
-
- // coords of result
- c.x=slr->street->common.c->x;
- c.y=slr->street->common.c->y;
- transform_to_geo(slr->street->common.c->pro, &c, &g);
- //dbg(0,"g=%f %f\n",g.lat,g.lng);
-
- //dbg(0,"xx1");
- // STR -> street
- // return a string like: "STR:H1111L5555:16.766:-48.76:full address name is at the end"
- // ca. 9 chars : ca. 9 chars : max. 100 max. 100 max. 100 chars -> this sould be max. about 320 chars long
- if (slr->town->common.postal == NULL)
- {
- buffer=g_strdup_printf("STR:H%dL%d:%f:%f:%.101s,%.101s, %.101s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name);
- }
- else
- {
- buffer=g_strdup_printf("STR:H%dL%d:%f:%f:%.101s,%.7s %.101s, %.101s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name,slr->street->name);
- }
- // deactivated now * 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
- count++;
-
- while (tmp)
- {
- if (tmp != exclude1 && tmp != exclude2 && tmp != exclude3 && slr->street)
- {
- attr2.type=attr_house_number;
- attr2.u.str=tmp->data;
- search_list_search(sl, &attr2, partial);
- //dbg(0,"hn str=%s\n",attr2.u.str);
- result_list=search_address_housenumber_real(result_list, sl, slr->street->name, phrases, exclude1, exclude2, exclude3, partial, jni);
- }
- tmp=g_list_next(tmp);
- }
- g_free(buffer);
- }
- if (!count)
- {
- return result_list;
- }
- return result_list;
-}
-
-static GList *
-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)))
- {
- char *buffer;
- //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);
- // dbg(0,"###### Result town: postal=%s postal_mask=%s",slr->town->common.postal,slr->town->common.postal_mask);
-
- // 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);
-
- // TWN -> town
- if (slr->town->common.postal == NULL)
- {
- buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s, %.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name);
- }
- else
- {
- buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s, %.7s %.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name);
- }
- // deactivated now * 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
- /*
- dbg(0,"%s %s %s\n",slr->country->iso2,slr->town->county,slr->street->name);
- struct attr attr77;
- if (item_attr_get(&slr->town->itemt, attr_label, &attr77))
- {
- dbg(0,"***search result T=%s",attr77.u.str);
- }
- */
- count++;
- g_free(buffer);
- }
- if (!count)
- return result_list;
- //dbg(0,"count %d\n",count);
- while (tmp)
- {
- 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, jni);
- }
- tmp=g_list_next(tmp);
- }
- return result_list;
-}
-
-static GList *
-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;
- struct attr attr;
- struct search_list_result *slr;
- //dbg(0,"enter\n");
- attr.type=attr_town_or_district_name;
- while ((slr=search_list_get_result(sl)))
- {
- count++;
- }
- if (!count)
- return result_list;
- //dbg(0,"count %d\n",count);
- while (tmp)
- {
- if (tmp != exclude)
- {
- attr.u.str=tmp->data;
- search_list_search(sl, &attr, partial);
- result_list=search_address_street(result_list, sl, phrases, exclude, tmp, partial, jni);
- }
- tmp=g_list_next(tmp);
- }
- //dbg(0,"ret");
- return result_list;
-}
-
-GList *
-search_by_address(struct search_list *sl, const char *addr, int partial, struct jni_object *jni)
-{
- char *str=search_fix_spaces(addr);
- GList *phrases=search_split_phrases(str);
- GList *ret = NULL;
- dbg(0,"enter %s\n",addr);
- ret=search_address_town(ret, sl, phrases, NULL, partial, jni);
-
- g_free(str);
- dbg(0,"leave %p\n",ret);
- return ret;
-}
-
-
struct search_list_result;
struct jni_object;
struct search_list *search_list_new(struct mapset *ms);
+int search_list_level(enum attr_type attr_type);
void search_list_search(struct search_list *this_, struct attr *search_attr, int partial);
char *search_postal_merge(char *mask, char *new_);
char *search_postal_merge_replace(char *mask, char *new_);
struct search_list_result *search_list_get_result(struct search_list *this_);
void search_list_destroy(struct search_list *this_);
void search_init(void);
-GList * search_by_address(struct search_list *this_, const char *addr, int partial, struct jni_object *jni);
/* end of prototypes */
#ifdef __cplusplus
}