diff options
Diffstat (limited to 'src/android/app/src/main/jni')
-rw-r--r-- | src/android/app/src/main/jni/android_common/android_common.cpp | 9 | ||||
-rw-r--r-- | src/android/app/src/main/jni/android_common/android_common.h | 3 | ||||
-rw-r--r-- | src/android/app/src/main/jni/android_config.cpp | 62 | ||||
-rw-r--r-- | src/android/app/src/main/jni/android_config.h | 2 | ||||
-rw-r--r-- | src/android/app/src/main/jni/android_settings.h | 25 | ||||
-rw-r--r-- | src/android/app/src/main/jni/id_cache.cpp | 79 | ||||
-rw-r--r-- | src/android/app/src/main/jni/id_cache.h | 12 | ||||
-rw-r--r-- | src/android/app/src/main/jni/native_config.cpp | 70 |
8 files changed, 262 insertions, 0 deletions
diff --git a/src/android/app/src/main/jni/android_common/android_common.cpp b/src/android/app/src/main/jni/android_common/android_common.cpp index 52d8ecfeb..1e884ffdd 100644 --- a/src/android/app/src/main/jni/android_common/android_common.cpp +++ b/src/android/app/src/main/jni/android_common/android_common.cpp @@ -9,6 +9,7 @@ #include <jni.h> #include "common/string_util.h" +#include "jni/id_cache.h" std::string GetJString(JNIEnv* env, jstring jstr) { if (!jstr) { @@ -33,3 +34,11 @@ jstring ToJString(JNIEnv* env, std::string_view str) { jstring ToJString(JNIEnv* env, std::u16string_view str) { return ToJString(env, Common::UTF16ToUTF8(str)); } + +double GetJDouble(JNIEnv* env, jobject jdouble) { + return env->GetDoubleField(jdouble, IDCache::GetDoubleValueField()); +} + +jobject ToJDouble(JNIEnv* env, double value) { + return env->NewObject(IDCache::GetDoubleClass(), IDCache::GetDoubleConstructor(), value); +} diff --git a/src/android/app/src/main/jni/android_common/android_common.h b/src/android/app/src/main/jni/android_common/android_common.h index ccb0c06f7..8eb803e1b 100644 --- a/src/android/app/src/main/jni/android_common/android_common.h +++ b/src/android/app/src/main/jni/android_common/android_common.h @@ -10,3 +10,6 @@ std::string GetJString(JNIEnv* env, jstring jstr); jstring ToJString(JNIEnv* env, std::string_view str); jstring ToJString(JNIEnv* env, std::u16string_view str); + +double GetJDouble(JNIEnv* env, jobject jdouble); +jobject ToJDouble(JNIEnv* env, double value); diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index fb17ab6f6..c86aa1c39 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp @@ -35,6 +35,7 @@ void AndroidConfig::ReadAndroidValues() { if (global) { ReadAndroidUIValues(); ReadUIValues(); + ReadOverlayValues(); } ReadDriverValues(); } @@ -81,10 +82,42 @@ void AndroidConfig::ReadDriverValues() { EndGroup(); } +void AndroidConfig::ReadOverlayValues() { + BeginGroup(Settings::TranslateCategory(Settings::Category::Overlay)); + + ReadCategory(Settings::Category::Overlay); + + AndroidSettings::values.overlay_control_data.clear(); + const int control_data_size = BeginArray("control_data"); + for (int i = 0; i < control_data_size; ++i) { + SetArrayIndex(i); + AndroidSettings::OverlayControlData control_data; + control_data.id = ReadStringSetting(std::string("id")); + control_data.enabled = ReadBooleanSetting(std::string("enabled")); + control_data.landscape_position.first = + ReadDoubleSetting(std::string("landscape\\x_position")); + control_data.landscape_position.second = + ReadDoubleSetting(std::string("landscape\\y_position")); + control_data.portrait_position.first = + ReadDoubleSetting(std::string("portrait\\x_position")); + control_data.portrait_position.second = + ReadDoubleSetting(std::string("portrait\\y_position")); + control_data.foldable_position.first = + ReadDoubleSetting(std::string("foldable\\x_position")); + control_data.foldable_position.second = + ReadDoubleSetting(std::string("foldable\\y_position")); + AndroidSettings::values.overlay_control_data.push_back(control_data); + } + EndArray(); + + EndGroup(); +} + void AndroidConfig::SaveAndroidValues() { if (global) { SaveAndroidUIValues(); SaveUIValues(); + SaveOverlayValues(); } SaveDriverValues(); @@ -131,6 +164,35 @@ void AndroidConfig::SaveDriverValues() { EndGroup(); } +void AndroidConfig::SaveOverlayValues() { + BeginGroup(Settings::TranslateCategory(Settings::Category::Overlay)); + + WriteCategory(Settings::Category::Overlay); + + BeginArray("control_data"); + for (size_t i = 0; i < AndroidSettings::values.overlay_control_data.size(); ++i) { + SetArrayIndex(i); + const auto& control_data = AndroidSettings::values.overlay_control_data[i]; + WriteStringSetting(std::string("id"), control_data.id); + WriteBooleanSetting(std::string("enabled"), control_data.enabled); + WriteDoubleSetting(std::string("landscape\\x_position"), + control_data.landscape_position.first); + WriteDoubleSetting(std::string("landscape\\y_position"), + control_data.landscape_position.second); + WriteDoubleSetting(std::string("portrait\\x_position"), + control_data.portrait_position.first); + WriteDoubleSetting(std::string("portrait\\y_position"), + control_data.portrait_position.second); + WriteDoubleSetting(std::string("foldable\\x_position"), + control_data.foldable_position.first); + WriteDoubleSetting(std::string("foldable\\y_position"), + control_data.foldable_position.second); + } + EndArray(); + + EndGroup(); +} + std::vector<Settings::BasicSetting*>& AndroidConfig::FindRelevantList(Settings::Category category) { auto& map = Settings::values.linkage.by_category; if (map.contains(category)) { diff --git a/src/android/app/src/main/jni/android_config.h b/src/android/app/src/main/jni/android_config.h index 2c12874e1..d83852de9 100644 --- a/src/android/app/src/main/jni/android_config.h +++ b/src/android/app/src/main/jni/android_config.h @@ -18,6 +18,7 @@ protected: void ReadAndroidValues(); void ReadAndroidUIValues(); void ReadDriverValues(); + void ReadOverlayValues(); void ReadHidbusValues() override {} void ReadDebugControlValues() override {} void ReadPathValues() override; @@ -30,6 +31,7 @@ protected: void SaveAndroidValues(); void SaveAndroidUIValues(); void SaveDriverValues(); + void SaveOverlayValues(); void SaveHidbusValues() override {} void SaveDebugControlValues() override {} void SavePathValues() override; diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index 1e4906b9a..559ae83eb 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -14,6 +14,14 @@ struct GameDir { bool deep_scan = false; }; +struct OverlayControlData { + std::string id; + bool enabled; + std::pair<double, double> landscape_position; + std::pair<double, double> portrait_position; + std::pair<double, double> foldable_position; +}; + struct Values { Settings::Linkage linkage; @@ -38,6 +46,23 @@ struct Values { Settings::Setting<s32> theme_mode{linkage, -1, "theme_mode", Settings::Category::Android}; Settings::Setting<bool> black_backgrounds{linkage, false, "black_backgrounds", Settings::Category::Android}; + + // Input/performance overlay settings + std::vector<OverlayControlData> overlay_control_data; + Settings::Setting<s32> overlay_scale{linkage, 50, "control_scale", Settings::Category::Overlay}; + Settings::Setting<s32> overlay_opacity{linkage, 100, "control_opacity", + Settings::Category::Overlay}; + + Settings::Setting<bool> joystick_rel_center{linkage, true, "joystick_rel_center", + Settings::Category::Overlay}; + Settings::Setting<bool> dpad_slide{linkage, true, "dpad_slide", Settings::Category::Overlay}; + Settings::Setting<bool> haptic_feedback{linkage, true, "haptic_feedback", + Settings::Category::Overlay}; + Settings::Setting<bool> show_performance_overlay{linkage, true, "show_performance_overlay", + Settings::Category::Overlay}; + Settings::Setting<bool> show_input_overlay{linkage, true, "show_input_overlay", + Settings::Category::Overlay}; + Settings::Setting<bool> touchscreen{linkage, true, "touchscreen", Settings::Category::Overlay}; }; extern Values values; diff --git a/src/android/app/src/main/jni/id_cache.cpp b/src/android/app/src/main/jni/id_cache.cpp index e7a86d3fd..c79ad7d76 100644 --- a/src/android/app/src/main/jni/id_cache.cpp +++ b/src/android/app/src/main/jni/id_cache.cpp @@ -35,6 +35,18 @@ static jmethodID s_pair_constructor; static jfieldID s_pair_first_field; static jfieldID s_pair_second_field; +static jclass s_overlay_control_data_class; +static jmethodID s_overlay_control_data_constructor; +static jfieldID s_overlay_control_data_id_field; +static jfieldID s_overlay_control_data_enabled_field; +static jfieldID s_overlay_control_data_landscape_position_field; +static jfieldID s_overlay_control_data_portrait_position_field; +static jfieldID s_overlay_control_data_foldable_position_field; + +static jclass s_double_class; +static jmethodID s_double_constructor; +static jfieldID s_double_value_field; + static constexpr jint JNI_VERSION = JNI_VERSION_1_6; namespace IDCache { @@ -146,6 +158,46 @@ jfieldID GetPairSecondField() { return s_pair_second_field; } +jclass GetOverlayControlDataClass() { + return s_overlay_control_data_class; +} + +jmethodID GetOverlayControlDataConstructor() { + return s_overlay_control_data_constructor; +} + +jfieldID GetOverlayControlDataIdField() { + return s_overlay_control_data_id_field; +} + +jfieldID GetOverlayControlDataEnabledField() { + return s_overlay_control_data_enabled_field; +} + +jfieldID GetOverlayControlDataLandscapePositionField() { + return s_overlay_control_data_landscape_position_field; +} + +jfieldID GetOverlayControlDataPortraitPositionField() { + return s_overlay_control_data_portrait_position_field; +} + +jfieldID GetOverlayControlDataFoldablePositionField() { + return s_overlay_control_data_foldable_position_field; +} + +jclass GetDoubleClass() { + return s_double_class; +} + +jmethodID GetDoubleConstructor() { + return s_double_constructor; +} + +jfieldID GetDoubleValueField() { + return s_double_value_field; +} + } // namespace IDCache #ifdef __cplusplus @@ -207,6 +259,31 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { s_pair_second_field = env->GetFieldID(pair_class, "second", "Ljava/lang/Object;"); env->DeleteLocalRef(pair_class); + const jclass overlay_control_data_class = + env->FindClass("org/yuzu/yuzu_emu/overlay/model/OverlayControlData"); + s_overlay_control_data_class = + reinterpret_cast<jclass>(env->NewGlobalRef(overlay_control_data_class)); + s_overlay_control_data_constructor = + env->GetMethodID(overlay_control_data_class, "<init>", + "(Ljava/lang/String;ZLkotlin/Pair;Lkotlin/Pair;Lkotlin/Pair;)V"); + s_overlay_control_data_id_field = + env->GetFieldID(overlay_control_data_class, "id", "Ljava/lang/String;"); + s_overlay_control_data_enabled_field = + env->GetFieldID(overlay_control_data_class, "enabled", "Z"); + s_overlay_control_data_landscape_position_field = + env->GetFieldID(overlay_control_data_class, "landscapePosition", "Lkotlin/Pair;"); + s_overlay_control_data_portrait_position_field = + env->GetFieldID(overlay_control_data_class, "portraitPosition", "Lkotlin/Pair;"); + s_overlay_control_data_foldable_position_field = + env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;"); + env->DeleteLocalRef(overlay_control_data_class); + + const jclass double_class = env->FindClass("java/lang/Double"); + s_double_class = reinterpret_cast<jclass>(env->NewGlobalRef(double_class)); + s_double_constructor = env->GetMethodID(double_class, "<init>", "(D)V"); + s_double_value_field = env->GetFieldID(double_class, "value", "D"); + env->DeleteLocalRef(double_class); + // Initialize Android Storage Common::FS::Android::RegisterCallbacks(env, s_native_library_class); @@ -231,6 +308,8 @@ void JNI_OnUnload(JavaVM* vm, void* reserved) { env->DeleteGlobalRef(s_game_class); env->DeleteGlobalRef(s_string_class); env->DeleteGlobalRef(s_pair_class); + env->DeleteGlobalRef(s_overlay_control_data_class); + env->DeleteGlobalRef(s_double_class); // UnInitialize applets SoftwareKeyboard::CleanupJNI(env); diff --git a/src/android/app/src/main/jni/id_cache.h b/src/android/app/src/main/jni/id_cache.h index 24030be42..784d1412f 100644 --- a/src/android/app/src/main/jni/id_cache.h +++ b/src/android/app/src/main/jni/id_cache.h @@ -35,4 +35,16 @@ jmethodID GetPairConstructor(); jfieldID GetPairFirstField(); jfieldID GetPairSecondField(); +jclass GetOverlayControlDataClass(); +jmethodID GetOverlayControlDataConstructor(); +jfieldID GetOverlayControlDataIdField(); +jfieldID GetOverlayControlDataEnabledField(); +jfieldID GetOverlayControlDataLandscapePositionField(); +jfieldID GetOverlayControlDataPortraitPositionField(); +jfieldID GetOverlayControlDataFoldablePositionField(); + +jclass GetDoubleClass(); +jmethodID GetDoubleConstructor(); +jfieldID GetDoubleValueField(); + } // namespace IDCache diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 324d9e9cd..535902483 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -344,4 +344,74 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, j Settings::values.disabled_addons[program_id] = disabled_addons; } +jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getOverlayControlData(JNIEnv* env, + jobject obj) { + jobjectArray joverlayControlDataArray = + env->NewObjectArray(AndroidSettings::values.overlay_control_data.size(), + IDCache::GetOverlayControlDataClass(), nullptr); + for (size_t i = 0; i < AndroidSettings::values.overlay_control_data.size(); ++i) { + const auto& control_data = AndroidSettings::values.overlay_control_data[i]; + jobject jlandscapePosition = + env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), + ToJDouble(env, control_data.landscape_position.first), + ToJDouble(env, control_data.landscape_position.second)); + jobject jportraitPosition = + env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), + ToJDouble(env, control_data.portrait_position.first), + ToJDouble(env, control_data.portrait_position.second)); + jobject jfoldablePosition = + env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), + ToJDouble(env, control_data.foldable_position.first), + ToJDouble(env, control_data.foldable_position.second)); + + jobject jcontrolData = env->NewObject( + IDCache::GetOverlayControlDataClass(), IDCache::GetOverlayControlDataConstructor(), + ToJString(env, control_data.id), control_data.enabled, jlandscapePosition, + jportraitPosition, jfoldablePosition); + env->SetObjectArrayElement(joverlayControlDataArray, i, jcontrolData); + } + return joverlayControlDataArray; +} + +void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setOverlayControlData( + JNIEnv* env, jobject obj, jobjectArray joverlayControlDataArray) { + AndroidSettings::values.overlay_control_data.clear(); + int size = env->GetArrayLength(joverlayControlDataArray); + + if (size == 0) { + return; + } + + for (int i = 0; i < size; ++i) { + jobject joverlayControlData = env->GetObjectArrayElement(joverlayControlDataArray, i); + jstring jidString = static_cast<jstring>( + env->GetObjectField(joverlayControlData, IDCache::GetOverlayControlDataIdField())); + bool enabled = static_cast<bool>(env->GetBooleanField( + joverlayControlData, IDCache::GetOverlayControlDataEnabledField())); + + jobject jlandscapePosition = env->GetObjectField( + joverlayControlData, IDCache::GetOverlayControlDataLandscapePositionField()); + std::pair<double, double> landscape_position = std::make_pair( + GetJDouble(env, env->GetObjectField(jlandscapePosition, IDCache::GetPairFirstField())), + GetJDouble(env, + env->GetObjectField(jlandscapePosition, IDCache::GetPairSecondField()))); + + jobject jportraitPosition = env->GetObjectField( + joverlayControlData, IDCache::GetOverlayControlDataPortraitPositionField()); + std::pair<double, double> portrait_position = std::make_pair( + GetJDouble(env, env->GetObjectField(jportraitPosition, IDCache::GetPairFirstField())), + GetJDouble(env, env->GetObjectField(jportraitPosition, IDCache::GetPairSecondField()))); + + jobject jfoldablePosition = env->GetObjectField( + joverlayControlData, IDCache::GetOverlayControlDataFoldablePositionField()); + std::pair<double, double> foldable_position = std::make_pair( + GetJDouble(env, env->GetObjectField(jfoldablePosition, IDCache::GetPairFirstField())), + GetJDouble(env, env->GetObjectField(jfoldablePosition, IDCache::GetPairSecondField()))); + + AndroidSettings::values.overlay_control_data.push_back(AndroidSettings::OverlayControlData{ + GetJString(env, jidString), enabled, landscape_position, portrait_position, + foldable_position}); + } +} + } // extern "C" |