summaryrefslogtreecommitdiff
path: root/Source/Android
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2025-01-20 23:19:56 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2025-03-15 14:30:43 -0500
commitddb82a5e8ca84df1b95942c8b3a1fa6c9071010b (patch)
tree996de0475d813c192e64a0f3d6004181cdf54b8e /Source/Android
parent225039f742d14eacd704490bb1a66dc119a91320 (diff)
InputCommon/ControllerEmu: Break out functionality of EmulatedController
to eliminate redundant unused members in Wii Remote extension objects.
Diffstat (limited to 'Source/Android')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/controlleremu/EmulatedController.kt21
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt25
-rw-r--r--Source/Android/jni/AndroidCommon/IDCache.cpp30
-rw-r--r--Source/Android/jni/AndroidCommon/IDCache.h4
-rw-r--r--Source/Android/jni/Input/EmulatedController.cpp29
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