@@ -71,6 +71,9 @@ extern std::string g_android_executable_dir;
7171extern std::string g_android_config_dir;
7272extern std::string g_android_cache_dir;
7373
74+ std::string g_input_config_override;
75+ cfg_input_configurations g_cfg_input_configs;
76+
7477LOG_CHANNEL (rpcs3_android, " ANDROID" );
7578
7679struct LogListener : logs::listener {
@@ -150,9 +153,6 @@ struct GraphicsFrame : GSFrameBase {
150153 u32 sshot_height, bool is_bgra) override {}
151154};
152155
153- std::string g_input_config_override;
154- cfg_input_configurations g_cfg_input_configs;
155-
156156void jit_announce (uptr, usz, std::string_view);
157157
158158[[noreturn]] void report_fatal_error (std::string_view _text,
@@ -914,36 +914,87 @@ extern "C" JNIEXPORT jboolean JNICALL Java_net_rpcs3_RPCS3_surfaceEvent(
914914 return true ;
915915}
916916
917- extern " C" JNIEXPORT jboolean JNICALL
918- Java_net_rpcs3_RPCS3_usbDeviceEvent (JNIEnv *env, jobject, jint fd, jint event) {
919- rpcs3_android.warning (" usb device event %d, %d" , fd, event);
917+ extern " C" JNIEXPORT jboolean JNICALL Java_net_rpcs3_RPCS3_usbDeviceEvent (
918+ JNIEnv *env, jobject, jint fd, jint vendorId, jint productId, jint event) {
919+ rpcs3_android.warning (
920+ " usb device event %d fd: %d, vendorId: %d, productId: %d" , event, fd,
921+ vendorId, productId);
920922
921923 {
922924 std::lock_guard lock (g_android_usb_devices_mutex);
923925
924926 if (event == 0 ) {
925- g_android_usb_devices.push_back (fd);
927+ g_android_usb_devices.push_back ({
928+ .fd = int (fd),
929+ .vendorId = u16 (vendorId),
930+ .productId = u16 (productId),
931+ });
926932 } else {
927- if (auto it = std::ranges::find (g_android_usb_devices, fd);
933+ auto filter = [fd](auto device) { return device.fd == fd; };
934+ if (auto it = std::ranges::find_if (g_android_usb_devices, filter);
928935 it != g_android_usb_devices.end ()) {
929936 g_android_usb_devices.erase (it);
930937 }
931938 }
932939 }
933940
934941 {
935- auto list = [](auto handler, std::string name) {
936- rpcs3_android.warning (" going to enumerate %s pads" , name);
937- handler.Init ();
942+ auto selectedHandler = g_cfg_input.player1 .handler .get ();
943+ std::string selectedDevice;
944+
945+ std::map<pad_handler, std::pair<std::unique_ptr<PadHandlerBase>,
946+ std::vector<std::string>>>
947+ handlerToDevices;
948+
949+ auto collectDevices = [&](auto handler) {
950+ handler->Init ();
951+
952+ std::vector<std::string> devices;
953+ for (const auto &device : handler->list_devices ()) {
954+ devices.push_back (device.name );
955+ }
956+
957+ auto type = handler->m_type ;
958+
959+ handlerToDevices[type] = std::pair{
960+ std::move (handler),
961+ std::move (devices),
962+ };
938963 };
939964
940- list (ds3_pad_handler (), " ds3" );
941- list (ds4_pad_handler (), " ds4" );
942- list (dualsense_pad_handler (), " dualsense" );
965+ collectDevices (std::make_unique<dualsense_pad_handler>());
966+ collectDevices (std::make_unique<ds4_pad_handler>());
967+ collectDevices (std::make_unique<ds3_pad_handler>());
968+
969+ if (handlerToDevices[selectedHandler].second .empty ()) {
970+ selectedHandler = pad_handler::null;
971+ }
972+
973+ if (!handlerToDevices[pad_handler::dualsense].second .empty ()) {
974+ selectedHandler = pad_handler::dualsense;
975+ } else if (!handlerToDevices[pad_handler::ds4].second .empty ()) {
976+ selectedHandler = pad_handler::ds4;
977+ } else if (!handlerToDevices[pad_handler::ds3].second .empty ()) {
978+ selectedHandler = pad_handler::ds3;
979+ }
980+
981+ if (selectedHandler != g_cfg_input.player1 .handler .get ()) {
982+ rpcs3_android.warning (" install %s pad handler" , selectedHandler);
983+
984+ g_cfg_input.player1 .handler .set (selectedHandler);
985+
986+ if (selectedHandler != pad_handler::null) {
987+ g_cfg_input.player1 .device .from_string (
988+ handlerToDevices[selectedHandler].second .front ());
989+ handlerToDevices[selectedHandler].first ->init_config (&g_cfg_input.player1 .config );
990+ } else {
991+ g_cfg_input.player1 .device .from_default ();
992+ }
993+
994+ g_cfg_input.save (" " , g_cfg_input_configs.default_config );
995+ }
943996 }
944997
945- // FIXME
946- g_cfg_input.player1 .handler .set (pad_handler::dualsense);
947998 return true ;
948999}
9491000
0 commit comments