From ea500923565f66326e0ace470184374f158781d8 Mon Sep 17 00:00:00 2001 From: victorfisac Date: Mon, 4 Jan 2016 21:00:20 +0100 Subject: Add Android physic buttons input detection - Added functions for detect when pressed, during down and when released. - Added defines for back, menu, volume up and down button numbers. --- src/core.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) (limited to 'src/core.c') diff --git a/src/core.c b/src/core.c index 06260281..6a470240 100644 --- a/src/core.c +++ b/src/core.c @@ -122,6 +122,8 @@ static int ident, events; static bool windowReady = false; // Used to detect display initialization static bool appEnabled = true; // Used to detec if app is active static bool contextRebindRequired = false; // Used to know context rebind required +static int previousButtonState[512] = { 1 }; // Required to check if button pressed/released once +static int currentButtonState[512] = { 1 }; // Required to check if button pressed/released once #elif defined(PLATFORM_RPI) static EGL_DISPMANX_WINDOW_T nativeWindow; // Native window (graphic device) @@ -365,6 +367,13 @@ void InitWindow(int width, int height, struct android_app *state) TraceLog(INFO, "Android app initialized successfully"); + // Init button states values (default up) + for(int i = 0; i < 512; i++) + { + currentButtonState[i] = 1; + previousButtonState[i] = 1; + } + // Wait for window to be initialized (display and context) while (!windowReady) { @@ -1101,6 +1110,34 @@ Vector2 GetTouchPosition(void) return position; } + +bool IsButtonPressed(int button) +{ + bool pressed = false; + + if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 0)) pressed = true; + else pressed = false; + + return pressed; +} + +// Detect if a button is being pressed (button held down) +bool IsButtonDown(int button) +{ + if (currentButtonState[button] == 0) return true; + else return false; +} + +// Detect if a button has been released once +bool IsButtonReleased(int button) +{ + bool released = false; + + if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 1)) released = true; + else released = false; + + return released; +} #endif //---------------------------------------------------------------------------------- @@ -1648,12 +1685,14 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) { int32_t keycode = AKeyEvent_getKeyCode(event); //int32_t AKeyEvent_getMetaState(event); + + currentButtonState[keycode] = AKeyEvent_getAction (event); // Down = 0, Up = 1 //if (keycode == AKEYCODE_HOME) { } - //if (keycode == AKEYCODE_POWER) { } - if (keycode == AKEYCODE_BACK) + if (keycode == AKEYCODE_POWER) { return 1; } + if ((keycode == AKEYCODE_BACK) || (keycode == AKEYCODE_MENU)) { - // Eat BACK_BUTTON, just do nothing... and don't let to be handled by OS! + // Eat BACK_BUTTON and AKEYCODE_MENU, just do nothing... and don't let to be handled by OS! return 1; } else if ((keycode == AKEYCODE_VOLUME_UP) || (keycode == AKEYCODE_VOLUME_DOWN)) @@ -1778,6 +1817,7 @@ static void PollInputEvents(void) // TODO: Remove this requirement... UpdateGestures(); + #endif #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) @@ -1806,6 +1846,9 @@ static void PollInputEvents(void) glfwPollEvents(); // Register keyboard/mouse events... and window events! #elif defined(PLATFORM_ANDROID) + // Register previous keys states + for (int i = 0; i < 512; i++) previousButtonState[i] = currentButtonState[i]; + // Poll Events (registered events) // NOTE: Activity is paused if not enabled (appEnabled) while ((ident = ALooper_pollAll(appEnabled ? 0 : -1, NULL, &events,(void**)&source)) >= 0) -- cgit v1.2.3 From 32508f6db1d3f3c070e80ea42e0a1244a4c88cab Mon Sep 17 00:00:00 2001 From: victorfisac Date: Tue, 5 Jan 2016 12:21:40 +0100 Subject: Fixed Android lock screen bug - Fixed Android locking screen bug. OnDestroy() was called when locking screen. - Power button input must be handled by OS. - AndroidManifest.xml is affected by configChanges="screenSize". - Updated library header for android template. --- src/core.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'src/core.c') diff --git a/src/core.c b/src/core.c index 96ce7176..40691403 100644 --- a/src/core.c +++ b/src/core.c @@ -1686,11 +1686,19 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) int32_t keycode = AKeyEvent_getKeyCode(event); //int32_t AKeyEvent_getMetaState(event); + // Save current button and its state currentButtonState[keycode] = AKeyEvent_getAction (event); // Down = 0, Up = 1 - //if (keycode == AKEYCODE_HOME) { } - if (keycode == AKEYCODE_POWER) { return 1; } - if ((keycode == AKEYCODE_BACK) || (keycode == AKEYCODE_MENU)) + if (keycode == AKEYCODE_POWER) + { + // Let the OS handle input to avoid app stuck. Behaviour: CMD_PAUSE -> CMD_SAVE_STATE -> CMD_STOP -> CMD_CONFIG_CHANGED -> CMD_LOST_FOCUS + // Resuming Behaviour: CMD_START -> CMD_RESUME -> CMD_CONFIG_CHANGED -> CMD_CONFIG_CHANGED -> CMD_GAINED_FOCUS + // It seems like locking mobile, screen size (CMD_CONFIG_CHANGED) is affected. + // NOTE: AndroidManifest.xml must have + // Before that change, activity was calling CMD_TERM_WINDOW and CMD_DESTROY when locking mobile, so that was not a normal behaviour + return 0; + } + else if ((keycode == AKEYCODE_BACK) || (keycode == AKEYCODE_MENU)) { // Eat BACK_BUTTON and AKEYCODE_MENU, just do nothing... and don't let to be handled by OS! return 1; -- cgit v1.2.3 From fe0cf8f9a9d6cafa40a1baf8b3cdace0268ccb82 Mon Sep 17 00:00:00 2001 From: victorfisac Date: Tue, 5 Jan 2016 13:58:20 +0100 Subject: Added some comments and fixed spaces --- src/core.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/core.c') diff --git a/src/core.c b/src/core.c index 40691403..1d05edc6 100644 --- a/src/core.c +++ b/src/core.c @@ -1111,6 +1111,7 @@ Vector2 GetTouchPosition(void) return position; } +// Detect if a button has been pressed once bool IsButtonPressed(int button) { bool pressed = false; -- cgit v1.2.3