summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormvglasow <michael@vonglasow.com>2019-02-22 23:16:35 +0100
committerGitHub <noreply@github.com>2019-02-22 23:16:35 +0100
commitbb34c13a582e1a6b13f3da7a342fc7eccb081b42 (patch)
treeb19be0465b9735917fdc7a89b22e458839f8d724
parent5aecfb6bfd1557795fd8b4a89ea619882aebd874 (diff)
parent42b91cb4ed5a253cfc3f6aa07483315d80e3ab6d (diff)
downloadnavit-bb34c13a582e1a6b13f3da7a342fc7eccb081b42.tar.gz
Merge pull request #754 from mvglasow/android-startup
Android: Do not reinitialize everything when the activity is recreated
-rw-r--r--navit/android.c19
-rw-r--r--navit/android.h1
-rw-r--r--navit/android/src/org/navitproject/navit/Navit.java20
-rw-r--r--navit/android/src/org/navitproject/navit/NavitGraphics.java94
-rw-r--r--navit/android/src/org/navitproject/navit/NavitSpeech2.java4
-rw-r--r--navit/plugin/pedestrian/pedestrian.c2
-rw-r--r--navit/traffic/traff_android/traffic_traff_android.c2
-rw-r--r--navit/vehicle/android/vehicle_android.c4
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)