Skip to content

Commit

Permalink
Improved error handling in Android plugins.
Browse files Browse the repository at this point in the history
  • Loading branch information
znakeeye committed Feb 21, 2025
1 parent 45bf643 commit eb51cfc
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 52 deletions.
76 changes: 39 additions & 37 deletions code/plugins/Joystick/android/orxJoystick.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -313,56 +313,58 @@ orxSTATUS orxFASTCALL orxJoystick_Android_Init()
/* Wasn't already initialized? */
if(!(sstJoystick.u32Flags & orxJOYSTICK_KU32_STATIC_FLAG_READY))
{
/* Cleans static controller */
orxMemory_Zero(&sstJoystick, sizeof(orxJOYSTICK_STATIC));

orxASSERT(Paddleboat_isInitialized());
/* Adds controller status callback */
/* Note : Undocumented quirk. Without a controller status callback,
* connected devices will remain inactive. */
Paddleboat_setControllerStatusCallback(orxJoystick_Android_GameControllerStatusCallback, NULL);
if(Paddleboat_isInitialized())
{
/* Cleans static controller */
orxMemory_Zero(&sstJoystick, sizeof(orxJOYSTICK_STATIC));

orxConfig_PushSection(KZ_CONFIG_ANDROID);
/* Adds controller status callback */
/* Note : Undocumented quirk. Without a controller status callback,
* connected devices will remain inactive. */
Paddleboat_setControllerStatusCallback(orxJoystick_Android_GameControllerStatusCallback, NULL);

sstJoystick.s32ScreenRotation = -1;
sstJoystick.bAccelerometerEnabled = orxFALSE;
orxConfig_PushSection(KZ_CONFIG_ANDROID);

if(orxConfig_HasValue(KZ_CONFIG_ACCELEROMETER_FREQUENCY))
{
sstJoystick.u32Frequency = orxConfig_GetU32(KZ_CONFIG_ACCELEROMETER_FREQUENCY);
}
sstJoystick.s32ScreenRotation = -1;
sstJoystick.bAccelerometerEnabled = orxFALSE;

orxConfig_PopSection();
if(orxConfig_HasValue(KZ_CONFIG_ACCELEROMETER_FREQUENCY))
{
sstJoystick.u32Frequency = orxConfig_GetU32(KZ_CONFIG_ACCELEROMETER_FREQUENCY);
}

/* Note : Avoid consuming battery if accelerometer is not used. */
if(sstJoystick.u32Frequency > 0)
{
sstJoystick.sensorManager = ASensorManager_getInstance();
sstJoystick.accelerometerSensor = ASensorManager_getDefaultSensor(sstJoystick.sensorManager, ASENSOR_TYPE_ACCELEROMETER);
orxConfig_PopSection();

if(sstJoystick.accelerometerSensor != NULL)
/* Note : Avoid consuming battery if accelerometer is not used. */
if(sstJoystick.u32Frequency > 0)
{
/* Adds event handlers */
if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_SYSTEM, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE)
{
orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_SYSTEM, orxNULL, orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_LOST) | orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_GAINED), orxEVENT_KU32_MASK_ID_ALL);
sstJoystick.sensorManager = ASensorManager_getInstance();
sstJoystick.accelerometerSensor = ASensorManager_getDefaultSensor(sstJoystick.sensorManager, ASENSOR_TYPE_ACCELEROMETER);

if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_ANDROID, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE)
if(sstJoystick.accelerometerSensor != NULL)
{
/* Adds event handlers */
if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_SYSTEM, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE)
{
orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_ANDROID, orxNULL, orxEVENT_GET_FLAG(orxANDROID_EVENT_SURFACE_CHANGE) | orxEVENT_GET_FLAG(orxANDROID_EVENT_ACCELERATE), orxEVENT_KU32_MASK_ID_ALL);
orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_SYSTEM, orxNULL, orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_LOST) | orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_GAINED), orxEVENT_KU32_MASK_ID_ALL);

if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_ANDROID, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE)
{
orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_ANDROID, orxNULL, orxEVENT_GET_FLAG(orxANDROID_EVENT_SURFACE_CHANGE) | orxEVENT_GET_FLAG(orxANDROID_EVENT_ACCELERATE), orxEVENT_KU32_MASK_ID_ALL);

ALooper* looper = ALooper_forThread();
sstJoystick.sensorEventQueue = ASensorManager_createEventQueue(sstJoystick.sensorManager, looper, LOOPER_ID_SENSOR, NULL, NULL);
ALooper* looper = ALooper_forThread();
sstJoystick.sensorEventQueue = ASensorManager_createEventQueue(sstJoystick.sensorManager, looper, LOOPER_ID_SENSOR, NULL, NULL);

/* Enables sensor */
orxJoystick_Android_EnableSensorManager();
/* Enables sensor */
orxJoystick_Android_EnableSensorManager();
}
}
}
}
}

/* Updates status */
sstJoystick.u32Flags |= orxJOYSTICK_KU32_STATIC_FLAG_READY;
/* Updates status */
sstJoystick.u32Flags |= orxJOYSTICK_KU32_STATIC_FLAG_READY;
}
}

/* Done! */
Expand Down Expand Up @@ -420,10 +422,10 @@ orxFLOAT orxFASTCALL orxJoystick_Android_GetAxisValue(orxJOYSTICK_AXIS _eAxis)
if(Paddleboat_getControllerData(u32ID, &controllerData) == PADDLEBOAT_NO_ERROR)
{
orxS32 s32Axis;

/* Gets axis */
s32Axis = _eAxis % orxJOYSTICK_AXIS_SINGLE_NUMBER;

/* Updates result */
switch(s32Axis)
{
Expand Down
46 changes: 31 additions & 15 deletions code/src/main/android/orxAndroidSupport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -744,13 +744,17 @@ extern int main(int argc, char *argv[]);

void android_main(android_app *_pstState)
{
char *argv[orxANDROID_KU32_MAX_ARGUMENT_COUNT];
Paddleboat_ErrorCode paddleboatError;
bool bSwappyInitialized;
char *azArgumentList[orxANDROID_KU32_MAX_ARGUMENT_COUNT];
int iArgumentCount;
char *pc;

/* Inits Java VM */
jVM = _pstState->activity->vm;

JNIEnv *pstEnv = orxAndroid_JNI_GetEnv();
if (pstEnv == NULL)
if(pstEnv == NULL)
{
/* Exits gracefully */
return;
Expand Down Expand Up @@ -779,31 +783,34 @@ void android_main(android_app *_pstState)

_pstState->onAppCmd = orxAndroid_handleCmd;

/* Inits joystick support */
Paddleboat_init(pstEnv, _pstState->activity->javaGameActivity);
/* Inits Paddleboat */
paddleboatError = Paddleboat_init(pstEnv, _pstState->activity->javaGameActivity);
android_app_set_motion_event_filter(_pstState, NULL);

/* Inits SwappyGL */
SwappyGL_init(pstEnv, _pstState->activity->javaGameActivity);
SwappyGL_setAutoSwapInterval(false);
SwappyGL_setAutoPipelineMode(false);
bSwappyInitialized = SwappyGL_init(pstEnv, _pstState->activity->javaGameActivity);
if(bSwappyInitialized)
{
SwappyGL_setAutoSwapInterval(false);
SwappyGL_setAutoPipelineMode(false);
}

/* Gets arguments from manifest */
orxAndroid_JNI_GetArguments();

/* Parses the arguments */
int argc = 0;
iArgumentCount = 0;

char *pc = strtok(sstAndroid.zArguments, " ");
while(pc && argc < orxANDROID_KU32_MAX_ARGUMENT_COUNT - 1)
pc = strtok(sstAndroid.zArguments, " ");
while(pc && iArgumentCount < orxANDROID_KU32_MAX_ARGUMENT_COUNT - 1)
{
argv[argc++] = pc;
azArgumentList[iArgumentCount++] = pc;
pc = strtok(0, " ");
}
argv[argc] = NULL;
azArgumentList[iArgumentCount] = NULL;

/* Runs the application code */
main(argc, argv);
main(iArgumentCount, azArgumentList);

if(_pstState->destroyRequested == 0)
{
Expand Down Expand Up @@ -831,8 +838,17 @@ void android_main(android_app *_pstState)
}
}

Paddleboat_destroy(pstEnv);
SwappyGL_destroy();
if(paddleboatError == PADDLEBOAT_NO_ERROR)
{
/* Destroys Paddleboat */
Paddleboat_destroy(pstEnv);
}

if(bSwappyInitialized)
{
/* Destroys SwappyGL */
SwappyGL_destroy();
}
}

/* APK orxRESOURCE */
Expand Down

0 comments on commit eb51cfc

Please sign in to comment.