Skip to content

Commit

Permalink
Android: send SDL_LOCALECHANGED when locale changes
Browse files Browse the repository at this point in the history
  • Loading branch information
1bsyl committed May 8, 2020
1 parent 2a4ddee commit 2491f16
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
2 changes: 1 addition & 1 deletion android-project/app/src/main/AndroidManifest.xml
Expand Up @@ -70,7 +70,7 @@
android:label="@string/app_name"
android:alwaysRetainTaskState="true"
android:launchMode="singleInstance"
android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
23 changes: 23 additions & 0 deletions android-project/app/src/main/java/org/libsdl/app/SDLActivity.java
Expand Up @@ -4,6 +4,7 @@
import java.io.InputStream;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Locale;
import java.lang.reflect.Method;
import java.lang.Math;

Expand Down Expand Up @@ -62,6 +63,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
protected static final int SDL_ORIENTATION_PORTRAIT_FLIPPED = 4;

protected static int mCurrentOrientation;
protected static Locale mCurrentLocale;

// Handle the state of the native layer
public enum NativeState {
Expand Down Expand Up @@ -258,6 +260,15 @@ public void onClick(DialogInterface dialog,int id) {
// Only record current orientation
SDLActivity.onNativeOrientationChanged(mCurrentOrientation);

try {
if (Build.VERSION.SDK_INT < 24) {
mCurrentLocale = getContext().getResources().getConfiguration().locale;
} else {
mCurrentLocale = getContext().getResources().getConfiguration().getLocales().get(0);
}
} catch(Exception ignored) {
}

setContentView(mLayout);

setWindowStyle(false);
Expand Down Expand Up @@ -407,6 +418,17 @@ public void onLowMemory() {
SDLActivity.nativeLowMemory();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.v(TAG, "onConfigurationChanged()");
super.onConfigurationChanged(newConfig);

if (!mCurrentLocale.equals(newConfig.locale)) {
mCurrentLocale = newConfig.locale;
SDLActivity.onNativeLocaleChanged();
}
}

@Override
protected void onDestroy() {
Log.v(TAG, "onDestroy()");
Expand Down Expand Up @@ -784,6 +806,7 @@ public static native void onNativeTouch(int touchDevId, int pointerFingerId,
public static native void onNativeOrientationChanged(int orientation);
public static native void nativeAddTouch(int touchId, String name);
public static native void nativePermissionResult(int requestCode, boolean result);
public static native void onNativeLocaleChanged();

/**
* This method is called by SDL using JNI.
Expand Down
16 changes: 16 additions & 0 deletions src/core/android/SDL_android.c
Expand Up @@ -127,6 +127,9 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeClipboardChanged)(
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeLowMemory)(
JNIEnv *env, jclass cls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeLocaleChanged)(
JNIEnv *env, jclass cls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSendQuit)(
JNIEnv *env, jclass cls);

Expand Down Expand Up @@ -180,6 +183,7 @@ static JNINativeMethod SDLActivity_tab[] = {
{ "onNativeAccel", "(FFF)V", SDL_JAVA_INTERFACE(onNativeAccel) },
{ "onNativeClipboardChanged", "()V", SDL_JAVA_INTERFACE(onNativeClipboardChanged) },
{ "nativeLowMemory", "()V", SDL_JAVA_INTERFACE(nativeLowMemory) },
{ "onNativeLocaleChanged", "()V", SDL_JAVA_INTERFACE(onNativeLocaleChanged) },
{ "nativeSendQuit", "()V", SDL_JAVA_INTERFACE(nativeSendQuit) },
{ "nativeQuit", "()V", SDL_JAVA_INTERFACE(nativeQuit) },
{ "nativePause", "()V", SDL_JAVA_INTERFACE(nativePause) },
Expand Down Expand Up @@ -1142,6 +1146,15 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeLowMemory)(
SDL_SendAppEvent(SDL_APP_LOWMEMORY);
}

/* Locale
* requires android:configChanges="layoutDirection|locale" in AndroidManifest.xml */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeLocaleChanged)(
JNIEnv *env, jclass cls)
{
SDL_SendAppEvent(SDL_LOCALECHANGED);
}


/* Send Quit event to "SDLThread" thread */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSendQuit)(
JNIEnv *env, jclass cls)
Expand Down Expand Up @@ -2859,6 +2872,9 @@ int Android_JNI_GetLocale(char *buf, size_t buflen)

SDL_assert(buflen > 6);

/* Need to re-create the asset manager if locale has changed (SDL_LOCALECHANGED) */
Internal_Android_Destroy_AssetManager();

if (asset_manager == NULL) {
Internal_Android_Create_AssetManager();
}
Expand Down

0 comments on commit 2491f16

Please sign in to comment.