diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9dc06d89..c57281ef 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -19,6 +19,7 @@ android:name="GameActivity" android:configChanges="orientation|screenSize" android:label="LÖVE for Android" + android:launchMode="singleTop" android:screenOrientation="landscape" > diff --git a/jni/love/src/common/android.cpp b/jni/love/src/common/android.cpp index 74670fab..9b55f430 100644 --- a/jni/love/src/common/android.cpp +++ b/jni/love/src/common/android.cpp @@ -75,23 +75,26 @@ const char* getSelectedGameFile() { static const char *path = NULL; - if (!path) { - JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv(); - jclass activity = env->FindClass("org/love2d/android/GameActivity"); - - jmethodID getGamePath = env->GetStaticMethodID(activity, "getGamePath", "()Ljava/lang/String;"); - jstring gamePath = (jstring) env->CallStaticObjectMethod(activity, getGamePath); - const char *utf = env->GetStringUTFChars(gamePath, 0); - if (utf) - { - path = SDL_strdup(utf); - env->ReleaseStringUTFChars(gamePath, utf); - } - - env->DeleteLocalRef (gamePath); - env->DeleteLocalRef (activity); + if (path) { + delete path; + path = NULL; } + JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv(); + jclass activity = env->FindClass("org/love2d/android/GameActivity"); + + jmethodID getGamePath = env->GetStaticMethodID(activity, "getGamePath", "()Ljava/lang/String;"); + jstring gamePath = (jstring) env->CallStaticObjectMethod(activity, getGamePath); + const char *utf = env->GetStringUTFChars(gamePath, 0); + if (utf) + { + path = SDL_strdup(utf); + env->ReleaseStringUTFChars(gamePath, utf); + } + + env->DeleteLocalRef (gamePath); + env->DeleteLocalRef (activity); + return path; } diff --git a/src/org/libsdl/app/SDLActivity.java b/src/org/libsdl/app/SDLActivity.java index e09c1819..0c4fe381 100644 --- a/src/org/libsdl/app/SDLActivity.java +++ b/src/org/libsdl/app/SDLActivity.java @@ -98,25 +98,8 @@ public class SDLActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { Log.v("SDL", "onCreate():" + mSingleton); super.onCreate(savedInstanceState); - - SDLActivity.initialize(); - // So we can call stuff from static callbacks - mSingleton = this; - - // Set up the surface - mSurface = new SDLSurface(getApplication()); - - if(Build.VERSION.SDK_INT >= 12) { - mJoystickHandler = new SDLJoystickHandler_API12(); - } - else { - mJoystickHandler = new SDLJoystickHandler(); - } - - mLayout = new AbsoluteLayout(this); - mLayout.addView(mSurface); - - setContentView(mLayout); + + startNative(); } // Events @@ -153,28 +136,59 @@ public class SDLActivity extends Activity { SDLActivity.nativeLowMemory(); } + /** Ends the native thread. + */ + public void resetNative() { + Log.v("SDL", "resetNative()"); + + // Send a quit message to the application + SDLActivity.mExitCalledFromJava = true; + SDLActivity.nativeQuit(); + + // Now wait for the SDL thread to quit + if (SDLActivity.mSDLThread != null) { + try { + SDLActivity.mSDLThread.join(); + } catch(Exception e) { + Log.v("SDL", "Problem stopping thread: " + e); + } + SDLActivity.mSDLThread = null; + + //Log.v("SDL", "Finished waiting for SDL thread"); + } + + SDLActivity.initialize(); + } + + public void startNative() { + Log.v("SDL", "startNative()"); + SDLActivity.initialize(); + // So we can call stuff from static callbacks + mSingleton = this; + + // Set up the surface + mSurface = new SDLSurface(getApplication()); + + if(Build.VERSION.SDK_INT >= 12) { + mJoystickHandler = new SDLJoystickHandler_API12(); + } + else { + mJoystickHandler = new SDLJoystickHandler(); + } + + mLayout = new AbsoluteLayout(this); + mLayout.addView(mSurface); + + setContentView(mLayout); + } + @Override protected void onDestroy() { Log.v("SDL", "onDestroy()"); - // Send a quit message to the application - SDLActivity.mExitCalledFromJava = true; - SDLActivity.nativeQuit(); - // Now wait for the SDL thread to quit - if (SDLActivity.mSDLThread != null) { - try { - SDLActivity.mSDLThread.join(); - } catch(Exception e) { - Log.v("SDL", "Problem stopping thread: " + e); - } - SDLActivity.mSDLThread = null; - - //Log.v("SDL", "Finished waiting for SDL thread"); - } + resetNative(); super.onDestroy(); - // Reset everything in case the user re opens the app - SDLActivity.initialize(); } @Override diff --git a/src/org/love2d/android/GameActivity.java b/src/org/love2d/android/GameActivity.java index 0c27efb2..9d556cc4 100644 --- a/src/org/love2d/android/GameActivity.java +++ b/src/org/love2d/android/GameActivity.java @@ -46,9 +46,26 @@ public class GameActivity extends SDLActivity { context = this.getApplicationContext(); vibrator = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE); - Uri game = this.getIntent().getData(); + handleIntent (this.getIntent()); + + super.onCreate(savedInstanceState); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + } + + @Override + protected void onNewIntent (Intent intent) { + Log.d("GameActivity", "onNewIntent() with " + intent); + handleIntent (intent); + resetNative(); + startNative(); + }; + + protected void handleIntent (Intent intent) { + Uri game = intent.getData(); if (game != null) { if (game.getScheme().equals ("file")) { + Log.d("GameActivity", "Received intent with path: " + game.getPath()); + // If we were given the path of a main.lua then use its // directory. Otherwise use full path. List path_segments = game.getPathSegments(); @@ -60,12 +77,10 @@ public class GameActivity extends SDLActivity { } else { copyGameToCache (game); } - Log.d("GameActivity", "Opening game from: " + getGamePath()); - } - super.onCreate(savedInstanceState); - getWindowManager().getDefaultDisplay().getMetrics(metrics); - } + Log.d("GameActivity", "new gamePath: " + gamePath); + } + }; @Override protected void onDestroy() {