diff --git a/project/java/RestartMainActivity.java b/project/java/RestartMainActivity.java index db7bab855..2a3515b95 100644 --- a/project/java/RestartMainActivity.java +++ b/project/java/RestartMainActivity.java @@ -129,6 +129,8 @@ public class RestartMainActivity extends Activity } catch (InterruptedException e) {} Intent intent = new Intent(RestartMainActivity.this, MainActivity.class); intent.putExtra(ACTIVITY_AUTODETECT_SCREEN_ORIENTATION, getIntent().getBooleanExtra(ACTIVITY_AUTODETECT_SCREEN_ORIENTATION, false)); + String restartParams = getIntent().getStringExtra(SDL_RESTART_PARAMS); + intent.putExtra(SDL_RESTART_PARAMS, restartParams == null ? "" : restartParams); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); RestartMainActivity.this.startActivity(intent); try{ @@ -144,4 +146,5 @@ public class RestartMainActivity extends Activity private FrameLayout _videoLayout = null; public static final String ACTIVITY_AUTODETECT_SCREEN_ORIENTATION = "libsdl.org.ACTIVITY_AUTODETECT_SCREEN_ORIENTATION"; + public static final String SDL_RESTART_PARAMS = "SDL_RESTART_PARAMS"; } diff --git a/project/java/Settings.java b/project/java/Settings.java index 38f3bbc4d..d06c14da1 100644 --- a/project/java/Settings.java +++ b/project/java/Settings.java @@ -627,6 +627,8 @@ class Settings Log.d("SDL", "libSDL: Is running on OUYA: " + p.isRunningOnOUYA()); if( p.isRunningOnOUYA() ) nativeSetEnv( "OUYA", "1" ); + if (p.getIntent().getStringExtra(RestartMainActivity.SDL_RESTART_PARAMS) != null) + nativeSetEnv( RestartMainActivity.SDL_RESTART_PARAMS, p.getIntent().getStringExtra(RestartMainActivity.SDL_RESTART_PARAMS) ); try { DisplayMetrics dm = new DisplayMetrics(); p.getWindowManager().getDefaultDisplay().getMetrics(dm); diff --git a/project/java/Video.java b/project/java/Video.java index 06bba388d..e4f19a965 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -923,6 +923,14 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer } } + public void restartMyself(String restartParams) + { + Intent intent = new Intent(context, RestartMainActivity.class); + intent.putExtra(RestartMainActivity.SDL_RESTART_PARAMS, restartParams); + context.startActivity(intent); + System.exit(0); + } + private int PowerOf2(int i) { int value = 1; diff --git a/project/jni/sdl-1.2/include/SDL_android.h b/project/jni/sdl-1.2/include/SDL_android.h index 279e1920e..9a50c5619 100644 --- a/project/jni/sdl-1.2/include/SDL_android.h +++ b/project/jni/sdl-1.2/include/SDL_android.h @@ -123,6 +123,9 @@ extern DECLSPEC void SDLCALL SDL_ANDROID_OpenExternalApp(const char *package, co /* Open an Android web browser, or Chrome, or Youtube for video links. Just a wrapper for SDL_ANDROID_OpenExternalApp(NULL, NULL, url) */ extern DECLSPEC void SDLCALL SDL_ANDROID_OpenExternalWebBrowser(const char *url); +/* Restart current app, you can pass a string to the new app instance, which can be retrieved with getenv("SDL_RESTART_PARAMS") */ +extern DECLSPEC void SDLCALL SDL_ANDROID_RestartMyself(const char *restartParams); + #ifdef __cplusplus } #endif diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c index 8429626f4..99ad652e2 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c @@ -85,6 +85,7 @@ static jmethodID JavaRequestNewAdvertisement = NULL; static jmethodID JavaRequestCloudSave = NULL; static jmethodID JavaRequestCloudLoad = NULL; static jmethodID JavaRequestOpenExternalApp = NULL; +static jmethodID JavaRequestRestartMyself = NULL; static int glContextLost = 0; static int showScreenKeyboardDeferred = 0; static const char * showScreenKeyboardOldText = ""; @@ -349,6 +350,7 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeInitJavaCallbacks) ( JNIEnv* env, jobject t JavaRequestCloudLoad = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "cloudLoad", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"); JavaRequestOpenExternalApp = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "openExternalApp", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); + JavaRequestRestartMyself = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "restartMyself", "(Ljava/lang/String;)V"); ANDROID_InitOSKeymap(); } @@ -576,6 +578,15 @@ void SDLCALL SDL_ANDROID_OpenExternalApp(const char *package, const char *activi (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); } +void SDLCALL SDL_ANDROID_RestartMyself(const char *restartParams) +{ + (*JavaEnv)->PushLocalFrame(JavaEnv, 1); + jstring s1 = restartParams ? (*JavaEnv)->NewStringUTF(JavaEnv, restartParams) : (*JavaEnv)->NewStringUTF(JavaEnv, ""); + (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaRequestRestartMyself, s1 ); + (*JavaEnv)->DeleteLocalRef(JavaEnv, s1); + (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); +} + void SDLCALL SDL_ANDROID_OpenExternalWebBrowser(const char *url) { SDL_ANDROID_OpenExternalApp(NULL, NULL, url);