diff options
Diffstat (limited to 'Source/Android')
5 files changed, 94 insertions, 15 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt index 4b2c6ec92c..e0938b975d 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt @@ -5,21 +5,30 @@ package org.dolphinemu.dolphinemu.features.input.model.controlleremu import androidx.annotation.Keep /** + * Represents a C++ ControllerEmu::ControlGroupContainer. + * + * The lifetime of this class is managed by C++ code. Calling methods on it after it's destroyed + * in C++ is undefined behavior! + */ +@Keep +open class ControlGroupContainer constructor(private val pointer: Long) { + external fun getGroupCount(): Int + + external fun getGroup(index: Int): ControlGroup +} + +/** * Represents a C++ ControllerEmu::EmulatedController. * * The lifetime of this class is managed by C++ code. Calling methods on it after it's destroyed * in C++ is undefined behavior! */ @Keep -class EmulatedController private constructor(private val pointer: Long) { +class EmulatedController private constructor(private val pointer: Long) : ControlGroupContainer(pointer) { external fun getDefaultDevice(): String external fun setDefaultDevice(device: String) - external fun getGroupCount(): Int - - external fun getGroup(index: Int): ControlGroup - external fun updateSingleControlReference(controlReference: ControlReference) external fun loadDefaultSettings() @@ -50,7 +59,7 @@ class EmulatedController private constructor(private val pointer: Long) { external fun getWiimoteAttachment( controllerIndex: Int, attachmentIndex: Int - ): EmulatedController + ): ControlGroupContainer @JvmStatic external fun getSelectedWiimoteAttachment(controllerIndex: Int): Int diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt index ab0a85e11a..f98613cca6 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt @@ -22,6 +22,7 @@ import org.dolphinemu.dolphinemu.features.input.model.InputMappingBooleanSetting import org.dolphinemu.dolphinemu.features.input.model.InputMappingDoubleSetting import org.dolphinemu.dolphinemu.features.input.model.InputMappingIntSetting import org.dolphinemu.dolphinemu.features.input.model.controlleremu.ControlGroup +import org.dolphinemu.dolphinemu.features.input.model.controlleremu.ControlGroupContainer import org.dolphinemu.dolphinemu.features.input.model.controlleremu.EmulatedController import org.dolphinemu.dolphinemu.features.input.model.controlleremu.NumericSetting import org.dolphinemu.dolphinemu.features.input.model.view.InputDeviceSetting @@ -2255,8 +2256,9 @@ class SettingsFragmentPresenter( wiimoteNumber: Int, extensionType: Int ) { - addControllerMappingSettings( + addContainerMappingSettings( sl, + EmulatedController.getWiimote(wiimoteNumber), EmulatedController.getWiimoteAttachment(wiimoteNumber, extensionType), null ) @@ -2404,15 +2406,32 @@ class SettingsFragmentPresenter( * @param groupTypeFilter If this is non-null, only groups whose types match this are considered. */ private fun addControllerMappingSettings( + sl: ArrayList<SettingsItem>, + controller: EmulatedController, + groupTypeFilter: Set<Int>? + ) { + addContainerMappingSettings(sl, controller, controller, groupTypeFilter) + } + + /** + * Adds mapping settings and other control-specific settings. + * + * @param sl The list to place controller settings into. + * @param controller The encompassing controller. + * @param container The container of control groups to add settings for. + * @param groupTypeFilter If this is non-null, only groups whose types match this are considered. + */ + private fun addContainerMappingSettings( sl: ArrayList<SettingsItem>, controller: EmulatedController, + container: ControlGroupContainer, groupTypeFilter: Set<Int>? ) { updateOldControllerSettingsWarningVisibility(controller) - val groupCount = controller.getGroupCount() + val groupCount = container.getGroupCount() for (i in 0 until groupCount) { - val group = controller.getGroup(i) + val group = container.getGroup(i) val groupType = group.getGroupType() if (groupTypeFilter != null && !groupTypeFilter.contains(groupType)) continue diff --git a/Source/Android/jni/AndroidCommon/IDCache.cpp b/Source/Android/jni/AndroidCommon/IDCache.cpp index eba20ead91..33a679bf55 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.cpp +++ b/Source/Android/jni/AndroidCommon/IDCache.cpp @@ -97,6 +97,10 @@ static jclass s_control_reference_class; static jfieldID s_control_reference_pointer; static jmethodID s_control_reference_constructor; +static jclass s_control_group_container_class; +static jfieldID s_control_group_container_pointer; +static jmethodID s_control_group_container_constructor; + static jclass s_emulated_controller_class; static jfieldID s_emulated_controller_pointer; static jmethodID s_emulated_controller_constructor; @@ -446,6 +450,21 @@ jmethodID GetControlReferenceConstructor() return s_control_reference_constructor; } +jclass GetControlGroupContainerClass() +{ + return s_control_group_container_class; +} + +jfieldID GetControlGroupContainerPointer() +{ + return s_control_group_container_pointer; +} + +jmethodID GetControlGroupContainerConstructor() +{ + return s_control_group_container_constructor; +} + jclass GetEmulatedControllerClass() { return s_emulated_controller_class; @@ -685,6 +704,16 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) s_control_reference_constructor = env->GetMethodID(control_reference_class, "<init>", "(J)V"); env->DeleteLocalRef(control_reference_class); + const jclass control_group_container_class = env->FindClass( + "org/dolphinemu/dolphinemu/features/input/model/controlleremu/ControlGroupContainer"); + s_control_group_container_class = + reinterpret_cast<jclass>(env->NewGlobalRef(control_group_container_class)); + s_control_group_container_pointer = + env->GetFieldID(control_group_container_class, "pointer", "J"); + s_control_group_container_constructor = + env->GetMethodID(control_group_container_class, "<init>", "(J)V"); + env->DeleteLocalRef(control_group_container_class); + const jclass emulated_controller_class = env->FindClass( "org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController"); s_emulated_controller_class = @@ -754,5 +783,6 @@ JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved) env->DeleteGlobalRef(s_numeric_setting_class); env->DeleteGlobalRef(s_core_device_class); env->DeleteGlobalRef(s_core_device_control_class); + env->DeleteGlobalRef(s_control_group_container_class); } } diff --git a/Source/Android/jni/AndroidCommon/IDCache.h b/Source/Android/jni/AndroidCommon/IDCache.h index c31f598441..d28b493a5b 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.h +++ b/Source/Android/jni/AndroidCommon/IDCache.h @@ -92,6 +92,10 @@ jclass GetControlReferenceClass(); jfieldID GetControlReferencePointer(); jmethodID GetControlReferenceConstructor(); +jclass GetControlGroupContainerClass(); +jfieldID GetControlGroupContainerPointer(); +jmethodID GetControlGroupContainerConstructor(); + jclass GetEmulatedControllerClass(); jfieldID GetEmulatedControllerPointer(); jmethodID GetEmulatedControllerConstructor(); diff --git a/Source/Android/jni/Input/EmulatedController.cpp b/Source/Android/jni/Input/EmulatedController.cpp index 8a76240dfd..45f6148f2b 100644 --- a/Source/Android/jni/Input/EmulatedController.cpp +++ b/Source/Android/jni/Input/EmulatedController.cpp @@ -20,6 +20,23 @@ #include "jni/Input/ControlReference.h" #include "jni/Input/NumericSetting.h" +ControllerEmu::ControlGroupContainer* ControlGroupContainerFromJava(JNIEnv* env, jobject obj) +{ + return reinterpret_cast<ControllerEmu::ControlGroupContainer*>( + env->GetLongField(obj, IDCache::GetEmulatedControllerPointer())); +} + +static jobject ControlGroupContainerToJava(JNIEnv* env, + ControllerEmu::ControlGroupContainer* container) +{ + if (!container) + return nullptr; + + return env->NewObject(IDCache::GetControlGroupContainerClass(), + IDCache::GetControlGroupContainerConstructor(), + reinterpret_cast<jlong>(container)); +} + ControllerEmu::EmulatedController* EmulatedControllerFromJava(JNIEnv* env, jobject obj) { return reinterpret_cast<ControllerEmu::EmulatedController*>( @@ -53,18 +70,18 @@ Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedContro } JNIEXPORT jint JNICALL -Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getGroupCount( +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_ControlGroupContainer_getGroupCount( JNIEnv* env, jobject obj) { - return static_cast<jint>(EmulatedControllerFromJava(env, obj)->groups.size()); + return static_cast<jint>(ControlGroupContainerFromJava(env, obj)->groups.size()); } JNIEXPORT jobject JNICALL -Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getGroup( +Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_ControlGroupContainer_getGroup( JNIEnv* env, jobject obj, jint controller_index) { - return ControlGroupToJava(env, - EmulatedControllerFromJava(env, obj)->groups[controller_index].get()); + return ControlGroupToJava( + env, ControlGroupContainerFromJava(env, obj)->groups[controller_index].get()); } JNIEXPORT void JNICALL @@ -175,7 +192,7 @@ Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedContro { auto* attachments = static_cast<ControllerEmu::Attachments*>( Wiimote::GetWiimoteGroup(controller_index, WiimoteEmu::WiimoteGroup::Attachments)); - return EmulatedControllerToJava(env, attachments->GetAttachmentList()[attachment_index].get()); + return ControlGroupContainerToJava(env, attachments->GetAttachmentList()[attachment_index].get()); } JNIEXPORT jint JNICALL |
