diff options
Diffstat (limited to 'navit/android.c')
-rw-r--r-- | navit/android.c | 591 |
1 files changed, 303 insertions, 288 deletions
diff --git a/navit/android.c b/navit/android.c index 4c6d1ff1e..f35cb274a 100644 --- a/navit/android.c +++ b/navit/android.c @@ -11,7 +11,6 @@ #include "callback.h" #include "country.h" #include "projection.h" -#include "coord.h" #include "map.h" #include "mapset.h" #include "navit_nls.h" @@ -24,8 +23,6 @@ JNIEnv *jnienv; jobject *android_activity = NULL; -jobject *android_application = NULL; -int android_version; struct android_search_priv { struct jni_object search_result_obj; @@ -39,6 +36,16 @@ struct android_search_priv { int found; }; + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *aVm, void *aReserved) { + if ((*aVm)->GetEnv(aVm,(void**)&jnienv, JNI_VERSION_1_6) != JNI_OK) { + dbg(lvl_error,"Failed to get the environment"); + return -1; + } + dbg(lvl_debug,"Found the environment"); + return JNI_VERSION_1_6; +} + int android_find_class_global(char *name, jclass *ret) { *ret=(*jnienv)->FindClass(jnienv, name); if (! *ret) { @@ -68,126 +75,119 @@ int android_find_static_method(jclass class, char *name, char *args, jmethodID * return 1; } -JNIEXPORT void JNICALL Java_org_navitproject_navit_Navit_NavitMain( JNIEnv* env, jobject thiz, jobject activity, - jobject application, jobject lang, int version, jobject display_density_string, jobject path, jobject map_path, - jboolean isLaunch) { + +/** + * @brief Starts the Navitlib for Android + * + * @param env provided by JVM + * @param thiz the calling Navit instance + * @param lang a string describing the language + * @param path relates to NAVIT_DATA_DIR on linux + * @param map_path where the binfiles are stored + */ +JNIEXPORT void JNICALL Java_org_navitproject_navit_Navit_navitMain( JNIEnv* env, jobject thiz, + jstring lang, jstring path, jstring map_path) { const char *langstr; - const char *displaydensitystr; const char *map_file_path; - android_version=version; - __android_log_print(ANDROID_LOG_ERROR,"test","called"); jnienv=env; - if (android_activity) - (*jnienv)->DeleteGlobalRef(jnienv, android_activity); - android_activity = (*jnienv)->NewGlobalRef(jnienv, activity); - if (android_application) - (*jnienv)->DeleteGlobalRef(jnienv, android_application); - android_application = (*jnienv)->NewGlobalRef(jnienv, application); + + android_activity = (*jnienv)->NewGlobalRef(jnienv, thiz); + langstr=(*env)->GetStringUTFChars(env, lang, NULL); - dbg(lvl_debug,"enter env=%p thiz=%p activity=%p lang=%s version=%d",env,thiz,android_activity,langstr,version); + dbg(lvl_debug,"enter env=%p thiz=%p activity=%p lang=%s",env,thiz,android_activity,langstr); setenv("LANG",langstr,1); (*env)->ReleaseStringUTFChars(env, lang, langstr); - displaydensitystr=(*env)->GetStringUTFChars(env, display_density_string, NULL); - dbg(lvl_debug,"*****displaydensity=%s",displaydensitystr); - setenv("ANDROID_DENSITY",displaydensitystr,1); - (*env)->ReleaseStringUTFChars(env, display_density_string, displaydensitystr); - map_file_path=(*env)->GetStringUTFChars(env, map_path, NULL); setenv("NAVIT_USER_DATADIR",map_file_path,1); - (*env)->ReleaseStringUTFChars(env, display_density_string, map_file_path); + (*env)->ReleaseStringUTFChars(env, map_path, map_file_path); - if (isLaunch) { - const char *strings=(*env)->GetStringUTFChars(env, path, NULL); - main_real(1, &strings); - (*env)->ReleaseStringUTFChars(env, path, strings); - } + const char *strings=(*env)->GetStringUTFChars(env, path, NULL); + main_real(1, &strings); + (*env)->ReleaseStringUTFChars(env, path, strings); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_Navit_NavitDestroy( JNIEnv* env) { +JNIEXPORT void JNICALL Java_org_navitproject_navit_Navit_navitDestroy( JNIEnv* env, jobject thiz) { dbg(lvl_debug, "shutdown navit"); exit(0); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_SizeChangedCallback( JNIEnv* env, jobject thiz, int id, - int w, int h) { - dbg(lvl_debug,"enter %p %d %d",(struct callback *)id,w,h); - if (id) - callback_call_2((struct callback *)id,w,h); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_sizeChangedCallback( JNIEnv* env, jobject thiz, + jlong id, jint w, jint h) { + dbg(lvl_debug,"enter %p %d %d",(struct callback *)(intptr_t)id,w,h); + if (id) { + callback_call_2((struct callback *)(intptr_t)id, w, h); + } } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_PaddingChangedCallback(JNIEnv* env, jobject thiz, - int id, int left, int top, int right, int bottom) { - dbg(lvl_debug,"enter %p %d %d %d %d",(struct callback *)id, left, top, right, bottom); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_paddingChangedCallback(JNIEnv* env, jobject thiz, + jlong id, jint left, jint top, jint right, jint bottom) { + dbg(lvl_debug,"enter %p %d %d %d %d",(struct callback *)(intptr_t)id, left, top, right, bottom); if (id) - callback_call_4((struct callback *)id, left, top, right, bottom); + callback_call_4((struct callback *)(intptr_t)id, left, top, right, bottom); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_ButtonCallback( JNIEnv* env, jobject thiz, int id, - int pressed, int button, int x, int y) { - dbg(lvl_debug,"enter %p %d %d",(struct callback *)id,pressed,button); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_buttonCallback( JNIEnv* env, jobject thiz, + jlong id, jint pressed, jint button, jint x, jint y) { + dbg(lvl_debug,"enter %p %d %d",(struct callback *)(intptr_t)id,pressed,button); if (id) - callback_call_4((struct callback *)id,pressed,button,x,y); + callback_call_4((struct callback *)(intptr_t)id,pressed,button,x,y); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_MotionCallback( JNIEnv* env, jobject thiz, int id, - int x, int y) { - dbg(lvl_debug,"enter %p %d %d",(struct callback *)id,x,y); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_motionCallback( JNIEnv* env, jobject thiz, + jlong id, jint x, jint y) { + dbg(lvl_debug,"enter %p %d %d",(struct callback *)(intptr_t)id,x,y); if (id) - callback_call_2((struct callback *)id,x,y); + callback_call_2((struct callback *)(intptr_t)id,x,y); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_KeypressCallback( JNIEnv* env, jobject thiz, int id, - jobject str) { +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitGraphics_keypressCallback( JNIEnv* env, jobject thiz, + jlong id, jstring str) { const char *s; - dbg(lvl_debug,"enter %p %p",(struct callback *)id,str); + dbg(lvl_debug,"enter %p %p",(struct callback *)(intptr_t)id,str); s=(*env)->GetStringUTFChars(env, str, NULL); dbg(lvl_debug,"key=%s",s); if (id) - callback_call_1((struct callback *)id,s); + callback_call_1((struct callback *)(intptr_t)id,s); (*env)->ReleaseStringUTFChars(env, str, s); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitTimeout_TimeoutCallback( JNIEnv* env, jobject thiz, int id) { - void (*event_handler)(void *) = *(void **)id; - dbg(lvl_debug,"enter %p %p",thiz, (void *)id); - event_handler((void*)id); -} - -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitVehicle_VehicleCallback( JNIEnv * env, jobject thiz, int id, - jobject location) { - callback_call_1((struct callback *)id, (void *)location); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitTimeout_timeoutCallback( JNIEnv* env, jobject thiz, + jlong id) { + dbg(lvl_debug,"enter %p %p %p",thiz,(void *)id, (void *)(intptr_t)id); + void (*event_handler)(void *) = *((void **)(intptr_t)id); + event_handler((void*)(intptr_t)id); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitIdle_IdleCallback( JNIEnv* env, jobject thiz, int id) { - dbg(lvl_debug,"enter %p %p",thiz, (void *)id); - callback_call_0((struct callback *)id); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitVehicle_vehicleCallback( JNIEnv * env, jobject thiz, + jlong id, jobject location) { + callback_call_1((struct callback *)(intptr_t)id, (void *)location); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitWatch_poll( JNIEnv* env, jobject thiz, int func, int fd, - int cond) { +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitWatch_poll( JNIEnv* env, jobject thiz, jlong func, jint fd, + jint cond) { void (*pollfunc)(JNIEnv *env, int fd, int cond)=(void *)func; pollfunc(env, fd, cond); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitWatch_WatchCallback( JNIEnv* env, jobject thiz, int id) { - dbg(lvl_debug,"enter %p %p",thiz, (void *)id); - callback_call_0((struct callback *)id); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitWatch_watchCallback( JNIEnv* env, jobject thiz, jlong id) { + dbg(lvl_debug,"enter %p %p",thiz, (void *)(intptr_t)id); + callback_call_0((struct callback *)(intptr_t)id); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitSensors_SensorCallback( JNIEnv* env, jobject thiz, int id, - int sensor, float x, float y, float z) { - dbg(lvl_debug,"enter %p %p %f %f %f",thiz, (void *)id,x,y,z); - callback_call_4((struct callback *)id, sensor, &x, &y, &z); +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitSensors_sensorCallback( JNIEnv* env, jobject thiz, + jlong id, jint sensor, jfloat x, jfloat y, jfloat z) { + dbg(lvl_debug,"enter %p %p %f %f %f",thiz, (void *)(intptr_t)id,x,y,z); + callback_call_4((struct callback *)(intptr_t)id, sensor, &x, &y, &z); } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitTraff_onFeedReceived(JNIEnv * env, jobject thiz, int id, - jstring feed) { +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitTraff_onFeedReceived(JNIEnv * env, jobject thiz, + jlong id, jstring feed) { const char *s; s = (*env)->GetStringUTFChars(env, feed, NULL); if (id) - callback_call_1((struct callback *) id, s); + callback_call_1((struct callback *)(intptr_t) id, s); (*env)->ReleaseStringUTFChars(env, feed, s); } @@ -208,8 +208,8 @@ void android_return_search_result(struct jni_object *jni_o, int type, struct pco (*env)->DeleteLocalRef(jni_o->env, jaddress); } -JNIEXPORT jstring JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackLocalizedString( JNIEnv* env, jobject thiz, - jobject str) { +JNIEXPORT jstring JNICALL Java_org_navitproject_navit_NavitAppConfig_callbackLocalizedString( JNIEnv* env, jclass thiz, + jstring str) { const char *s; const char *localized_str; @@ -221,19 +221,146 @@ JNIEXPORT jstring JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackLoca // jstring dataStringValue = (jstring) localized_str; jstring js = (*env)->NewStringUTF(env,localized_str); - (*env)->ReleaseStringUTFChars(env, str, s); - return js; } -JNIEXPORT jint JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackMessageChannel( JNIEnv* env, jobject thiz, - int channel, jobject str) { + +JNIEXPORT jstring JNICALL Java_org_navitproject_navit_NavitGraphics_getDefaultCountry( JNIEnv* env, jobject thiz, + jint channel, jstring str) { + struct attr search_attr, country_name, country_iso2, *country_attr; + struct tracking *tracking; + struct search_list_result *res; + jstring return_string = NULL; + + struct attr attr; + dbg(lvl_debug,"enter %d %p",channel,str); + + config_get_attr(config_get(), attr_navit, &attr, NULL); + + country_attr=country_default(); + tracking=navit_get_tracking(attr.u.navit); + if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) { + country_attr = &search_attr; + } + if (country_attr) { + struct country_search *cs=country_search_new(country_attr, 0); + struct item *item=country_search_get_item(cs); + if (item && item_attr_get(item, attr_country_name, &country_name)) { + struct mapset *ms=navit_get_mapset(attr.u.navit); + struct search_list *search_list = search_list_new(ms); + search_attr.type=attr_country_all; + dbg(lvl_debug,"country %s", country_name.u.str); + search_attr.u.str=country_name.u.str; + search_list_search(search_list, &search_attr, 0); + while((res=search_list_get_result(search_list))) { + dbg(lvl_debug,"Get result: %s", res->country->iso2); + } + if (item_attr_get(item, attr_country_iso2, &country_iso2)) { + return_string = (*env)->NewStringUTF(env, country_iso2.u.str); + } + } + country_search_destroy(cs); + } + + return return_string; +} + + +JNIEXPORT jobjectArray JNICALL Java_org_navitproject_navit_NavitGraphics_getAllCountries( JNIEnv* env, + jclass thiz) { + struct attr search_attr; + struct search_list_result *res; + GList* countries = NULL; + int country_count = 0; + jobjectArray all_countries; + + struct attr attr; + dbg(lvl_debug,"enter"); + + config_get_attr(config_get(), attr_navit, &attr, NULL); + + struct mapset *ms=navit_get_mapset(attr.u.navit); + struct search_list *search_list = search_list_new(ms); + jobjectArray current_country = NULL; + search_attr.type=attr_country_all; + //dbg(lvl_debug,"country %s", country_name.u.str); + search_attr.u.str=g_strdup("");//country_name.u.str; + search_list_search(search_list, &search_attr, 1); + while((res=search_list_get_result(search_list))) { + dbg(lvl_debug,"Get result: %s", res->country->iso2); + + if (strlen(res->country->iso2)==2) { + jstring j_iso2 = (*env)->NewStringUTF(env, res->country->iso2); + jstring j_name = (*env)->NewStringUTF(env, navit_nls_gettext(res->country->name)); + + current_country = (jobjectArray)(*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "java/lang/String"), NULL); + + (*env)->SetObjectArrayElement(env, current_country, 0, j_iso2); + (*env)->SetObjectArrayElement(env, current_country, 1, j_name); + + (*env)->DeleteLocalRef(env, j_iso2); + (*env)->DeleteLocalRef(env, j_name); + + countries = g_list_prepend(countries, current_country); + country_count++; + } + } + + search_list_destroy(search_list); + all_countries = (jobjectArray)(*env)->NewObjectArray(env, country_count, (*env)->GetObjectClass(env,current_country), + NULL); + + while(countries) { + (*env)->SetObjectArrayElement(env, all_countries, --country_count, countries->data); + countries = g_list_delete_link( countries, countries); + } + + return all_countries; +} + + +JNIEXPORT jstring JNICALL Java_org_navitproject_navit_NavitGraphics_getCoordForPoint( JNIEnv* env, + jobject thiz, jint x, jint y, jboolean absolute_coord) { + + jstring return_string = NULL; + + struct attr attr; + config_get_attr(config_get(), attr_navit, &attr, NULL); + + struct transformation *transform=navit_get_trans(attr.u.navit); + struct point p; + struct coord c; + struct pcoord pc; + + p.x = x; + p.y = y; + + transform_reverse(transform, &p, &c); + + pc.x = c.x; + pc.y = c.y; + pc.pro = transform_get_projection(transform); + + char coord_str[32]; + if (absolute_coord) { + pcoord_format_absolute(&pc, coord_str, sizeof(coord_str), ","); + } else { + pcoord_format_degree_short(&pc, coord_str, sizeof(coord_str), " "); + } + + dbg(lvl_error,"Display point x=%d y=%d is \"%s\"",x,y,coord_str); + return_string = (*env)->NewStringUTF(env,coord_str); + + return return_string; +} + +JNIEXPORT jint JNICALL Java_org_navitproject_navit_NavitGraphics_callbackMessageChannel( JNIEnv* env, jclass thiz, + jint channel, jstring str) { struct attr attr; const char *s; jint ret = 0; dbg(lvl_debug,"enter %d %p",channel,str); - config_get_attr(config_get(), attr_navit, &attr, NULL); switch(channel) { @@ -247,84 +374,82 @@ JNIEXPORT jint JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackMessage navit_zoom_out_cursor(attr.u.navit, 2); navit_draw(attr.u.navit); break; - case 6: { // add a map to the current mapset, return 1 on success + case 6: {// add a map to the current mapset, return 1 on success struct mapset *ms = navit_get_mapset(attr.u.navit); struct attr type, name, data, *attrs[4]; - const char *map_location=(*env)->GetStringUTFChars(env, str, NULL); - dbg(lvl_debug,"*****string=%s",map_location); - type.type=attr_type; - type.u.str="binfile"; + const char *map_location = (*env)->GetStringUTFChars(env, str, NULL); + dbg(lvl_debug, "*****string=%s", map_location); + type.type = attr_type; + type.u.str = "binfile"; - data.type=attr_data; - data.u.str=g_strdup(map_location); + data.type = attr_data; + data.u.str = g_strdup(map_location); - name.type=attr_name; - name.u.str=g_strdup(map_location); + name.type = attr_name; + name.u.str = g_strdup(map_location); - attrs[0]=&type; - attrs[1]=&data; - attrs[2]=&name; - attrs[3]=NULL; + attrs[0] = &type; + attrs[1] = &data; + attrs[2] = &name; + attrs[3] = NULL; - struct map * new_map = map_new(NULL, attrs); + struct map *new_map = map_new(NULL, attrs); if (new_map) { struct attr map_a; - map_a.type=attr_map; - map_a.u.map=new_map; + map_a.type = attr_map; + map_a.u.map = new_map; ret = mapset_add_attr(ms, &map_a); navit_draw(attr.u.navit); } (*env)->ReleaseStringUTFChars(env, str, map_location); + break; } - break; - case 7: { // remove a map to the current mapset, return 1 on success + case 7: { // remove a map from the current mapset, return 1 on success struct mapset *ms = navit_get_mapset(attr.u.navit); struct attr map_r; - const char *map_location=(*env)->GetStringUTFChars(env, str, NULL); - struct map * delete_map = mapset_get_map_by_name(ms, map_location); + const char *map_location = (*env)->GetStringUTFChars(env, str, NULL); + struct map *delete_map = mapset_get_map_by_name(ms, map_location); if (delete_map) { - dbg(lvl_debug,"delete map %s (%p)", map_location, delete_map); - map_r.type=attr_map; - map_r.u.map=delete_map; + dbg(lvl_debug, "delete map %s (%p)", map_location, delete_map); + map_r.type = attr_map; + map_r.u.map = delete_map; ret = mapset_remove_attr(ms, &map_r); navit_draw(attr.u.navit); } (*env)->ReleaseStringUTFChars(env, str, map_location); + break; } - break; case 5: // call a command (like in gui) - s=(*env)->GetStringUTFChars(env, str, NULL); - dbg(lvl_debug,"*****string=%s",s); - command_evaluate(&attr,s); + s = (*env)->GetStringUTFChars(env, str, NULL); + dbg(lvl_debug, "*****string=%s", s); + command_evaluate(&attr, s); (*env)->ReleaseStringUTFChars(env, str, s); break; - case 4: { - // navigate to display position + case 4: { // navigate to display position char *pstr; struct point p; struct coord c; struct pcoord pc; + struct transformation *transform = navit_get_trans(attr.u.navit); - struct transformation *transform=navit_get_trans(attr.u.navit); - - s=(*env)->GetStringUTFChars(env, str, NULL); + s = (*env)->GetStringUTFChars(env, str, NULL); char parse_str[strlen(s) + 1]; strcpy(parse_str, s); (*env)->ReleaseStringUTFChars(env, str, s); - dbg(lvl_debug,"*****string=%s",parse_str); + dbg(lvl_debug, "*****string=%s", parse_str); // set destination to (pixel-x#pixel-y) // pixel-x - pstr = strtok (parse_str,"#"); + pstr = strtok(parse_str, "#"); p.x = atoi(pstr); // pixel-y - pstr = strtok (NULL, "#"); + pstr = strtok(NULL, "#"); p.y = atoi(pstr); - dbg(lvl_debug,"11x=%d",p.x); - dbg(lvl_debug,"11y=%d",p.y); + dbg(lvl_debug, "11x=%d", p.x); + dbg(lvl_debug, "11y=%d", p.y); transform_reverse(transform, &p, &c); @@ -333,22 +458,20 @@ JNIEXPORT jint JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackMessage pc.pro = transform_get_projection(transform); char coord_str[32]; - pcoord_format_short(&pc, coord_str, sizeof(coord_str), " "); - + //pcoord_format_short(&pc, coord_str, sizeof(coord_str), " "); + pcoord_format_degree_short(&pc, coord_str, sizeof(coord_str), " "); dbg(lvl_debug,"Setting destination to %s",coord_str); - // start navigation asynchronous navit_set_destination(attr.u.navit, &pc, coord_str, 1); } - break; case 3: { // navigate to geo position char *name; - s=(*env)->GetStringUTFChars(env, str, NULL); + s = (*env)->GetStringUTFChars(env, str, NULL); char parse_str[strlen(s) + 1]; strcpy(parse_str, s); (*env)->ReleaseStringUTFChars(env, str, s); - dbg(lvl_debug,"*****string=%s",s); + dbg(lvl_debug, "*****string=%s", s); // set destination to (lat#lon#title) struct coord_geo g; @@ -356,31 +479,34 @@ JNIEXPORT jint JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackMessage char *stopstring; // lat - p = strtok (parse_str,"#"); + p = strtok(parse_str, "#"); g.lat = strtof(p, &stopstring); // lon - p = strtok (NULL, "#"); + p = strtok(NULL, "#"); g.lng = strtof(p, &stopstring); // description - name = strtok (NULL, "#"); + name = strtok(NULL, "#"); - dbg(lvl_debug,"lat=%f",g.lat); - dbg(lvl_debug,"lng=%f",g.lng); - dbg(lvl_debug,"str1=%s",name); + dbg(lvl_debug, "lat=%f", g.lat); + dbg(lvl_debug, "lng=%f", g.lng); + dbg(lvl_debug, "str1=%s", name); struct coord c; transform_from_geo(projection_mg, &g, &c); struct pcoord pc; - pc.x=c.x; - pc.y=c.y; - pc.pro=projection_mg; - + pc.x = c.x; + pc.y = c.y; + pc.pro = projection_mg; + char coord_str[32]; + if (!name || *name == '\0') { + pcoord_format_degree_short(&pc, coord_str, sizeof(coord_str), " "); + name = coord_str; + } // start navigation asynchronous navit_set_destination(attr.u.navit, &pc, name, 1); - + break; } - break; default: dbg(lvl_error, "Unknown command: %d", channel); } @@ -388,123 +514,6 @@ JNIEXPORT jint JNICALL Java_org_navitproject_navit_NavitGraphics_CallbackMessage return ret; } -JNIEXPORT jstring JNICALL Java_org_navitproject_navit_NavitGraphics_getCoordForPoint( JNIEnv* env, jobject thiz, - jint id, int x, int y) { - - jstring return_string = NULL; - - struct attr attr; - config_get_attr(config_get(), attr_navit, &attr, NULL); - - struct transformation *transform=navit_get_trans(attr.u.navit); - struct point p; - struct coord c; - struct pcoord pc; - - p.x = x; - p.y = y; - - transform_reverse(transform, &p, &c); - - pc.x = c.x; - pc.y = c.y; - pc.pro = transform_get_projection(transform); - - char coord_str[32]; - pcoord_format_short(&pc, coord_str, sizeof(coord_str), " "); - - dbg(lvl_debug,"Display point x=%d y=%d is \"%s\"",x,y,coord_str); - return_string = (*env)->NewStringUTF(env,coord_str); - return return_string; -} - -JNIEXPORT jstring JNICALL Java_org_navitproject_navit_NavitGraphics_GetDefaultCountry( JNIEnv* env, jobject thiz, - int channel, jobject str) { - struct attr search_attr, country_name, country_iso2, *country_attr; - struct tracking *tracking; - struct search_list_result *res; - jstring return_string = NULL; - - struct attr attr; - dbg(lvl_debug,"enter %d %p",channel,str); - - config_get_attr(config_get(), attr_navit, &attr, NULL); - - country_attr=country_default(); - tracking=navit_get_tracking(attr.u.navit); - if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) - country_attr=&search_attr; - if (country_attr) { - struct country_search *cs=country_search_new(country_attr, 0); - struct item *item=country_search_get_item(cs); - if (item && item_attr_get(item, attr_country_name, &country_name)) { - struct mapset *ms=navit_get_mapset(attr.u.navit); - struct search_list *search_list = search_list_new(ms); - search_attr.type=attr_country_all; - dbg(lvl_debug,"country %s", country_name.u.str); - search_attr.u.str=country_name.u.str; - search_list_search(search_list, &search_attr, 0); - while((res=search_list_get_result(search_list))) { - dbg(lvl_debug,"Get result: %s", res->country->iso2); - } - if (item_attr_get(item, attr_country_iso2, &country_iso2)) - return_string = (*env)->NewStringUTF(env,country_iso2.u.str); - } - country_search_destroy(cs); - } - - return return_string; -} - -JNIEXPORT jobjectArray JNICALL Java_org_navitproject_navit_NavitGraphics_GetAllCountries( JNIEnv* env, jobject thiz) { - struct attr search_attr; - struct search_list_result *res; - GList* countries = NULL; - int country_count = 0; - jobjectArray all_countries; - - struct attr attr; - dbg(lvl_debug,"enter"); - - config_get_attr(config_get(), attr_navit, &attr, NULL); - - struct mapset *ms=navit_get_mapset(attr.u.navit); - struct search_list *search_list = search_list_new(ms); - jobjectArray current_country = NULL; - search_attr.type=attr_country_all; - //dbg(lvl_debug,"country %s", country_name.u.str); - search_attr.u.str=g_strdup("");//country_name.u.str; - search_list_search(search_list, &search_attr, 1); - while((res=search_list_get_result(search_list))) { - dbg(lvl_debug,"Get result: %s", res->country->iso2); - - if (strlen(res->country->iso2)==2) { - jstring j_iso2 = (*env)->NewStringUTF(env, res->country->iso2); - jstring j_name = (*env)->NewStringUTF(env, navit_nls_gettext(res->country->name)); - - current_country = (jobjectArray)(*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "java/lang/String"), NULL); - - (*env)->SetObjectArrayElement(env, current_country, 0, j_iso2); - (*env)->SetObjectArrayElement(env, current_country, 1, j_name); - - (*env)->DeleteLocalRef(env, j_iso2); - (*env)->DeleteLocalRef(env, j_name); - - countries = g_list_prepend(countries, current_country); - country_count++; - } - } - - search_list_destroy(search_list); - all_countries = (jobjectArray)(*env)->NewObjectArray(env, country_count, (*env)->GetObjectClass(env, current_country), - NULL); - - while(countries) { - (*env)->SetObjectArrayElement(env, all_countries, --country_count, countries->data); - countries = g_list_delete_link( countries, countries); - } - return all_countries; -} static char *postal_str(struct search_list_result *res, int level) { char *ret=NULL; @@ -558,8 +567,8 @@ static char *town_str(struct search_list_result *res, int level) { 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); + 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) { @@ -592,41 +601,46 @@ static enum attr_type android_search_level[] = { attr_house_number }; +static void android_search_idle_result(struct android_search_priv *search_priv, struct search_list_result *res) { +// commented out because otherwise cyclomatic complexity needleslly reported as too high +// dbg(lvl_debug, "Town: %s, Street: %s",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(lvl_error, "Unhandled search type %d", search_priv->search_attr.type); + } +} + static void android_search_idle(struct android_search_priv *search_priv) { dbg(lvl_debug, "enter android_search_idle"); struct search_list_result *res = search_list_get_result(search_priv->search_list); if (res) { - dbg(lvl_debug, "Town: %s, Street: %s",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(lvl_error, "Unhandled search type %d", search_priv->search_attr.type); - } + android_search_idle_result(search_priv, res); } else { int level = search_list_level(search_priv->search_attr.type) - 1; @@ -672,7 +686,7 @@ static char *search_fix_spaces(const char *str) { char c,*s,*d,*ret=g_strdup(str); for (i = 0 ; i < len ; i++) { - if (ret[i] == ',' || ret[i] == ',' || ret[i] == '/') + if (ret[i] == ',' || ret[i] == '/') ret[i]=' '; } s=ret; @@ -691,6 +705,7 @@ static char *search_fix_spaces(const char *str) { len--; } } while (c); + return ret; } @@ -713,8 +728,8 @@ static void start_search(struct android_search_priv *search_priv, const char *se dbg(lvl_debug,"leave"); } -JNIEXPORT jlong JNICALL Java_org_navitproject_navit_NavitAddressSearchActivity_CallbackStartAddressSearch( JNIEnv* env, - jobject thiz, int partial, jobject country, jobject str) { +JNIEXPORT jlong JNICALL Java_org_navitproject_navit_NavitAddressSearchActivity_callbackStartAddressSearch( JNIEnv* env, + jobject thiz, jint partial, jstring country, jstring str) { struct attr attr; const char *search_string =(*env)->GetStringUTFChars(env, str, NULL); dbg(lvl_debug,"search '%s'", search_string); @@ -764,7 +779,7 @@ JNIEXPORT jlong JNICALL Java_org_navitproject_navit_NavitAddressSearchActivity_C return (jlong)(long)search_priv; } -JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitAddressSearchActivity_CallbackCancelAddressSearch( JNIEnv* env, +JNIEXPORT void JNICALL Java_org_navitproject_navit_NavitAddressSearchActivity_callbackCancelAddressSearch( JNIEnv* env, jobject thiz, jlong handle) { struct android_search_priv *priv = (void*)(long)handle; |