diff options
author | Tom Murphy <tomnom@google.com> | 2022-12-06 11:42:45 +0000 |
---|---|---|
committer | Tom Murphy <tomnom@google.com> | 2022-12-06 11:43:30 +0000 |
commit | 2db5db2b44cbee35488cd07dd18ebd88ba1b49d1 (patch) | |
tree | f708e56c552b80c87883ef472a904eb1fc1c3c15 | |
parent | 5e01ff2420dd6ead0d648103be19cf8f46019491 (diff) | |
download | gamesdk-2db5db2b44cbee35488cd07dd18ebd88ba1b49d1.tar.gz |
Revert "Revert "provide access to Configuration values to the native code""
This reverts commit 0f916714b8c20267a3dad02545b92bb8e36009e5.
Reason for revert: We can now remerge this now that the release is out.
Change-Id: I286fb8179026b672d4eaf575d45561734680db90
3 files changed, 250 insertions, 20 deletions
diff --git a/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.cpp b/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.cpp index de1affb2..3a009fad 100644 --- a/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.cpp +++ b/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.cpp @@ -189,6 +189,30 @@ static struct { } gInsetsClassInfo; /* + * JNI fields of the Configuration Java class. + */ +static struct ConfigurationClassInfo { + jfieldID colorMode; + jfieldID densityDpi; + jfieldID fontScale; + jfieldID fontWeightAdjustment; + jfieldID hardKeyboardHidden; + jfieldID keyboard; + jfieldID keyboardHidden; + jfieldID mcc; + jfieldID mnc; + jfieldID navigation; + jfieldID navigationHidden; + jfieldID orientation; + jfieldID screenHeightDp; + jfieldID screenLayout; + jfieldID screenWidthDp; + jfieldID smallestScreenWidthDp; + jfieldID touchscreen; + jfieldID uiMode; +} gConfigurationClassInfo; + +/* * JNI methods of the WindowInsetsCompat.Type Java class. */ static struct { @@ -222,6 +246,31 @@ enum { }; /* + * Last known Configuration values. They may be accessed from the different + * thread, this is why they are made atomic. + */ +static struct Configuration { + std::atomic_int colorMode; + std::atomic_int densityDpi; + std::atomic<float> fontScale; + std::atomic_int fontWeightAdjustment; + std::atomic_int hardKeyboardHidden; + std::atomic_int keyboard; + std::atomic_int keyboardHidden; + std::atomic_int mcc; + std::atomic_int mnc; + std::atomic_int navigation; + std::atomic_int navigationHidden; + std::atomic_int orientation; + std::atomic_int screenHeightDp; + std::atomic_int screenLayout; + std::atomic_int screenWidthDp; + std::atomic_int smallestScreenWidthDp; + std::atomic_int touchscreen; + std::atomic_int uiMode; +} gConfiguration; + +/* * Write a command to be executed by the GameActivity on the application main * thread. */ @@ -342,6 +391,8 @@ struct NativeCode : public GameActivity { ARect insetsState[GAMECOMMON_INSETS_TYPE_COUNT]; }; +static void readConfigurationValues(NativeCode *code, jobject javaConfig); + extern "C" void GameActivity_finish(GameActivity *activity) { NativeCode *code = static_cast<NativeCode *>(activity); write_work(code->mainWorkWrite, CMD_FINISH, 0); @@ -462,10 +513,10 @@ static int mainWorkCallback(int fd, int events, void *data) { // ------------------------------------------------------------------------ static thread_local std::string g_error_msg; -static jlong initializeNativeCode_native(JNIEnv *env, jobject javaGameActivity, - jstring internalDataDir, jstring obbDir, - jstring externalDataDir, jobject jAssetMgr, - jbyteArray savedState) { +static jlong initializeNativeCode_native( + JNIEnv *env, jobject javaGameActivity, jstring internalDataDir, + jstring obbDir, jstring externalDataDir, jobject jAssetMgr, + jbyteArray savedState, jobject javaConfig) { LOG_TRACE("initializeNativeCode_native"); NativeCode *code = NULL; @@ -539,6 +590,9 @@ static jlong initializeNativeCode_native(JNIEnv *env, jobject javaGameActivity, rawSavedState = env->GetByteArrayElements(savedState, NULL); rawSavedSize = env->GetArrayLength(savedState); } + + readConfigurationValues(code, javaConfig); + GameActivity_onCreate(code, rawSavedState, rawSavedSize); code->gameTextInput = GameTextInput_init(env, 0); @@ -646,11 +700,50 @@ static void onStop_native(JNIEnv *env, jobject javaGameActivity, jlong handle) { } } +static void readConfigurationValues(NativeCode *code, jobject javaConfig) { + gConfiguration.colorMode = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.colorMode); + gConfiguration.densityDpi = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.densityDpi); + gConfiguration.fontScale = + code->env->GetFloatField(javaConfig, gConfigurationClassInfo.fontScale); + gConfiguration.fontWeightAdjustment = code->env->GetIntField( + javaConfig, gConfigurationClassInfo.fontWeightAdjustment); + gConfiguration.hardKeyboardHidden = code->env->GetIntField( + javaConfig, gConfigurationClassInfo.hardKeyboardHidden); + gConfiguration.mcc = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.mcc); + gConfiguration.mnc = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.mnc); + gConfiguration.navigation = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.navigation); + gConfiguration.navigationHidden = code->env->GetIntField( + javaConfig, gConfigurationClassInfo.navigationHidden); + gConfiguration.orientation = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.orientation); + gConfiguration.screenHeightDp = code->env->GetIntField( + javaConfig, gConfigurationClassInfo.screenHeightDp); + gConfiguration.screenLayout = code->env->GetIntField( + javaConfig, gConfigurationClassInfo.screenLayout); + gConfiguration.screenWidthDp = code->env->GetIntField( + javaConfig, gConfigurationClassInfo.screenWidthDp); + gConfiguration.smallestScreenWidthDp = code->env->GetIntField( + javaConfig, gConfigurationClassInfo.smallestScreenWidthDp); + gConfiguration.touchscreen = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.touchscreen); + gConfiguration.uiMode = + code->env->GetIntField(javaConfig, gConfigurationClassInfo.uiMode); + + checkAndClearException(code->env, "Configuration.get"); +} + static void onConfigurationChanged_native(JNIEnv *env, jobject javaGameActivity, - jlong handle) { + jlong handle, jobject javaNewConfig) { LOG_TRACE("onConfigurationChanged_native"); if (handle != 0) { NativeCode *code = (NativeCode *)handle; + readConfigurationValues(code, javaNewConfig); + if (code->callbacks.onConfigurationChanged != NULL) { code->callbacks.onConfigurationChanged(code); } @@ -832,6 +925,78 @@ extern "C" void GameActivity_setImeEditorInfo(GameActivity *activity, actionId, imeOptions); } +extern "C" int GameActivity_getColorMode(GameActivity *) { + return gConfiguration.colorMode; +} + +extern "C" int GameActivity_getDensityDpi(GameActivity *) { + return gConfiguration.densityDpi; +} + +extern "C" float GameActivity_getFontScale(GameActivity *) { + return gConfiguration.fontScale; +} + +extern "C" int GameActivity_getFontWeightAdjustment(GameActivity *) { + return gConfiguration.fontWeightAdjustment; +} + +extern "C" int GameActivity_getHardKeyboardHidden(GameActivity *) { + return gConfiguration.hardKeyboardHidden; +} + +extern "C" int GameActivity_getKeyboard(GameActivity *) { + return gConfiguration.keyboard; +} + +extern "C" int GameActivity_getKeyboardHidden(GameActivity *) { + return gConfiguration.keyboardHidden; +} + +extern "C" int GameActivity_getMcc(GameActivity *) { + return gConfiguration.mcc; +} + +extern "C" int GameActivity_getMnc(GameActivity *) { + return gConfiguration.mnc; +} + +extern "C" int GameActivity_getNavigation(GameActivity *) { + return gConfiguration.navigation; +} + +extern "C" int GameActivity_getNavigationHidden(GameActivity *) { + return gConfiguration.navigationHidden; +} + +extern "C" int GameActivity_getOrientation(GameActivity *) { + return gConfiguration.orientation; +} + +extern "C" int GameActivity_getScreenHeightDp(GameActivity *) { + return gConfiguration.screenHeightDp; +} + +extern "C" int GameActivity_getScreenLayout(GameActivity *) { + return gConfiguration.screenLayout; +} + +extern "C" int GameActivity_getScreenWidthDp(GameActivity *) { + return gConfiguration.screenWidthDp; +} + +extern "C" int GameActivity_getSmallestScreenWidthDp(GameActivity *) { + return gConfiguration.smallestScreenWidthDp; +} + +extern "C" int GameActivity_getTouchscreen(GameActivity *) { + return gConfiguration.touchscreen; +} + +extern "C" int GameActivity_getUIMode(GameActivity *) { + return gConfiguration.uiMode; +} + static struct { jmethodID getDeviceId; jmethodID getSource; @@ -1229,7 +1394,8 @@ static void onContentRectChangedNative_native(JNIEnv *env, jobject activity, static const JNINativeMethod g_methods[] = { {"initializeNativeCode", "(Ljava/lang/String;Ljava/lang/String;" - "Ljava/lang/String;Landroid/content/res/AssetManager;[B)J", + "Ljava/lang/String;Landroid/content/res/AssetManager;" + "[BLandroid/content/res/Configuration;)J", (void *)initializeNativeCode_native}, {"getDlError", "()Ljava/lang/String;", (void *)getDlError_native}, {"terminateNativeCode", "(J)V", (void *)terminateNativeCode_native}, @@ -1238,7 +1404,7 @@ static const JNINativeMethod g_methods[] = { {"onSaveInstanceStateNative", "(J)[B", (void *)onSaveInstanceState_native}, {"onPauseNative", "(J)V", (void *)onPause_native}, {"onStopNative", "(J)V", (void *)onStop_native}, - {"onConfigurationChangedNative", "(J)V", + {"onConfigurationChangedNative", "(JLandroid/content/res/Configuration;)V", (void *)onConfigurationChanged_native}, {"onTrimMemoryNative", "(JI)V", (void *)onTrimMemory_native}, {"onWindowFocusChangedNative", "(JZ)V", @@ -1263,15 +1429,16 @@ static const JNINativeMethod g_methods[] = { {"setInputConnectionNative", "(JLcom/google/androidgamesdk/gametextinput/InputConnection;)V", (void *)setInputConnection_native}, - {"onContentRectChangedNative", "(JIIII)V", - (void *)onContentRectChangedNative_native}, + {"onContentRectChangedNative", "(JIIII)V", + (void *)onContentRectChangedNative_native}, }; static const char *const kGameActivityPathName = "com/google/androidgamesdk/GameActivity"; static const char *const kInsetsPathName = "androidx/core/graphics/Insets"; - +static const char *const kConfigurationPathName = + "android/content/res/Configuration"; static const char *const kWindowInsetsCompatTypePathName = "androidx/core/view/WindowInsetsCompat$Type"; @@ -1329,12 +1496,51 @@ extern "C" int GameActivity_register(JNIEnv *env) { "getWaterfallInsets", "()Landroidx/core/graphics/Insets;"); GET_METHOD_ID(gGameActivityClassInfo.setImeEditorInfoFields, activity_class, "setImeEditorInfoFields", "(III)V"); + jclass insets_class; FIND_CLASS(insets_class, kInsetsPathName); GET_FIELD_ID(gInsetsClassInfo.left, insets_class, "left", "I"); GET_FIELD_ID(gInsetsClassInfo.right, insets_class, "right", "I"); GET_FIELD_ID(gInsetsClassInfo.top, insets_class, "top", "I"); GET_FIELD_ID(gInsetsClassInfo.bottom, insets_class, "bottom", "I"); + + jclass configuration_class; + FIND_CLASS(configuration_class, kConfigurationPathName); + GET_FIELD_ID(gConfigurationClassInfo.colorMode, configuration_class, + "colorMode", "I"); + GET_FIELD_ID(gConfigurationClassInfo.densityDpi, configuration_class, + "densityDpi", "I"); + GET_FIELD_ID(gConfigurationClassInfo.fontScale, configuration_class, + "fontScale", "F"); + GET_FIELD_ID(gConfigurationClassInfo.fontWeightAdjustment, + configuration_class, "fontWeightAdjustment", "I"); + GET_FIELD_ID(gConfigurationClassInfo.hardKeyboardHidden, + configuration_class, "hardKeyboardHidden", "I"); + GET_FIELD_ID(gConfigurationClassInfo.keyboard, configuration_class, + "keyboard", "I"); + GET_FIELD_ID(gConfigurationClassInfo.keyboardHidden, configuration_class, + "keyboardHidden", "I"); + GET_FIELD_ID(gConfigurationClassInfo.mcc, configuration_class, "mcc", "I"); + GET_FIELD_ID(gConfigurationClassInfo.mnc, configuration_class, "mnc", "I"); + GET_FIELD_ID(gConfigurationClassInfo.navigation, configuration_class, + "navigation", "I"); + GET_FIELD_ID(gConfigurationClassInfo.navigationHidden, configuration_class, + "navigationHidden", "I"); + GET_FIELD_ID(gConfigurationClassInfo.orientation, configuration_class, + "orientation", "I"); + GET_FIELD_ID(gConfigurationClassInfo.screenHeightDp, configuration_class, + "screenHeightDp", "I"); + GET_FIELD_ID(gConfigurationClassInfo.screenLayout, configuration_class, + "screenLayout", "I"); + GET_FIELD_ID(gConfigurationClassInfo.screenWidthDp, configuration_class, + "screenWidthDp", "I"); + GET_FIELD_ID(gConfigurationClassInfo.smallestScreenWidthDp, + configuration_class, "smallestScreenWidthDp", "I"); + GET_FIELD_ID(gConfigurationClassInfo.touchscreen, configuration_class, + "touchscreen", "I"); + GET_FIELD_ID(gConfigurationClassInfo.uiMode, configuration_class, "uiMode", + "I"); + jclass windowInsetsCompatType_class; FIND_CLASS(windowInsetsCompatType_class, kWindowInsetsCompatTypePathName); gWindowInsetsCompatTypeClassInfo.clazz = @@ -1363,12 +1569,12 @@ extern "C" int GameActivity_register(JNIEnv *env) { extern "C" JNIEXPORT jlong JNICALL Java_com_google_androidgamesdk_GameActivity_initializeNativeCode( - JNIEnv *env, jobject javaGameActivity, - jstring internalDataDir, jstring obbDir, jstring externalDataDir, - jobject jAssetMgr, jbyteArray savedState) { + JNIEnv *env, jobject javaGameActivity, jstring internalDataDir, + jstring obbDir, jstring externalDataDir, jobject jAssetMgr, + jbyteArray savedState, jobject javaConfig) { GameActivity_register(env); jlong nativeCode = initializeNativeCode_native( - env, javaGameActivity,internalDataDir, obbDir, - externalDataDir, jAssetMgr, savedState); + env, javaGameActivity, internalDataDir, obbDir, externalDataDir, + jAssetMgr, savedState, javaConfig); return nativeCode; } diff --git a/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.h b/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.h index 05830893..452d90fc 100644 --- a/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.h +++ b/game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.h @@ -889,6 +889,30 @@ void GameActivity_getWindowInsets(GameActivity* activity, void GameActivity_setImeEditorInfo(GameActivity* activity, int inputType, int actionId, int imeOptions); +/** + * These are getters for Configuration class members. They may be called from + * any thread. + */ +int GameActivity_getOrientation(GameActivity* activity); +int GameActivity_getColorMode(GameActivity* activity); +int GameActivity_getDensityDpi(GameActivity* activity); +float GameActivity_getFontScale(GameActivity* activity); +int GameActivity_getFontWeightAdjustment(GameActivity* activity); +int GameActivity_getHardKeyboardHidden(GameActivity* activity); +int GameActivity_getKeyboard(GameActivity* activity); +int GameActivity_getKeyboardHidden(GameActivity* activity); +int GameActivity_getMcc(GameActivity* activity); +int GameActivity_getMnc(GameActivity* activity); +int GameActivity_getNavigation(GameActivity* activity); +int GameActivity_getNavigationHidden(GameActivity* activity); +int GameActivity_getOrientation(GameActivity* activity); +int GameActivity_getScreenHeightDp(GameActivity* activity); +int GameActivity_getScreenLayout(GameActivity* activity); +int GameActivity_getScreenWidthDp(GameActivity* activity); +int GameActivity_getSmallestScreenWidthDp(GameActivity* activity); +int GameActivity_getTouchscreen(GameActivity* activity); +int GameActivity_getUIMode(GameActivity* activity); + #ifdef __cplusplus } #endif diff --git a/game-activity/src/main/java/com/google/androidgamesdk/GameActivity.java b/game-activity/src/main/java/com/google/androidgamesdk/GameActivity.java index df19ed32..00c28900 100644 --- a/game-activity/src/main/java/com/google/androidgamesdk/GameActivity.java +++ b/game-activity/src/main/java/com/google/androidgamesdk/GameActivity.java @@ -157,7 +157,7 @@ public class GameActivity protected boolean mDestroyed; protected native long initializeNativeCode(String internalDataPath, String obbPath, - String externalDataPath, AssetManager assetMgr, byte[] savedState); + String externalDataPath, AssetManager assetMgr, byte[] savedState, Configuration config); protected native String getDlError(); @@ -173,7 +173,7 @@ public class GameActivity protected native void onStopNative(long handle); - protected native void onConfigurationChangedNative(long handle); + protected native void onConfigurationChangedNative(long handle, Configuration newConfig); protected native void onTrimMemoryNative(long handle, int level); @@ -304,8 +304,8 @@ public class GameActivity savedInstanceState != null ? savedInstanceState.getByteArray(KEY_NATIVE_SAVED_STATE) : null; mNativeHandle = initializeNativeCode(getAbsolutePath(getFilesDir()), - getAbsolutePath(getObbDir()), getAbsolutePath(getExternalFilesDir(null)), - getAssets(), nativeSavedState); + getAbsolutePath(getObbDir()), getAbsolutePath(getExternalFilesDir(null)), getAssets(), + nativeSavedState, getResources().getConfiguration()); if (mNativeHandle == 0) { throw new UnsatisfiedLinkError( @@ -373,7 +373,7 @@ public class GameActivity public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (!mDestroyed) { - onConfigurationChangedNative(mNativeHandle); + onConfigurationChangedNative(mNativeHandle, newConfig); } } |