Android: Add input device selection

This commit is contained in:
JosJuice
2022-08-14 11:32:22 +02:00
parent 2113bf5e3a
commit 2b1dd52750
18 changed files with 204 additions and 25 deletions

View File

@ -17,6 +17,7 @@ add_library(main SHARED
Input/ControlReference.cpp
Input/ControlReference.h
Input/EmulatedController.cpp
Input/EmulatedController.h
Input/InputOverrider.cpp
Input/MappingCommon.cpp
Input/NumericSetting.cpp

View File

@ -16,7 +16,7 @@
#include "jni/Input/ControlGroup.h"
#include "jni/Input/ControlReference.h"
static ControllerEmu::EmulatedController* GetPointer(JNIEnv* env, jobject obj)
ControllerEmu::EmulatedController* EmulatedControllerFromJava(JNIEnv* env, jobject obj)
{
return reinterpret_cast<ControllerEmu::EmulatedController*>(
env->GetLongField(obj, IDCache::GetEmulatedControllerPointer()));
@ -34,25 +34,40 @@ static jobject EmulatedControllerToJava(JNIEnv* env, ControllerEmu::EmulatedCont
extern "C" {
JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getDefaultDevice(
JNIEnv* env, jobject obj)
{
return ToJString(env, EmulatedControllerFromJava(env, obj)->GetDefaultDevice().ToString());
}
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_setDefaultDevice(
JNIEnv* env, jobject obj, jstring j_device)
{
return EmulatedControllerFromJava(env, obj)->SetDefaultDevice(GetJString(env, j_device));
}
JNIEXPORT jint JNICALL
Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getGroupCount(
JNIEnv* env, jobject obj)
{
return static_cast<jint>(GetPointer(env, obj)->groups.size());
return static_cast<jint>(EmulatedControllerFromJava(env, obj)->groups.size());
}
JNIEXPORT jobject JNICALL
Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_getGroup(
JNIEnv* env, jobject obj, jint controller_index)
{
return ControlGroupToJava(env, GetPointer(env, obj)->groups[controller_index].get());
return ControlGroupToJava(env,
EmulatedControllerFromJava(env, obj)->groups[controller_index].get());
}
JNIEXPORT void JNICALL
Java_org_dolphinemu_dolphinemu_features_input_model_controlleremu_EmulatedController_updateSingleControlReference(
JNIEnv* env, jobject obj, jobject control_reference)
{
return GetPointer(env, obj)->UpdateSingleControlReference(
return EmulatedControllerFromJava(env, obj)->UpdateSingleControlReference(
g_controller_interface, ControlReferenceFromJava(env, control_reference));
}

View File

@ -0,0 +1,13 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <jni.h>
namespace ControllerEmu
{
class ControlReference;
}
ControllerEmu::EmulatedController* EmulatedControllerFromJava(JNIEnv* env, jobject obj);

View File

@ -17,6 +17,7 @@
#include "InputCommon/ControllerInterface/ControllerInterface.h"
#include "InputCommon/ControllerInterface/MappingCommon.h"
#include "jni/AndroidCommon/AndroidCommon.h"
#include "jni/Input/EmulatedController.h"
namespace
{
@ -28,10 +29,19 @@ constexpr auto INPUT_DETECT_MAXIMUM_TIME = std::chrono::seconds(5);
extern "C" {
JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_features_input_model_MappingCommon_detectInput(JNIEnv* env, jclass)
Java_org_dolphinemu_dolphinemu_features_input_model_MappingCommon_detectInput(
JNIEnv* env, jclass, jobject j_emulated_controller, jboolean all_devices)
{
const std::vector<std::string> device_strings = g_controller_interface.GetAllDeviceStrings();
const ciface::Core::DeviceQualifier default_device{};
ControllerEmu::EmulatedController* emulated_controller =
EmulatedControllerFromJava(env, j_emulated_controller);
const ciface::Core::DeviceQualifier default_device = emulated_controller->GetDefaultDevice();
std::vector<std::string> device_strings;
if (all_devices)
device_strings = g_controller_interface.GetAllDeviceStrings();
else
device_strings = {default_device.ToString()};
auto detections =
g_controller_interface.DetectInput(device_strings, INPUT_DETECT_INITIAL_TIME,