aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Murphy <tomnom@google.com>2022-12-06 11:42:45 +0000
committerTom Murphy <tomnom@google.com>2022-12-06 11:43:30 +0000
commit2db5db2b44cbee35488cd07dd18ebd88ba1b49d1 (patch)
treef708e56c552b80c87883ef472a904eb1fc1c3c15
parent5e01ff2420dd6ead0d648103be19cf8f46019491 (diff)
downloadgamesdk-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
-rw-r--r--game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.cpp236
-rw-r--r--game-activity/prefab-src/modules/game-activity/include/game-activity/GameActivity.h24
-rw-r--r--game-activity/src/main/java/com/google/androidgamesdk/GameActivity.java10
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);
}
}