SDL: Fixed bug #4843 - Can not get the ime candidatelist like chinese/japaness input method

From ccb12457f9e45ff1d7bd621c76bfccb68616d562 Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
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 f850b0a603..df42416d59 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 @@
     /** 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 static boolean isTextInputEvent(KeyEvent event) {
         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 @@ public boolean onKeyPreIme (int keyCode, KeyEvent event) {
     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 433d0bf87a..52ec56f35b 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 47e1ed657d..88e028de88 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) {