InputCommon: Add Android InputBackend class.

This commit is contained in:
Jordan Woyak 2024-03-11 02:36:07 -05:00
parent 8583b6751a
commit a9a9fdd9e9
3 changed files with 28 additions and 19 deletions

View File

@ -23,6 +23,7 @@
#include "InputCommon/ControllerInterface/ControllerInterface.h" #include "InputCommon/ControllerInterface/ControllerInterface.h"
#include "InputCommon/ControllerInterface/InputBackend.h"
#include "jni/AndroidCommon/AndroidCommon.h" #include "jni/AndroidCommon/AndroidCommon.h"
#include "jni/AndroidCommon/IDCache.h" #include "jni/AndroidCommon/IDCache.h"
#include "jni/Input/CoreDevice.h" #include "jni/Input/CoreDevice.h"
@ -444,6 +445,23 @@ std::shared_ptr<ciface::Core::Device> FindDevice(jint device_id)
namespace ciface::Android namespace ciface::Android
{ {
class InputBackend final : public ciface::InputBackend
{
public:
using ciface::InputBackend::InputBackend;
~InputBackend();
void PopulateDevices() override;
private:
void AddDevice(JNIEnv* env, int device_id);
void AddSensorDevice(JNIEnv* env);
};
std::unique_ptr<ciface::InputBackend> CreateInputBackend(ControllerInterface* controller_interface)
{
return std::make_unique<InputBackend>(controller_interface);
}
class AndroidInput : public Core::Device::Input class AndroidInput : public Core::Device::Input
{ {
public: public:
@ -885,7 +903,7 @@ void Init()
s_controller_interface_register_input_device_listener); s_controller_interface_register_input_device_listener);
} }
void Shutdown() InputBackend::~InputBackend()
{ {
JNIEnv* env = IDCache::GetEnvForThread(); JNIEnv* env = IDCache::GetEnvForThread();
@ -903,7 +921,7 @@ void Shutdown()
env->DeleteGlobalRef(s_keycodes_array); env->DeleteGlobalRef(s_keycodes_array);
} }
static void AddDevice(JNIEnv* env, int device_id) void InputBackend::AddDevice(JNIEnv* env, int device_id)
{ {
jobject input_device = jobject input_device =
env->CallStaticObjectMethod(s_input_device_class, s_input_device_get_device, device_id); env->CallStaticObjectMethod(s_input_device_class, s_input_device_get_device, device_id);
@ -921,7 +939,7 @@ static void AddDevice(JNIEnv* env, int device_id)
if (device->Inputs().empty() && device->Outputs().empty()) if (device->Inputs().empty() && device->Outputs().empty())
return; return;
g_controller_interface.AddDevice(device); GetControllerInterface().AddDevice(device);
Core::DeviceQualifier qualifier; Core::DeviceQualifier qualifier;
qualifier.FromDevice(device.get()); qualifier.FromDevice(device.get());
@ -936,7 +954,7 @@ static void AddDevice(JNIEnv* env, int device_id)
env->DeleteLocalRef(j_qualifier); env->DeleteLocalRef(j_qualifier);
} }
static void AddSensorDevice(JNIEnv* env) void InputBackend::AddSensorDevice(JNIEnv* env)
{ {
// Device sensors (accelerometer, etc.) aren't associated with any Android InputDevice. // Device sensors (accelerometer, etc.) aren't associated with any Android InputDevice.
// Create an otherwise empty Dolphin input device so that they have somewhere to live. // Create an otherwise empty Dolphin input device so that they have somewhere to live.
@ -946,7 +964,7 @@ static void AddSensorDevice(JNIEnv* env)
if (device->Inputs().empty() && device->Outputs().empty()) if (device->Inputs().empty() && device->Outputs().empty())
return; return;
g_controller_interface.AddDevice(device); GetControllerInterface().AddDevice(device);
Core::DeviceQualifier qualifier; Core::DeviceQualifier qualifier;
qualifier.FromDevice(device.get()); qualifier.FromDevice(device.get());
@ -959,7 +977,7 @@ static void AddSensorDevice(JNIEnv* env)
env->DeleteLocalRef(j_qualifier); env->DeleteLocalRef(j_qualifier);
} }
void PopulateDevices() void InputBackend::PopulateDevices()
{ {
INFO_LOG_FMT(CONTROLLERINTERFACE, "Android populating devices"); INFO_LOG_FMT(CONTROLLERINTERFACE, "Android populating devices");

View File

@ -3,11 +3,10 @@
#pragma once #pragma once
#include "InputCommon/ControllerInterface/InputBackend.h"
namespace ciface::Android namespace ciface::Android
{ {
void Init(); std::unique_ptr<ciface::InputBackend> CreateInputBackend(ControllerInterface* controller_interface);
void Shutdown();
void PopulateDevices();
} // namespace ciface::Android } // namespace ciface::Android

View File

@ -71,7 +71,7 @@ void ControllerInterface::Initialize(const WindowSystemInfo& wsi)
m_input_backends.emplace_back(ciface::SDL::CreateInputBackend(this)); m_input_backends.emplace_back(ciface::SDL::CreateInputBackend(this));
#endif #endif
#ifdef CIFACE_USE_ANDROID #ifdef CIFACE_USE_ANDROID
ciface::Android::Init(); m_input_backends.emplace_back(ciface::Android::CreateInputBackend(this));
#endif #endif
#ifdef CIFACE_USE_EVDEV #ifdef CIFACE_USE_EVDEV
m_input_backends.emplace_back(ciface::evdev::CreateInputBackend(this)); m_input_backends.emplace_back(ciface::evdev::CreateInputBackend(this));
@ -157,10 +157,6 @@ void ControllerInterface::RefreshDevices(RefreshReason reason)
// do it async, to not risk the emulated controllers default config loading not finding a default // do it async, to not risk the emulated controllers default config loading not finding a default
// device. // device.
#ifdef CIFACE_USE_ANDROID
ciface::Android::PopulateDevices();
#endif
for (auto& backend : m_input_backends) for (auto& backend : m_input_backends)
backend->PopulateDevices(); backend->PopulateDevices();
@ -199,10 +195,6 @@ void ControllerInterface::Shutdown()
// Update control references so shared_ptr<Device>s are freed up BEFORE we shutdown the backends. // Update control references so shared_ptr<Device>s are freed up BEFORE we shutdown the backends.
ClearDevices(); ClearDevices();
#ifdef CIFACE_USE_ANDROID
ciface::Android::Shutdown();
#endif
// Empty the container of input backends to deconstruct and deinitialize them. // Empty the container of input backends to deconstruct and deinitialize them.
m_input_backends.clear(); m_input_backends.clear();