From ccb12457f9e45ff1d7bd621c76bfccb68616d562 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Sun, 17 Oct 2021 23:17:54 +0200 Subject: [PATCH] Fixed bug #4843 - Can not get the ime candidatelist like chinese/japaness input method --- .../main/java/org/libsdl/app/SDLActivity.java | 19 ++++++++++++++++++- include/SDL_system.h | 11 +++++++++++ src/core/android/SDL_android.c | 11 +++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java index f850b0a60..df42416d5 100644 --- a/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/android-project/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -102,6 +102,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh /** If shared libraries (e.g. SDL or the native application) could not be loaded. */ public static boolean mBrokenLibraries = true; + public static int mInputType = 1; + // Main components protected static SDLActivity mSingleton; protected static SDLSurface mSurface; @@ -1184,6 +1186,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh return event.isPrintingKey() || event.getKeyCode() == KeyEvent.KEYCODE_SPACE; } + /** + * This method is called by SDL using JNI. + */ + public static int setInputType(int type) { + mInputType = type; + return 0; + } + /** * This method is called by SDL using JNI. */ @@ -2182,7 +2192,14 @@ class DummyEdit extends View implements View.OnKeyListener { public InputConnection onCreateInputConnection(EditorInfo outAttrs) { ic = new SDLInputConnection(this, true); - outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; + if (SDLActivity.mInputType == 0) { + /* 0 normal: use input method */ + outAttrs.inputType = InputType.TYPE_CLASS_TEXT; + } else { + /* 1 password (default): can not use input method,just use english */ + outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; + } + outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN /* API 11 */; diff --git a/include/SDL_system.h b/include/SDL_system.h index 433d0bf87..52ec56f35 100644 --- a/include/SDL_system.h +++ b/include/SDL_system.h @@ -395,6 +395,17 @@ extern DECLSPEC SDL_bool SDLCALL SDL_AndroidRequestPermission(const char *permis */ extern DECLSPEC int SDLCALL SDL_AndroidShowToast(const char* message, int duration, int gravity, int xoffset, int yoffset); +/* Set Android IME Input Type + * Call this method before calling SDL_StartTextInput() + * + * \param type + * 0 normal: use input method + * 1 password (default): can not use input method,just use english + * + * \returns 0 if success, -1 if any error occurs. + */ +extern DECLSPEC int SDLCALL SDL_AndroidSetInputType(int type); + #endif /* __ANDROID__ */ /* Platform specific functions for WinRT */ diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 47e1ed657..88e028de8 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -316,6 +316,7 @@ static jmethodID midShowToast; static jmethodID midSendMessage; static jmethodID midSetActivityTitle; static jmethodID midSetCustomCursor; +static jmethodID midSetInputType; static jmethodID midSetOrientation; static jmethodID midSetRelativeMouseEnabled; static jmethodID midSetSystemCursor; @@ -595,6 +596,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv *env, jclass cl midSendMessage = (*env)->GetStaticMethodID(env, mActivityClass, "sendMessage", "(II)Z"); midSetActivityTitle = (*env)->GetStaticMethodID(env, mActivityClass, "setActivityTitle","(Ljava/lang/String;)Z"); midSetCustomCursor = (*env)->GetStaticMethodID(env, mActivityClass, "setCustomCursor", "(I)Z"); + midSetInputType = (*env)->GetStaticMethodID(env, mActivityClass, "setInputType", "(I)I"); midSetOrientation = (*env)->GetStaticMethodID(env, mActivityClass, "setOrientation","(IIZLjava/lang/String;)V"); midSetRelativeMouseEnabled = (*env)->GetStaticMethodID(env, mActivityClass, "setRelativeMouseEnabled", "(Z)Z"); midSetSystemCursor = (*env)->GetStaticMethodID(env, mActivityClass, "setSystemCursor", "(I)Z"); @@ -625,6 +627,7 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(JNIEnv *env, jclass cl !midSendMessage || !midSetActivityTitle || !midSetCustomCursor || + !midSetInputType || !midSetOrientation || !midSetRelativeMouseEnabled || !midSetSystemCursor || @@ -2453,6 +2456,14 @@ int SDL_AndroidShowToast(const char* message, int duration, int gravity, int xOf return Android_JNI_ShowToast(message, duration, gravity, xOffset, yOffset); } +int SDL_AndroidSetInputType(int type) +{ + int result = 0; + JNIEnv *env = Android_JNI_GetEnv(); + result = (*env)->CallStaticIntMethod(env, mActivityClass, midSetInputType, type); + return result; +} + void Android_JNI_GetManifestEnvironmentVariables(void) { if (!mActivityClass || !midGetManifestEnvironmentVariables) {