From 42f6beaa7e2b796f7ae5fb35764b6377b57a96bb Mon Sep 17 00:00:00 2001 From: fysx Date: Tue, 20 Jan 2015 16:01:43 +0100 Subject: [PATCH] Allowing enabling and disabling of immersive mode via borderless setting and love.window.setMode() --- jni/love/src/common/android.cpp | 14 ++++++ jni/love/src/common/android.h | 2 + jni/love/src/modules/window/sdl/Window.cpp | 4 ++ src/org/love2d/android/GameActivity.java | 51 +++++++++++++++++++--- 4 files changed, 64 insertions(+), 7 deletions(-) diff --git a/jni/love/src/common/android.cpp b/jni/love/src/common/android.cpp index 9e64df23..29f144bb 100644 --- a/jni/love/src/common/android.cpp +++ b/jni/love/src/common/android.cpp @@ -35,6 +35,20 @@ namespace love namespace android { +void setBorderless (bool borderless_active) { + JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv(); + + jobject activity = (jobject) SDL_AndroidGetActivity(); + + jclass clazz (env->GetObjectClass(activity)); + jmethodID method_id = env->GetMethodID (clazz, "setImmersiveMode", "(Z)V"); + + env->CallVoidMethod (activity, method_id, borderless_active); + + env->DeleteLocalRef (activity); + env->DeleteLocalRef (clazz); +} + double getScreenScale() { static double result = -1.; diff --git a/jni/love/src/common/android.h b/jni/love/src/common/android.h index 04060326..c0597450 100644 --- a/jni/love/src/common/android.h +++ b/jni/love/src/common/android.h @@ -32,6 +32,8 @@ namespace love namespace android { +void setBorderless (bool borderless_active); + /** * Gets the scale factor of the window's screen, e.g. on Retina displays this * will return 2.0. diff --git a/jni/love/src/modules/window/sdl/Window.cpp b/jni/love/src/modules/window/sdl/Window.cpp index 0f40b1c3..1d9ea43e 100644 --- a/jni/love/src/modules/window/sdl/Window.cpp +++ b/jni/love/src/modules/window/sdl/Window.cpp @@ -244,6 +244,10 @@ bool Window::setWindow(int width, int height, WindowSettings *settings) if (!gfx->setMode(width, height, curMode.settings.sRGB)) showMessageBox("Could not set graphics mode", "Unsupported OpenGL version?", MESSAGEBOX_ERROR, true); + +#ifdef LOVE_ANDROID + love::android::setBorderless(f.borderless); +#endif } // Make sure the mouse keeps its previous grab setting. diff --git a/src/org/love2d/android/GameActivity.java b/src/org/love2d/android/GameActivity.java index 39eafece..0c27efb2 100644 --- a/src/org/love2d/android/GameActivity.java +++ b/src/org/love2d/android/GameActivity.java @@ -12,6 +12,7 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; +import android.app.Activity; import android.app.DownloadManager; import android.app.ProgressDialog; import android.content.Context; @@ -36,6 +37,7 @@ public class GameActivity extends SDLActivity { private static String gamePath = ""; private static Context context; private static Vibrator vibrator; + private static boolean immersiveActive = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -82,13 +84,48 @@ public class GameActivity extends SDLActivity { @Override public void onResume() { super.onResume(); - getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + + if (immersiveActive) { + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + } + } + + public void setImmersiveMode (boolean immersive_mode) { + immersiveActive = immersive_mode; + + final Object lock = new Object(); + final boolean immersive_enabled = immersive_mode; + synchronized (lock) { + runOnUiThread (new Runnable() { + @Override + public void run() { + synchronized (lock) { + if (immersive_enabled) { + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + } else { + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + ); + } + + lock.notify(); + } + } + }); + }; } public static String getGamePath() {