diff --git a/.gitignore b/.gitignore index 50d0c8589..6532d2658 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,8 @@ android/libs android/obj android/res android/.gradle +android/src/main/java/HID* +android/src/main/java/SDL* android-* *.apk *.keystore @@ -77,6 +79,6 @@ lib/openal lib/openssl lib/fribidi lib/harfbuzz +lib/sdl2 .DS_Store -supertuxkart/ diff --git a/android/Android.mk b/android/Android.mk index fab884335..cc550195b 100644 --- a/android/Android.mk +++ b/android/Android.mk @@ -176,7 +176,6 @@ LOCAL_MODULE := irrlicht LOCAL_PATH := . LOCAL_CPP_FEATURES += rtti LOCAL_SRC_FILES := $(wildcard ../lib/irrlicht/source/Irrlicht/*.cpp) \ - $(wildcard ../lib/irrlicht/source/Irrlicht/Android/*.cpp) \ ../lib/irrlicht/source/Irrlicht/stk_android_native_app_glue.c LOCAL_CFLAGS := -I../lib/irrlicht/source/Irrlicht/ \ -I../lib/irrlicht/include/ \ @@ -184,12 +183,58 @@ LOCAL_CFLAGS := -I../lib/irrlicht/source/Irrlicht/ \ -Iobj/jpeglib/ \ -Iobj/libpng/ \ -Iobj/zlib/ \ + -I../lib/sdl2/include/ \ -DANDROID_PACKAGE_CALLBACK_NAME=$(PACKAGE_CALLBACK_NAME) LOCAL_CPPFLAGS := -std=gnu++0x LOCAL_STATIC_LIBRARIES := jpeglib png zlib include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) +# SDL2 +LOCAL_MODULE := SDL2 +LOCAL_PATH := . +LOCAL_CPP_FEATURES += rtti +LOCAL_SRC_FILES := $(wildcard ../lib/sdl2/src/*.c) \ + $(wildcard ../lib/sdl2/src/audio/*.c) \ + $(wildcard ../lib/sdl2/src/audio/android/*.c) \ + $(wildcard ../lib/sdl2/src/audio/dummy/*.c) \ + $(wildcard ../lib/sdl2/src/audio/openslES/*.c) \ + $(wildcard ../lib/sdl2/src/core/android/*.c) \ + $(wildcard ../lib/sdl2/src/cpuinfo/*.c) \ + $(wildcard ../lib/sdl2/src/dynapi/*.c) \ + $(wildcard ../lib/sdl2/src/events/*.c) \ + $(wildcard ../lib/sdl2/src/file/*.c) \ + $(wildcard ../lib/sdl2/src/haptic/*.c) \ + $(wildcard ../lib/sdl2/src/haptic/android/*.c) \ + $(wildcard ../lib/sdl2/src/joystick/*.c) \ + $(wildcard ../lib/sdl2/src/joystick/android/*.c) \ + $(wildcard ../lib/sdl2/src/joystick/hidapi/*.c) \ + $(wildcard ../lib/sdl2/src/joystick/virtual/*.c) \ + $(wildcard ../lib/sdl2/src/loadso/dlopen/*.c) \ + $(wildcard ../lib/sdl2/src/power/*.c) \ + $(wildcard ../lib/sdl2/src/power/android/*.c) \ + $(wildcard ../lib/sdl2/src/filesystem/android/*.c) \ + $(wildcard ../lib/sdl2/src/sensor/*.c) \ + $(wildcard ../lib/sdl2/src/sensor/android/*.c) \ + $(wildcard ../lib/sdl2/src/render/*.c) \ + $(wildcard ../lib/sdl2/src/render/*/*.c) \ + $(wildcard ../lib/sdl2/src/stdlib/*.c) \ + $(wildcard ../lib/sdl2/src/thread/*.c) \ + $(wildcard ../lib/sdl2/src/thread/pthread/*.c) \ + $(wildcard ../lib/sdl2/src/timer/*.c) \ + $(wildcard ../lib/sdl2/src/timer/unix/*.c) \ + $(wildcard ../lib/sdl2/src/video/*.c) \ + $(wildcard ../lib/sdl2/src/video/android/*.c) \ + $(wildcard ../lib/sdl2/src/video/yuv2rgb/*.c) \ + ../lib/sdl2/src/atomic/SDL_atomic.c.arm \ + ../lib/sdl2/src/atomic/SDL_spinlock.c.arm \ + ../lib/sdl2/src/hidapi/android/hid.cpp +LOCAL_CFLAGS := -I../lib/sdl2/include/ -DGL_GLEXT_PROTOTYPES +LOCAL_CPPFLAGS := -std=gnu++0x +LOCAL_STATIC_LIBRARIES := cpufeatures + +include $(BUILD_STATIC_LIBRARY) +include $(CLEAR_VARS) # STK LOCAL_MODULE := main @@ -198,7 +243,7 @@ LOCAL_CPP_FEATURES += rtti exceptions LOCAL_SRC_FILES := $(wildcard ../src/*.cpp) \ $(wildcard ../src/*/*.cpp) \ $(wildcard ../src/*/*/*.cpp) -LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv3 -lOpenSLES +LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM -lGLESv3 -lOpenSLES -ldl LOCAL_CFLAGS := -I../lib/angelscript/include \ -I../lib/bullet/src \ -I../lib/libraqm \ @@ -208,6 +253,7 @@ LOCAL_CFLAGS := -I../lib/angelscript/include \ -I../lib/irrlicht/source/Irrlicht \ -I../lib/graphics_utils \ -I../lib/mcpp \ + -I../lib/sdl2/include \ -I../src \ -Iobj/curl/include \ -Iobj/fribidi/include \ @@ -229,9 +275,10 @@ LOCAL_CFLAGS := -I../lib/angelscript/include \ -DANDROID_PACKAGE_CALLBACK_NAME=$(PACKAGE_CALLBACK_NAME) LOCAL_CPPFLAGS := -std=gnu++0x -LOCAL_STATIC_LIBRARIES := irrlicht bullet enet ifaddrs angelscript mcpp \ +LOCAL_STATIC_LIBRARIES := irrlicht bullet enet ifaddrs angelscript mcpp SDL2 \ vorbisfile vorbis ogg openal curl libssl libcrypto \ c++_static raqm fribidi harfbuzz freetype graphics_utils include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) +$(call import-module, android/cpufeatures) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index fd9df9a03..c44da3fe6 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -38,8 +38,12 @@ - + + + + + diff --git a/android/make.sh b/android/make.sh index 1398780f2..322fb9dc9 100755 --- a/android/make.sh +++ b/android/make.sh @@ -559,6 +559,20 @@ sed -i "s/versionName=\".*\"/versionName=\"$PROJECT_VERSION\"/g" \ sed -i "s/versionCode=\".*\"/versionCode=\"$PROJECT_CODE\"/g" \ "$DIRNAME/AndroidManifest.xml" +cp -f "$DIRNAME/../lib/sdl2/android-project/app/src/main/java/org/libsdl/app/HIDDevice.java" \ + "$DIRNAME/src/main/java/" +cp -f "$DIRNAME/../lib/sdl2/android-project/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java" \ + "$DIRNAME/src/main/java/" +cp -f "$DIRNAME/../lib/sdl2/android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java" \ + "$DIRNAME/src/main/java/" +cp -f "$DIRNAME/../lib/sdl2/android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java" \ + "$DIRNAME/src/main/java/" +cp -f "$DIRNAME/../lib/sdl2/android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java" \ + "$DIRNAME/src/main/java/" + +sed -i "s/import org.supertuxkart.*.SuperTuxKartActivity;/import $PACKAGE_NAME.SuperTuxKartActivity;/g" \ + "$DIRNAME/src/main/java/SDLControllerManager.java" + cp "banner.png" "$DIRNAME/res/drawable/banner.png" cp "$APP_ICON" "$DIRNAME/res/drawable/icon.png" convert -scale 48x48 "$APP_ICON" "$DIRNAME/res/drawable-mdpi/icon.png" diff --git a/android/src/main/java/SuperTuxKartActivity.java b/android/src/main/java/SuperTuxKartActivity.java index b02b12ba5..07c688391 100644 --- a/android/src/main/java/SuperTuxKartActivity.java +++ b/android/src/main/java/SuperTuxKartActivity.java @@ -2,6 +2,9 @@ package org.supertuxkart.stk_dbg; import org.supertuxkart.stk_dbg.STKEditText; +import org.libsdl.app.SDLControllerManager; +import org.libsdl.app.HIDDeviceManager; + import android.app.NativeActivity; import android.content.ActivityNotFoundException; import android.content.Context; @@ -16,6 +19,8 @@ import android.text.Editable; import android.text.TextWatcher; import android.view.inputmethod.InputMethodManager; import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.ViewGroup.MarginLayoutParams; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.View; import android.widget.FrameLayout; @@ -30,10 +35,14 @@ import org.minidns.record.TXT; public class SuperTuxKartActivity extends NativeActivity { private STKEditText m_stk_edittext; + private static Context m_context; + private static HIDDeviceManager m_hid_device_manager; // ------------------------------------------------------------------------ private native void saveKeyboardHeight(int height); // ------------------------------------------------------------------------ + private native void startSTK(); + // ------------------------------------------------------------------------ private void hideKeyboardNative(final boolean clear_text) { if (m_stk_edittext == null) @@ -95,6 +104,7 @@ public class SuperTuxKartActivity extends NativeActivity { super.onCreate(instance); System.loadLibrary("main"); + m_context = this; m_stk_edittext = null; final View root = getWindow().getDecorView().findViewById( @@ -124,6 +134,12 @@ public class SuperTuxKartActivity extends NativeActivity hideNavBar(decor_view); } }); + SDLControllerManager.nativeSetupJNI(); + SDLControllerManager.initialize(); + m_hid_device_manager = HIDDeviceManager.acquire(this); + // We only start stk main thread after JNI_OnLoad (for initializing the + // java environment) + startSTK(); } // ------------------------------------------------------------------------ @Override @@ -131,7 +147,29 @@ public class SuperTuxKartActivity extends NativeActivity { super.onPause(); hideKeyboardNative(false/*clear_text*/); + if (m_hid_device_manager != null) + m_hid_device_manager.setFrozen(true); } + // ------------------------------------------------------------------------ + @Override + public void onResume() + { + super.onResume(); + if (m_hid_device_manager != null) + m_hid_device_manager.setFrozen(false); + } + // ------------------------------------------------------------------------ + @Override + protected void onDestroy() + { + if (m_hid_device_manager != null) + { + HIDDeviceManager.release(m_hid_device_manager); + m_hid_device_manager = null; + } + super.onDestroy(); + } + // ------------------------------------------------------------------------ @Override public void onWindowFocusChanged(boolean has_focus) @@ -144,6 +182,31 @@ public class SuperTuxKartActivity extends NativeActivity @Override public boolean dispatchKeyEvent(KeyEvent event) { + int device_id = event.getDeviceId(); + int source = event.getSource(); + + // Dispatch the different events depending on where they come from + // Some SOURCE_JOYSTICK, SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD + // So, we try to process them as JOYSTICK/DPAD/GAMEPAD events first, if that fails we try them as KEYBOARD + // + // Furthermore, it's possible a game controller has SOURCE_KEYBOARD and + // SOURCE_JOYSTICK, while its key events arrive from the keyboard source + // So, retrieve the device itself and check all of its sources + if (SDLControllerManager.isDeviceSDLJoystick(device_id)) + { + // Note that we process events with specific key codes here + if (event.getAction() == KeyEvent.ACTION_DOWN) + { + if (SDLControllerManager.onNativePadDown(device_id, event.getKeyCode()) == 0) + return true; + } + else if (event.getAction() == KeyEvent.ACTION_UP) + { + if (SDLControllerManager.onNativePadUp(device_id, event.getKeyCode()) == 0) + return true; + } + } + // Called when user change cursor / select all text in native android // keyboard boolean ret = super.dispatchKeyEvent(event); @@ -152,6 +215,14 @@ public class SuperTuxKartActivity extends NativeActivity return ret; } // ------------------------------------------------------------------------ + @Override + public boolean dispatchGenericMotionEvent(MotionEvent ev) + { + if (SDLControllerManager.useGenericMotionListener(ev)) + return true; + return super.dispatchGenericMotionEvent(ev); + } + // ------------------------------------------------------------------------ public void showKeyboard(final int type) { final Context context = this; @@ -272,4 +343,6 @@ public class SuperTuxKartActivity extends NativeActivity return getResources().getConfiguration() .keyboard == Configuration.KEYBOARD_QWERTY; } + // ------------------------------------------------------------------------ + public static Context getContext() { return m_context; } } diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp index f658c1eb9..8f9d95756 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp @@ -18,6 +18,8 @@ #include "MobileCursorControl.h" #include "../../../../src/utils/utf8/unchecked.h" +#include + // Call when android keyboard is opened or close, and save its height for // moving screen std::atomic g_keyboard_height(0); @@ -99,22 +101,7 @@ CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param) if (Android != NULL) { - jint status = Android->activity->vm->GetEnv((void**)&m_jni_env, JNI_VERSION_1_6); - if (status == JNI_EDETACHED) - { - JavaVMAttachArgs args; - args.version = JNI_VERSION_1_6; - args.name = "NativeThread"; - args.group = NULL; - - status = Android->activity->vm->AttachCurrentThread(&m_jni_env, &args); - } - if (status != JNI_OK) - { - os::Printer::log("Failed to attach jni thread.", ELL_DEBUG); - return; - } - + m_jni_env = (JNIEnv*)SDL_AndroidGetJNIEnv(); Android->userData = this; Android->onAppCmd = handleAndroidCommand; Android->onAppCmdDirect = NULL; @@ -178,7 +165,6 @@ CIrrDeviceAndroid::~CIrrDeviceAndroid() Android->userData = NULL; Android->onAppCmd = NULL; Android->onInputEvent = NULL; - Android->activity->vm->DetachCurrentThread(); } } @@ -529,35 +515,31 @@ s32 CIrrDeviceAndroid::handleInput(android_app* app, AInputEvent* androidEvent) { CIrrDeviceAndroid* device = (CIrrDeviceAndroid*)app->userData; assert(device != NULL); - - s32 status = 0; - + + // SDL will handle it int32_t source = AInputEvent_getSource(androidEvent); - int32_t type = AInputEvent_getType(androidEvent); - if (source == AINPUT_SOURCE_GAMEPAD || source == AINPUT_SOURCE_JOYSTICK || source == AINPUT_SOURCE_DPAD) + return 0; + + s32 status = 0; + int32_t type = AInputEvent_getType(androidEvent); + + switch (type) { - status = device->handleGamepad(androidEvent); + case AINPUT_EVENT_TYPE_MOTION: + { + status = device->handleTouch(androidEvent); + break; } - else + case AINPUT_EVENT_TYPE_KEY: { - switch (type) - { - case AINPUT_EVENT_TYPE_MOTION: - { - status = device->handleTouch(androidEvent); - break; - } - case AINPUT_EVENT_TYPE_KEY: - { - status = device->handleKeyboard(androidEvent); - break; - } - default: - break; - } + status = device->handleKeyboard(androidEvent); + break; + } + default: + break; } return status; @@ -747,144 +729,6 @@ s32 CIrrDeviceAndroid::handleKeyboard(AInputEvent* androidEvent) return status; } -s32 CIrrDeviceAndroid::handleGamepad(AInputEvent* androidEvent) -{ - s32 status = 0; - - int32_t type = AInputEvent_getType(androidEvent); - - switch (type) - { - case AINPUT_EVENT_TYPE_MOTION: - { - float axis_x = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_HAT_X, 0); - - if (axis_x == 0) - { - axis_x = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_X, 0); - } - - if (axis_x == 0) - { - axis_x = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_Z, 0); - } - - float axis_y = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_HAT_Y, 0); - - if (axis_y == 0) - { - axis_y = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_Y, 0); - } - - if (axis_y == 0) - { - axis_y = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_RZ, 0); - } - - SEvent event; - event.EventType = EET_KEY_INPUT_EVENT; - event.KeyInput.Char = 0; - event.KeyInput.Shift = false; - event.KeyInput.Control = false; - event.KeyInput.SystemKeyCode = 0; - - float deadzone = 0.3f; - - axis_x = axis_x > deadzone || axis_x < -deadzone ? axis_x : 0; - axis_y = axis_y > deadzone || axis_y < -deadzone ? axis_y : 0; - - if (axis_x != GamepadAxisX) - { - if (GamepadAxisX != 0) - { - event.KeyInput.PressedDown = false; - event.KeyInput.Key = GamepadAxisX < 0 ? IRR_KEY_BUTTON_LEFT - : IRR_KEY_BUTTON_RIGHT; - postEventFromUser(event); - } - - if (axis_x != 0) - { - event.KeyInput.PressedDown = true; - event.KeyInput.Key = axis_x < 0 ? IRR_KEY_BUTTON_LEFT - : IRR_KEY_BUTTON_RIGHT; - postEventFromUser(event); - } - - GamepadAxisX = axis_x; - } - - if (axis_y != GamepadAxisY) - { - if (GamepadAxisY != 0) - { - event.KeyInput.PressedDown = false; - event.KeyInput.Key = GamepadAxisY < 0 ? IRR_KEY_BUTTON_UP - : IRR_KEY_BUTTON_DOWN; - postEventFromUser(event); - } - - if (axis_y != 0) - { - event.KeyInput.PressedDown = true; - event.KeyInput.Key = axis_y < 0 ? IRR_KEY_BUTTON_UP - : IRR_KEY_BUTTON_DOWN; - postEventFromUser(event); - } - - GamepadAxisY = axis_y; - } - - status = 1; - - break; - } - case AINPUT_EVENT_TYPE_KEY: - { - bool ignore = false; - - int32_t keyCode = AKeyEvent_getKeyCode(androidEvent); - int32_t keyAction = AKeyEvent_getAction(androidEvent); - int32_t keyRepeat = AKeyEvent_getRepeatCount(androidEvent); - int32_t scanCode = AKeyEvent_getScanCode(androidEvent); - - if (keyRepeat == 0) - { - bool ignore_event = false; - - SEvent event; - event.EventType = EET_KEY_INPUT_EVENT; - event.KeyInput.Char = 0; - event.KeyInput.PressedDown = (keyAction == AKEY_EVENT_ACTION_DOWN); - event.KeyInput.Shift = false; - event.KeyInput.Control = false; - event.KeyInput.SystemKeyCode = (u32)keyCode; - event.KeyInput.Key = KeyMap[keyCode]; - - if (event.KeyInput.Key == 0) - { - event.KeyInput.Key = (EKEY_CODE)((int)IRR_KEY_CODES_COUNT + scanCode); - } - - postEventFromUser(event); - } - - status = 1; - break; - } - default: - break; - } - - return status; -} - video::SExposedVideoData& CIrrDeviceAndroid::getExposedVideoData() { return ExposedVideoData; diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h index 679e6aa9b..6e125cb71 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h @@ -146,7 +146,6 @@ namespace irr s32 handleTouch(AInputEvent* androidEvent); s32 handleKeyboard(AInputEvent* androidEvent); - s32 handleGamepad(AInputEvent* androidEvent); }; } // end namespace irr diff --git a/lib/irrlicht/source/Irrlicht/stk_android_native_app_glue.c b/lib/irrlicht/source/Irrlicht/stk_android_native_app_glue.c index 6d4be1080..aca8bce25 100644 --- a/lib/irrlicht/source/Irrlicht/stk_android_native_app_glue.c +++ b/lib/irrlicht/source/Irrlicht/stk_android_native_app_glue.c @@ -240,7 +240,7 @@ static void* android_app_entry(void* param) { // -------------------------------------------------------------------- // Native activity interaction (called from main thread) // -------------------------------------------------------------------- - +struct android_app* g_android_app; static struct android_app* android_app_create(ANativeActivity* activity, void* savedState, size_t savedStateSize) { struct android_app* android_app = (struct android_app*)malloc(sizeof(struct android_app)); @@ -263,19 +263,7 @@ static struct android_app* android_app_create(ANativeActivity* activity, } android_app->msgread = msgpipe[0]; android_app->msgwrite = msgpipe[1]; - - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&android_app->thread, &attr, android_app_entry, android_app); - - // Wait for thread to start. - pthread_mutex_lock(&android_app->mutex); - while (!android_app->running) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); - + g_android_app = android_app; return android_app; } @@ -463,3 +451,25 @@ void ANativeActivity_onCreate(ANativeActivity* activity, activity->instance = android_app_create(activity, savedState, savedStateSize); } + +#define MAKE_ANDROID_START_STK_CALLBACK(x) JNIEXPORT void JNICALL Java_ ## x##_SuperTuxKartActivity_startSTK(JNIEnv* env, jobject this_obj) +#define ANDROID_START_STK_CALLBACK(PKG_NAME) MAKE_ANDROID_START_STK_CALLBACK(PKG_NAME) + +ANDROID_START_STK_CALLBACK(ANDROID_PACKAGE_CALLBACK_NAME) +{ + // This will be called after ANativeActivity_onCreate and loadLibrary + // (so SDL java environment is ready in JNI_OnLoad) + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_create(&g_android_app->thread, &attr, android_app_entry, g_android_app); + pthread_attr_destroy(&attr); + + // Wait for thread to start. + pthread_mutex_lock(&g_android_app->mutex); + while (!g_android_app->running) + { + pthread_cond_wait(&g_android_app->cond, &g_android_app->mutex); + } + pthread_mutex_unlock(&g_android_app->mutex); +} diff --git a/src/input/device_manager.cpp b/src/input/device_manager.cpp index 2d49a3bef..e61836a7b 100644 --- a/src/input/device_manager.cpp +++ b/src/input/device_manager.cpp @@ -23,7 +23,6 @@ #include "config/user_config.hpp" #include "graphics/irr_driver.hpp" -#include "input/gamepad_android_config.hpp" #include "input/gamepad_device.hpp" #include "input/keyboard_device.hpp" #include "input/multitouch_device.hpp" @@ -83,24 +82,6 @@ bool DeviceManager::initialize() created = true; } - -#ifdef ANDROID - bool has_gamepad_android_config = false; - - for (unsigned int i = 0; i < m_keyboard_configs.size(); i++) - { - if (m_keyboard_configs[i].isGamePadAndroid()) - { - has_gamepad_android_config = true; - } - } - - if (!has_gamepad_android_config) - { - m_keyboard_configs.push_back(new GamepadAndroidConfig()); - created = true; - } -#endif const int keyboard_amount = m_keyboard_configs.size(); for (int n = 0; n < keyboard_amount; n++) @@ -528,8 +509,7 @@ bool DeviceManager::load() config->getName().c_str()); continue; } - if (config->getName() == "keyboard" || - config->getName() == "gamepad_android") + if (config->getName() == "keyboard") { KeyboardConfig *kc = static_cast(device_config); m_keyboard_configs.push_back(kc);