Fix crash if MotionEvent.getDevice() will return NULL in joystick backend. Add a checks to InitGL, just in case

This commit is contained in:
a1batross 2016-12-07 00:25:09 +03:00
parent de21d49463
commit dd1607f261

View file

@ -625,7 +625,8 @@ View.OnKeyListener {
public void onDraw(Canvas canvas) {} public void onDraw(Canvas canvas) {}
// first, initialize native backend // first, initialize native backend
public Surface getNativeSurface() { public Surface getNativeSurface()
{
return getHolder().getSurface(); return getHolder().getSurface();
} }
@ -635,12 +636,29 @@ View.OnKeyListener {
{ {
EGL10 egl = (EGL10)EGLContext.getEGL(); EGL10 egl = (EGL10)EGLContext.getEGL();
if( egl == null )
{
Log.e( TAG, "Cannot get EGL from context" );
return false;
}
EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] version = new int[2]; if( dpy == null )
egl.eglInitialize(dpy, version); {
Log.e( TAG, "Cannot get display" );
return false;
}
int[][] configSpec = {{ int[] version = new int[2];
if( !egl.eglInitialize(dpy, version) )
{
Log.e(TAG, "No EGL config available");
return false;
}
int[][] configSpec =
{{
EGL10.EGL_DEPTH_SIZE, 8, EGL10.EGL_DEPTH_SIZE, 8,
EGL10.EGL_RED_SIZE, 8, EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8, EGL10.EGL_GREEN_SIZE, 8,
@ -724,9 +742,12 @@ View.OnKeyListener {
mEGL = egl; mEGL = egl;
mEGLConfig = config; mEGLConfig = config;
} catch(Exception e) { }
catch(Exception e)
{
Log.v(TAG, e + ""); Log.v(TAG, e + "");
for (StackTraceElement s : e.getStackTrace()) { for (StackTraceElement s : e.getStackTrace())
{
Log.v(TAG, s.toString()); Log.v(TAG, s.toString());
} }
} }
@ -1035,8 +1056,13 @@ class JoystickHandler_v12 extends JoystickHandler
} }
public boolean handleAxis( MotionEvent event ) public boolean handleAxis( MotionEvent event )
{ {
// how event can be from null device, Android?
final InputDevice device = event.getDevice();
if( device == null )
return;
// maybe I need to cache this... // maybe I need to cache this...
for( InputDevice.MotionRange range: event.getDevice().getMotionRanges() ) for( InputDevice.MotionRange range: device.getMotionRanges() )
{ {
// normalize in -1.0..1.0 (copied from SDL2) // normalize in -1.0..1.0 (copied from SDL2)
final float cur = ( event.getAxisValue( range.getAxis(), event.getActionIndex() ) - range.getMin() ) / range.getRange() * 2.0f - 1.0f; final float cur = ( event.getAxisValue( range.getAxis(), event.getActionIndex() ) - range.getMin() ) / range.getRange() * 2.0f - 1.0f;
@ -1045,20 +1071,36 @@ class JoystickHandler_v12 extends JoystickHandler
{ {
// typical axes // typical axes
// move // move
case MotionEvent.AXIS_X: prevSide = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_SIDE, prevSide, dead); break; case MotionEvent.AXIS_X:
case MotionEvent.AXIS_Y: prevFwd = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_FWD, prevFwd, dead); break; prevSide = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_SIDE, prevSide, dead);
break;
case MotionEvent.AXIS_Y:
prevFwd = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_FWD, prevFwd, dead);
break;
// rotate. Invert, so by default this works as it's should // rotate. Invert, so by default this works as it's should
case MotionEvent.AXIS_Z: prevPtch = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_PITCH, prevPtch, dead); break; case MotionEvent.AXIS_Z:
case MotionEvent.AXIS_RZ: prevYaw = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_YAW, prevYaw, dead); break; prevPtch = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_PITCH, prevPtch, dead);
break;
case MotionEvent.AXIS_RZ:
prevYaw = XashActivity.performEngineAxisEvent(-cur, XashActivity.JOY_AXIS_YAW, prevYaw, dead);
break;
// trigger // trigger
case MotionEvent.AXIS_RTRIGGER: prevLT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_RT, prevLT, dead); break; case MotionEvent.AXIS_RTRIGGER:
case MotionEvent.AXIS_LTRIGGER: prevRT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_LT, prevRT, dead); break; prevLT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_RT, prevLT, dead);
break;
case MotionEvent.AXIS_LTRIGGER:
prevRT = XashActivity.performEngineAxisEvent(cur, XashActivity.JOY_AXIS_LT, prevRT, dead);
break;
// hats // hats
case MotionEvent.AXIS_HAT_X: prevHX = XashActivity.performEngineHatEvent(cur, true, prevHX); break; case MotionEvent.AXIS_HAT_X:
case MotionEvent.AXIS_HAT_Y: prevHY = XashActivity.performEngineHatEvent(cur, false, prevHY); break; prevHX = XashActivity.performEngineHatEvent(cur, true, prevHX);
break;
case MotionEvent.AXIS_HAT_Y:
prevHY = XashActivity.performEngineHatEvent(cur, false, prevHY);
break;
} }
} }