diff options
-rw-r--r-- | navit/android.c | 19 | ||||
-rw-r--r-- | navit/android.h | 1 | ||||
-rw-r--r-- | navit/android/src/org/navitproject/navit/Navit.java | 20 | ||||
-rw-r--r-- | navit/android/src/org/navitproject/navit/NavitGraphics.java | 94 | ||||
-rw-r--r-- | navit/android/src/org/navitproject/navit/NavitSpeech2.java | 4 | ||||
-rw-r--r-- | navit/plugin/pedestrian/pedestrian.c | 2 | ||||
-rw-r--r-- | navit/traffic/traff_android/traffic_traff_android.c | 2 | ||||
-rw-r--r-- | navit/vehicle/android/vehicle_android.c | 4 |
8 files changed, 98 insertions, 48 deletions
diff --git a/navit/android.c b/navit/android.c index 9b06ebb44..dc506ffb0 100644 --- a/navit/android.c +++ b/navit/android.c @@ -22,7 +22,8 @@ #include "track.h" JNIEnv *jnienv; -jobject *android_activity; +jobject *android_activity = NULL; +jobject *android_application = NULL; int android_version; struct android_search_priv { @@ -67,14 +68,20 @@ int android_find_static_method(jclass class, char *name, char *args, jmethodID * } 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, jobject map_path) { + jobject application, jobject lang, int version, jobject display_density_string, jobject path, jobject map_path, + jboolean isLaunch) { 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); 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); setenv("LANG",langstr,1); @@ -89,9 +96,11 @@ JNIEXPORT void JNICALL Java_org_navitproject_navit_Navit_NavitMain( JNIEnv* env, setenv("NAVIT_USER_DATADIR",map_file_path,1); (*env)->ReleaseStringUTFChars(env, display_density_string, map_file_path); - const char *strings=(*env)->GetStringUTFChars(env, path, NULL); - main_real(1, &strings); - (*env)->ReleaseStringUTFChars(env, path, strings); + if (isLaunch) { + 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) { diff --git a/navit/android.h b/navit/android.h index 24774d0e5..ee8b1b4b5 100644 --- a/navit/android.h +++ b/navit/android.h @@ -1,6 +1,7 @@ #include <jni.h> extern JNIEnv *jnienv; extern jobject *android_activity; +extern jobject *android_application; 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); diff --git a/navit/android/src/org/navitproject/navit/Navit.java b/navit/android/src/org/navitproject/navit/Navit.java index fb10d56dd..5c2d15a72 100644 --- a/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/android/src/org/navitproject/navit/Navit.java @@ -23,6 +23,7 @@ import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; +import android.app.Application; import android.app.Dialog; import android.app.Notification; import android.app.NotificationManager; @@ -71,6 +72,7 @@ import java.util.regex.Pattern; public class Navit extends Activity { + protected static NavitGraphics graphics = null; private NavitDialogs dialogs; private PowerManager.WakeLock wl; private NavitActivityResult[] ActivityResults; @@ -97,7 +99,7 @@ public class Navit extends Activity { Boolean isFullscreen = false; private static final int MY_PERMISSIONS_REQUEST_ALL = 101; private static NotificationManager nm; - private static Navit navit; + private static Navit navit = null; public static Navit getInstance() { return navit; @@ -316,6 +318,9 @@ public class Navit extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { + /* Whether this is the first launch of Navit (as opposed to the activity being recreated) */ + boolean isLaunch = (navit == null); + super.onCreate(savedInstanceState); if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { this.requestWindowFeature(Window.FEATURE_NO_TITLE); @@ -442,8 +447,10 @@ public class Navit extends Activity { } Log.d(TAG, "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK)); - NavitMain(this, NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, - NAVIT_DATA_DIR + "/bin/navit", map_filename_path); + NavitMain(this, getApplication(), NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, + NAVIT_DATA_DIR + "/bin/navit", map_filename_path, isLaunch); + if (graphics != null) + graphics.setActivity(this); showInfos(); @@ -833,7 +840,8 @@ public class Navit extends Activity { } break; default : - ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); + if (ActivityResults[requestCode] != null) + ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); break; } } @@ -908,8 +916,8 @@ public class Navit extends Activity { NavitDestroy(); } - public native void NavitMain(Navit x, String lang, int version, String display_density_string, String path, - String path2); + public native void NavitMain(Navit x, Application application, String lang, int version, + String display_density_string, String path, String path2, boolean isLaunch); public native void NavitDestroy(); diff --git a/navit/android/src/org/navitproject/navit/NavitGraphics.java b/navit/android/src/org/navitproject/navit/NavitGraphics.java index f85c24833..4e7929f88 100644 --- a/navit/android/src/org/navitproject/navit/NavitGraphics.java +++ b/navit/android/src/org/navitproject/navit/NavitGraphics.java @@ -78,7 +78,7 @@ public class NavitGraphics { private SystemBarTintView bottomTintView; private FrameLayout frameLayout; private RelativeLayout relativelayout; - private NavitCamera camera; + private NavitCamera camera = null; private Navit activity; private static Boolean in_map = false; // for menu key @@ -106,7 +106,28 @@ public class NavitGraphics { private void SetCamera(int use_camera) { if (use_camera != 0 && camera == null) { // activity.requestWindowFeature(Window.FEATURE_NO_TITLE); - camera = new NavitCamera(activity); + addCamera(); + addCameraView(); + } + } + + /** + * @brief Adds a camera. + * + * This method does not create the view for the camera. This must be done separately by calling + * {@link #addCameraView()}. + */ + private void addCamera() { + camera = new NavitCamera(activity); + } + + /** + * @brief Adds a view for the camera. + * + * If {@link #camera} is null, this method is a no-op. + */ + private void addCameraView() { + if (camera != null) { relativelayout.addView(camera); relativelayout.bringChildToFront(view); } @@ -588,37 +609,10 @@ public class NavitGraphics { public NavitGraphics(final Activity activity, NavitGraphics parent, int x, int y, int w, int h, int wraparound, int use_camera) { if (parent == null) { - this.activity = (Navit) activity; - view = new NavitView(activity); - //activity.registerForContextMenu(view); - view.setClickable(false); - view.setFocusable(true); - view.setFocusableInTouchMode(true); - view.setKeepScreenOn(true); - relativelayout = new RelativeLayout(activity); if (use_camera != 0) { - SetCamera(use_camera); + addCamera(); } - relativelayout.addView(view); - - /* The navigational and status bar tinting code is meaningful only on API19+ */ - if (Build.VERSION.SDK_INT >= 19) { - frameLayout = new FrameLayout(activity); - frameLayout.addView(relativelayout); - leftTintView = new SystemBarTintView(activity); - rightTintView = new SystemBarTintView(activity); - topTintView = new SystemBarTintView(activity); - bottomTintView = new SystemBarTintView(activity); - frameLayout.addView(leftTintView); - frameLayout.addView(rightTintView); - frameLayout.addView(topTintView); - frameLayout.addView(bottomTintView); - activity.setContentView(frameLayout); - } else { - activity.setContentView(relativelayout); - } - - view.requestFocus(); + setActivity(activity); } else { draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); bitmap_w = w; @@ -632,6 +626,44 @@ public class NavitGraphics { parent_graphics = parent; } + /** + * @brief Sets up the main activity. + * + * @param activity The main activity. + */ + protected void setActivity(final Activity activity) { + if (Navit.graphics == null) + Navit.graphics = this; + this.activity = (Navit) activity; + view = new NavitView(activity); + view.setClickable(false); + view.setFocusable(true); + view.setFocusableInTouchMode(true); + view.setKeepScreenOn(true); + relativelayout = new RelativeLayout(activity); + addCameraView(); + relativelayout.addView(view); + + /* The navigational and status bar tinting code is meaningful only on API19+ */ + if (Build.VERSION.SDK_INT >= 19) { + frameLayout = new FrameLayout(activity); + frameLayout.addView(relativelayout); + leftTintView = new SystemBarTintView(activity); + rightTintView = new SystemBarTintView(activity); + topTintView = new SystemBarTintView(activity); + bottomTintView = new SystemBarTintView(activity); + frameLayout.addView(leftTintView); + frameLayout.addView(rightTintView); + frameLayout.addView(topTintView); + frameLayout.addView(bottomTintView); + activity.setContentView(frameLayout); + } else { + activity.setContentView(relativelayout); + } + + view.requestFocus(); + } + public enum msg_type { CLB_ZOOM_IN, CLB_ZOOM_OUT, CLB_REDRAW, CLB_MOVE, CLB_BUTTON_UP, CLB_BUTTON_DOWN, CLB_SET_DESTINATION, CLB_SET_DISPLAY_DESTINATION, CLB_CALL_CMD, CLB_COUNTRY_CHOOSER, CLB_LOAD_MAP, CLB_UNLOAD_MAP, CLB_DELETE_MAP diff --git a/navit/android/src/org/navitproject/navit/NavitSpeech2.java b/navit/android/src/org/navitproject/navit/NavitSpeech2.java index 1bf996dc5..c86fdd1c8 100644 --- a/navit/android/src/org/navitproject/navit/NavitSpeech2.java +++ b/navit/android/src/org/navitproject/navit/NavitSpeech2.java @@ -44,7 +44,7 @@ public class NavitSpeech2 implements TextToSpeech.OnInitListener, NavitActivityR navit.startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); } else { Log.e(TAG, "ACTION_CHECK_TTS_DATA not available, assume tts is working"); - mTts = new TextToSpeech(navit, this); + mTts = new TextToSpeech(navit.getApplication(), this); } } @@ -57,7 +57,7 @@ public class NavitSpeech2 implements TextToSpeech.OnInitListener, NavitActivityR if (requestCode == MY_DATA_CHECK_CODE) { if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { // success, create the TTS instance - mTts = new TextToSpeech(navit, this); + mTts = new TextToSpeech(navit.getApplication(), this); } else { // missing data, ask to install it AlertDialog.Builder builder = new AlertDialog.Builder(navit); diff --git a/navit/plugin/pedestrian/pedestrian.c b/navit/plugin/pedestrian/pedestrian.c index 1f1d96ac4..a0407c873 100644 --- a/navit/plugin/pedestrian/pedestrian.c +++ b/navit/plugin/pedestrian/pedestrian.c @@ -1223,7 +1223,7 @@ static void pedestrian_navit_init(struct navit *nav) { dbg(lvl_debug,"cid=%p",cid); if (cid) { cb=callback_new_1(callback_cast(android_sensors), nav); - navitsensors=(*jnienv)->NewObject(jnienv, navitsensorsclass, cid, android_activity, cb); + navitsensors=(*jnienv)->NewObject(jnienv, navitsensorsclass, cid, android_application, cb); dbg(lvl_debug,"object=%p",navitsensors); if (navitsensors) navitsensors = (*jnienv)->NewGlobalRef(jnienv, navitsensors); diff --git a/navit/traffic/traff_android/traffic_traff_android.c b/navit/traffic/traff_android/traffic_traff_android.c index 0bc07ad7f..91d408777 100644 --- a/navit/traffic/traff_android/traffic_traff_android.c +++ b/navit/traffic/traff_android/traffic_traff_android.c @@ -122,7 +122,7 @@ static int traffic_traff_android_init(struct traffic_priv * this_) { dbg(lvl_error,"no method found"); return 0; /* exception thrown */ } - this_->NavitTraff=(*jnienv)->NewObject(jnienv, this_->NavitTraffClass, cid, android_activity, + this_->NavitTraff=(*jnienv)->NewObject(jnienv, this_->NavitTraffClass, cid, android_application, (int) this_->cbid); dbg(lvl_debug,"result=%p", this_->NavitTraff); if (!this_->NavitTraff) diff --git a/navit/vehicle/android/vehicle_android.c b/navit/vehicle/android/vehicle_android.c index 4d3137bd8..f6173e1b3 100644 --- a/navit/vehicle/android/vehicle_android.c +++ b/navit/vehicle/android/vehicle_android.c @@ -238,8 +238,8 @@ static int vehicle_android_init(struct vehicle_priv *ret) { dbg(lvl_error,"no method found"); return 0; /* exception thrown */ } - dbg(lvl_debug, "at 4 android_activity=%p", android_activity); - ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_activity, + dbg(lvl_debug, "at 4 android_application=%p", android_application); + ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_application, (int) ret->pcb, (int) ret->scb, (int) ret->fcb); dbg(lvl_debug,"result=%p",ret->NavitVehicle); if (!ret->NavitVehicle) |