mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-13 15:59:23 +01:00
Android: Only use getActionIndex for ACTION_POINTER_DOWN/ACTION_POINTER_UP
According to the documentation, getActionIndex should only be used with ACTION_POINTER_DOWN and ACTION_POINTER_UP. We've had a few crashes reported in the Play Console regarding invalid pointer indices for getY, and I'm hoping this will help with that.
This commit is contained in:
parent
905e86d754
commit
2e1f89025f
@ -198,14 +198,17 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
|
|||||||
return onTouchWhileEditing(event);
|
return onTouchWhileEditing(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
int pointerIndex = event.getActionIndex();
|
int action = event.getActionMasked();
|
||||||
|
boolean firstPointer = action != MotionEvent.ACTION_POINTER_DOWN &&
|
||||||
|
action != MotionEvent.ACTION_POINTER_UP;
|
||||||
|
int pointerIndex = firstPointer ? 0 : event.getActionIndex();
|
||||||
// Tracks if any button/joystick is pressed down
|
// Tracks if any button/joystick is pressed down
|
||||||
boolean pressed = false;
|
boolean pressed = false;
|
||||||
|
|
||||||
for (InputOverlayDrawableButton button : overlayButtons)
|
for (InputOverlayDrawableButton button : overlayButtons)
|
||||||
{
|
{
|
||||||
// Determine the button state to apply based on the MotionEvent action flag.
|
// Determine the button state to apply based on the MotionEvent action flag.
|
||||||
switch (event.getAction() & MotionEvent.ACTION_MASK)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
case MotionEvent.ACTION_POINTER_DOWN:
|
case MotionEvent.ACTION_POINTER_DOWN:
|
||||||
|
@ -71,22 +71,19 @@ public final class InputOverlayDrawableButton
|
|||||||
|
|
||||||
public void onConfigureTouch(MotionEvent event)
|
public void onConfigureTouch(MotionEvent event)
|
||||||
{
|
{
|
||||||
int pointerIndex = event.getActionIndex();
|
|
||||||
int fingerPositionX = (int) event.getX(pointerIndex);
|
|
||||||
int fingerPositionY = (int) event.getY(pointerIndex);
|
|
||||||
switch (event.getAction())
|
switch (event.getAction())
|
||||||
{
|
{
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
mPreviousTouchX = fingerPositionX;
|
mPreviousTouchX = (int) event.getX();
|
||||||
mPreviousTouchY = fingerPositionY;
|
mPreviousTouchY = (int) event.getY();
|
||||||
break;
|
break;
|
||||||
case MotionEvent.ACTION_MOVE:
|
case MotionEvent.ACTION_MOVE:
|
||||||
mControlPositionX += fingerPositionX - mPreviousTouchX;
|
mControlPositionX += (int) event.getX() - mPreviousTouchX;
|
||||||
mControlPositionY += fingerPositionY - mPreviousTouchY;
|
mControlPositionY += (int) event.getY() - mPreviousTouchY;
|
||||||
setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX,
|
setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX,
|
||||||
getHeight() + mControlPositionY);
|
getHeight() + mControlPositionY);
|
||||||
mPreviousTouchX = fingerPositionX;
|
mPreviousTouchX = (int) event.getX();
|
||||||
mPreviousTouchY = fingerPositionY;
|
mPreviousTouchY = (int) event.getY();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,22 +149,19 @@ public final class InputOverlayDrawableDpad
|
|||||||
|
|
||||||
public void onConfigureTouch(MotionEvent event)
|
public void onConfigureTouch(MotionEvent event)
|
||||||
{
|
{
|
||||||
int pointerIndex = event.getActionIndex();
|
|
||||||
int fingerPositionX = (int) event.getX(pointerIndex);
|
|
||||||
int fingerPositionY = (int) event.getY(pointerIndex);
|
|
||||||
switch (event.getAction())
|
switch (event.getAction())
|
||||||
{
|
{
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
mPreviousTouchX = fingerPositionX;
|
mPreviousTouchX = (int) event.getX();
|
||||||
mPreviousTouchY = fingerPositionY;
|
mPreviousTouchY = (int) event.getY();
|
||||||
break;
|
break;
|
||||||
case MotionEvent.ACTION_MOVE:
|
case MotionEvent.ACTION_MOVE:
|
||||||
mControlPositionX += fingerPositionX - mPreviousTouchX;
|
mControlPositionX += (int) event.getX() - mPreviousTouchX;
|
||||||
mControlPositionY += fingerPositionY - mPreviousTouchY;
|
mControlPositionY += (int) event.getY() - mPreviousTouchY;
|
||||||
setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX,
|
setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX,
|
||||||
getHeight() + mControlPositionY);
|
getHeight() + mControlPositionY);
|
||||||
mPreviousTouchX = fingerPositionX;
|
mPreviousTouchX = (int) event.getX();
|
||||||
mPreviousTouchY = fingerPositionY;
|
mPreviousTouchY = (int) event.getY();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,10 +95,13 @@ public final class InputOverlayDrawableJoystick
|
|||||||
public boolean TrackEvent(MotionEvent event)
|
public boolean TrackEvent(MotionEvent event)
|
||||||
{
|
{
|
||||||
boolean reCenter = BooleanSetting.MAIN_JOYSTICK_REL_CENTER.getBooleanGlobal();
|
boolean reCenter = BooleanSetting.MAIN_JOYSTICK_REL_CENTER.getBooleanGlobal();
|
||||||
int pointerIndex = event.getActionIndex();
|
int action = event.getActionMasked();
|
||||||
|
boolean firstPointer = action != MotionEvent.ACTION_POINTER_DOWN &&
|
||||||
|
action != MotionEvent.ACTION_POINTER_UP;
|
||||||
|
int pointerIndex = firstPointer ? 0 : event.getActionIndex();
|
||||||
boolean pressed = false;
|
boolean pressed = false;
|
||||||
|
|
||||||
switch (event.getAction() & MotionEvent.ACTION_MASK)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
case MotionEvent.ACTION_POINTER_DOWN:
|
case MotionEvent.ACTION_POINTER_DOWN:
|
||||||
@ -163,18 +166,15 @@ public final class InputOverlayDrawableJoystick
|
|||||||
|
|
||||||
public void onConfigureTouch(MotionEvent event)
|
public void onConfigureTouch(MotionEvent event)
|
||||||
{
|
{
|
||||||
int pointerIndex = event.getActionIndex();
|
|
||||||
int fingerPositionX = (int) event.getX(pointerIndex);
|
|
||||||
int fingerPositionY = (int) event.getY(pointerIndex);
|
|
||||||
switch (event.getAction())
|
switch (event.getAction())
|
||||||
{
|
{
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
mPreviousTouchX = fingerPositionX;
|
mPreviousTouchX = (int) event.getX();
|
||||||
mPreviousTouchY = fingerPositionY;
|
mPreviousTouchY = (int) event.getY();
|
||||||
break;
|
break;
|
||||||
case MotionEvent.ACTION_MOVE:
|
case MotionEvent.ACTION_MOVE:
|
||||||
int deltaX = fingerPositionX - mPreviousTouchX;
|
int deltaX = (int) event.getX() - mPreviousTouchX;
|
||||||
int deltaY = fingerPositionY - mPreviousTouchY;
|
int deltaY = (int) event.getY() - mPreviousTouchY;
|
||||||
mControlPositionX += deltaX;
|
mControlPositionX += deltaX;
|
||||||
mControlPositionY += deltaY;
|
mControlPositionY += deltaY;
|
||||||
setBounds(new Rect(mControlPositionX, mControlPositionY,
|
setBounds(new Rect(mControlPositionX, mControlPositionY,
|
||||||
@ -187,8 +187,8 @@ public final class InputOverlayDrawableJoystick
|
|||||||
setOrigBounds(new Rect(new Rect(mControlPositionX, mControlPositionY,
|
setOrigBounds(new Rect(new Rect(mControlPositionX, mControlPositionY,
|
||||||
mOuterBitmap.getIntrinsicWidth() + mControlPositionX,
|
mOuterBitmap.getIntrinsicWidth() + mControlPositionX,
|
||||||
mOuterBitmap.getIntrinsicHeight() + mControlPositionY)));
|
mOuterBitmap.getIntrinsicHeight() + mControlPositionY)));
|
||||||
mPreviousTouchX = fingerPositionX;
|
mPreviousTouchX = (int) event.getX();
|
||||||
mPreviousTouchY = fingerPositionY;
|
mPreviousTouchY = (int) event.getY();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,9 +82,12 @@ public class InputOverlayPointer
|
|||||||
|
|
||||||
public void onTouch(MotionEvent event)
|
public void onTouch(MotionEvent event)
|
||||||
{
|
{
|
||||||
int pointerIndex = event.getActionIndex();
|
int action = event.getActionMasked();
|
||||||
|
boolean firstPointer = action != MotionEvent.ACTION_POINTER_DOWN &&
|
||||||
|
action != MotionEvent.ACTION_POINTER_UP;
|
||||||
|
int pointerIndex = firstPointer ? 0 : event.getActionIndex();
|
||||||
|
|
||||||
switch (event.getAction() & MotionEvent.ACTION_MASK)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
case MotionEvent.ACTION_POINTER_DOWN:
|
case MotionEvent.ACTION_POINTER_DOWN:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user