diff --git a/NOTICE.md b/NOTICE.md index 2b772acf9..e63b23183 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -46,7 +46,7 @@ This product bundles pixman 0.32.8, which is available under an This product bundles libpng 1.6.12, which is available under a "zlib" (BSD-style) license. For details, see [project/lib/png/](project/lib). -This product bundles SDL revision 24883e864f7e, which is available under a +This product bundles SDL revision b5cd5e1e4440, which is available under a "zlib" (BSD-style) license. For details, see [project/lib/sdl/](project/lib). This product bundles tinyfiledialogs 2.9.3, which is available under a diff --git a/project/lib/sdl b/project/lib/sdl index 8e337d796..cf13fe849 160000 --- a/project/lib/sdl +++ b/project/lib/sdl @@ -1 +1 @@ -Subproject commit 8e337d7960f88b1f41c7be64b7c179febb47fd85 +Subproject commit cf13fe849e8b39fff873d6dbc2d8d69a98a96f1f diff --git a/templates/android/template/app/src/main/java/org/libsdl/app/SDLActivity.java b/templates/android/template/app/src/main/java/org/libsdl/app/SDLActivity.java index 163a36af1..58235a49a 100644 --- a/templates/android/template/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/templates/android/template/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -763,6 +763,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh public static native void onNativeResize(); public static native void onNativeKeyDown(int keycode); public static native void onNativeKeyUp(int keycode); + public static native boolean onNativeSoftReturnKey(); public static native void onNativeKeyboardFocusLost(); public static native void onNativeMouse(int button, int action, float x, float y, boolean relative); public static native void onNativeTouch(int touchDevId, int pointerFingerId, @@ -846,6 +847,45 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh } } + /** + * This method is called by SDL using JNI. + */ + public static void minimizeWindow() { + + if (mSingleton == null) { + return; + } + + Intent startMain = new Intent(Intent.ACTION_MAIN); + startMain.addCategory(Intent.CATEGORY_HOME); + startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mSingleton.startActivity(startMain); + } + + /** + * This method is called by SDL using JNI. + */ + public static boolean shouldMinimizeOnFocusLoss() { +/* + if (Build.VERSION.SDK_INT >= 24) { + if (mSingleton == null) { + return true; + } + + if (mSingleton.isInMultiWindowMode()) { + return false; + } + + if (mSingleton.isInPictureInPictureMode()) { + return false; + } + } + + return true; +*/ + return false; + } + /** * This method is called by SDL using JNI. */ @@ -1030,6 +1070,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh this.y = y; this.w = w; this.h = h; + + /* Minimum size of 1 pixel, so it takes focus. */ + if (this.w <= 0) { + this.w = 1; + } + if (this.h + HEIGHT_PADDING <= 0) { + this.h = 1 - HEIGHT_PADDING; + } } @Override @@ -1692,6 +1740,8 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, SDLActivity.nativeSetScreenResolution(width, height, nDeviceWidth, nDeviceHeight, sdlFormat, mDisplay.getRefreshRate()); SDLActivity.onNativeResize(); + // Prevent a screen distortion glitch, + // for instance when the device is in Landscape and a Portrait App is resumed. boolean skip = false; int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation(); @@ -1721,6 +1771,16 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, } } + // Don't skip in MultiWindow. + if (skip) { + if (Build.VERSION.SDK_INT >= 24) { + if (SDLActivity.mSingleton.isInMultiWindowMode()) { + Log.v("SDL", "Don't skip in Multi-Window"); + skip = false; + } + } + } + if (skip) { Log.v("SDL", "Skip .. Surface is not ready."); mIsSurfaceReady = false; @@ -1740,6 +1800,10 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, // Key events @Override public boolean onKey(View v, int keyCode, KeyEvent event) { + + int deviceId = event.getDeviceId(); + int source = event.getSource(); + // Dispatch the different events depending on where they come from // Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD // So, we try to process them as JOYSTICK/DPAD/GAMEPAD events first, if that fails we try them as KEYBOARD @@ -1747,20 +1811,25 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, // Furthermore, it's possible a game controller has SOURCE_KEYBOARD and // SOURCE_JOYSTICK, while its key events arrive from the keyboard source // So, retrieve the device itself and check all of its sources - if (SDLControllerManager.isDeviceSDLJoystick(event.getDeviceId())) { + if (SDLControllerManager.isDeviceSDLJoystick(deviceId)) { // Note that we process events with specific key codes here if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (SDLControllerManager.onNativePadDown(event.getDeviceId(), keyCode) == 0) { + if (SDLControllerManager.onNativePadDown(deviceId, keyCode) == 0) { return true; } } else if (event.getAction() == KeyEvent.ACTION_UP) { - if (SDLControllerManager.onNativePadUp(event.getDeviceId(), keyCode) == 0) { + if (SDLControllerManager.onNativePadUp(deviceId, keyCode) == 0) { return true; } } } - if ((event.getSource() & InputDevice.SOURCE_KEYBOARD) != 0) { + if (source == InputDevice.SOURCE_UNKNOWN) { + InputDevice device = InputDevice.getDevice(deviceId); + source = device.getSources(); + } + + if ((source & InputDevice.SOURCE_KEYBOARD) != 0) { if (event.getAction() == KeyEvent.ACTION_DOWN) { //Log.v("SDL", "key down: " + keyCode); if (SDLActivity.isTextInputEvent(event)) { @@ -1776,7 +1845,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, } } - if ((event.getSource() & InputDevice.SOURCE_MOUSE) != 0) { + if ((source & InputDevice.SOURCE_MOUSE) != 0) { // on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses // they are ignored here because sending them as mouse input to SDL is messy if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) { @@ -1882,10 +1951,6 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, } } - //try { - // Thread.sleep((Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) ? 16 : 1); - //} catch (InterruptedException e) {} - return true; } @@ -1928,8 +1993,8 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, newOrientation = SDLActivity.SDL_ORIENTATION_LANDSCAPE_FLIPPED; break; case Surface.ROTATION_180: - x = -event.values[1]; - y = -event.values[0]; + x = -event.values[0]; + y = -event.values[1]; newOrientation = SDLActivity.SDL_ORIENTATION_PORTRAIT_FLIPPED; break; default: @@ -2084,14 +2149,8 @@ class SDLInputConnection extends BaseInputConnection { */ if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { - String imeHide = SDLActivity.nativeGetHint("SDL_RETURN_KEY_HIDES_IME"); - if ((imeHide != null) && imeHide.equals("1")) { - Context c = SDL.getContext(); - if (c instanceof SDLActivity) { - SDLActivity activity = (SDLActivity)c; - activity.sendCommand(SDLActivity.COMMAND_TEXTEDIT_HIDE, null); - return true; - } + if (SDLActivity.onNativeSoftReturnKey()) { + return true; } } @@ -2104,6 +2163,11 @@ class SDLInputConnection extends BaseInputConnection { for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); + if (c == '\n') { + if (SDLActivity.onNativeSoftReturnKey()) { + return true; + } + } nativeGenerateScancodeForUnichar(c); }