From e54eede265a2ebf3d462212a344a9bfe028b80a9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 13 Aug 2017 21:05:15 -0700 Subject: [PATCH] Provide the correct state of the on-screen keyboard to the API (patch from Sylvain) --- .../src/org/libsdl/app/SDLActivity.java | 44 +++++++++++++++++++ src/core/android/SDL_android.c | 14 ++++++ src/core/android/SDL_android.h | 1 + src/video/android/SDL_androidkeyboard.c | 2 +- 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index 1d8eb2cbfecc9..d500b6dc7dadf 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -59,6 +59,7 @@ public enum NativeState { protected static SDLActivity mSingleton; protected static SDLSurface mSurface; protected static View mTextEdit; + protected static boolean mScreenKeyboardShown; protected static ViewGroup mLayout; protected static SDLJoystickHandler mJoystickHandler; protected static SDLHapticHandler mHapticHandler; @@ -440,6 +441,8 @@ public void handleMessage(Message msg) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0); + + mScreenKeyboardShown = false; } break; case COMMAND_SET_KEEP_SCREEN_ON: @@ -568,6 +571,45 @@ public void setOrientationBis(int w, int h, boolean resizable, String hint) return; } + + /** + * This method is called by SDL using JNI. + */ + public static boolean isScreenKeyboardShown() + { + if (mTextEdit == null) { + return false; + } + + if (mScreenKeyboardShown == false) { + return false; + } + + InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm.isAcceptingText()) { + return true; + } + + return false; + } + + + + /** + * This method is called by SDL using JNI. + */ + public static int openURL(String url) + { + try { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + mSingleton.startActivity(i); + } catch (Exception ex) { + return -1; + } + return 0; + } + /** * This method is called by SDL using JNI. */ @@ -647,6 +689,8 @@ public void run() { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mTextEdit, 0); + + mScreenKeyboardShown = true; } } diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 1d7d15923d4d6..c6178ee5b44e9 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -1684,6 +1684,20 @@ void Android_JNI_HideTextInput(void) Android_JNI_SendMessage(COMMAND_TEXTEDIT_HIDE, 0); } +SDL_bool Android_JNI_IsScreenKeyboardShown() +{ + jmethodID mid; + jboolean is_shown = 0; + JNIEnv *mEnv = Android_JNI_GetEnv(); + mid = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass,"isScreenKeyboardShown","()Z"); + if (mid) { + is_shown = (*mEnv)->CallStaticBooleanMethod(mEnv, mActivityClass, mid); + } + + return is_shown; +} + + int Android_JNI_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) { JNIEnv *env; diff --git a/src/core/android/SDL_android.h b/src/core/android/SDL_android.h index 7d4ded8215284..aae7180dd80ec 100644 --- a/src/core/android/SDL_android.h +++ b/src/core/android/SDL_android.h @@ -38,6 +38,7 @@ extern void Android_JNI_SetOrientation(int w, int h, int resizable, const char * extern SDL_bool Android_JNI_GetAccelerometerValues(float values[3]); extern void Android_JNI_ShowTextInput(SDL_Rect *inputRect); extern void Android_JNI_HideTextInput(void); +extern SDL_bool Android_JNI_IsScreenKeyboardShown(void); extern ANativeWindow* Android_JNI_GetNativeWindow(void); /* Audio support */ diff --git a/src/video/android/SDL_androidkeyboard.c b/src/video/android/SDL_androidkeyboard.c index 07119ac631cd5..888b1b14b6a4d 100644 --- a/src/video/android/SDL_androidkeyboard.c +++ b/src/video/android/SDL_androidkeyboard.c @@ -357,7 +357,7 @@ Android_HasScreenKeyboardSupport(_THIS) SDL_bool Android_IsScreenKeyboardShown(_THIS, SDL_Window * window) { - return SDL_IsTextInputActive(); + return Android_JNI_IsScreenKeyboardShown(); } void