From 9e5d1c9ab6214867b7da3a567ba2118655b8a5ea Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Tue, 7 Feb 2012 17:06:47 -0800 Subject: [PATCH] Bug 724215 - Avoid crashing for when adding touch points early. r=dougt --- mobile/android/base/GeckoEvent.java | 76 ++++++++++++++++------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/mobile/android/base/GeckoEvent.java b/mobile/android/base/GeckoEvent.java index b5170ea173c..9643da4181d 100644 --- a/mobile/android/base/GeckoEvent.java +++ b/mobile/android/base/GeckoEvent.java @@ -192,44 +192,50 @@ public class GeckoEvent { } public void addMotionPoint(int index, int eventIndex, MotionEvent event) { - PointF geckoPoint = new PointF(event.getX(eventIndex), event.getY(eventIndex)); - geckoPoint = GeckoApp.mAppContext.getLayerController().convertViewPointToLayerPoint(geckoPoint); - - mPoints[index] = new Point(Math.round(geckoPoint.x), Math.round(geckoPoint.y)); - mPointIndicies[index] = event.getPointerId(eventIndex); - // getToolMajor, getToolMinor and getOrientation are API Level 9 features - if (Build.VERSION.SDK_INT >= 9) { - double radians = event.getOrientation(eventIndex); - mOrientations[index] = (float) Math.toDegrees(radians); - // w3c touchevents spec does not allow orientations == 90 - // this shifts it to -90, which will be shifted to zero below - if (mOrientations[index] == 90) - mOrientations[index] = -90; - - // w3c touchevent radius are given by an orientation between 0 and 90 - // the radius is found by removing the orientation and measuring the x and y - // radius of the resulting ellipse - // for android orientations >= 0 and < 90, the major axis should correspond to - // just reporting the y radius as the major one, and x as minor - // however, for a radius < 0, we have to shift the orientation by adding 90, and - // reverse which radius is major and minor - if (mOrientations[index] < 0) { - mOrientations[index] += 90; - mPointRadii[index] = new Point((int)event.getToolMajor(eventIndex)/2, - (int)event.getToolMinor(eventIndex)/2); + try { + PointF geckoPoint = new PointF(event.getX(eventIndex), event.getY(eventIndex)); + geckoPoint = GeckoApp.mAppContext.getLayerController().convertViewPointToLayerPoint(geckoPoint); + + mPoints[index] = new Point(Math.round(geckoPoint.x), Math.round(geckoPoint.y)); + mPointIndicies[index] = event.getPointerId(eventIndex); + // getToolMajor, getToolMinor and getOrientation are API Level 9 features + if (Build.VERSION.SDK_INT >= 9) { + double radians = event.getOrientation(eventIndex); + mOrientations[index] = (float) Math.toDegrees(radians); + // w3c touchevents spec does not allow orientations == 90 + // this shifts it to -90, which will be shifted to zero below + if (mOrientations[index] == 90) + mOrientations[index] = -90; + + // w3c touchevent radius are given by an orientation between 0 and 90 + // the radius is found by removing the orientation and measuring the x and y + // radius of the resulting ellipse + // for android orientations >= 0 and < 90, the major axis should correspond to + // just reporting the y radius as the major one, and x as minor + // however, for a radius < 0, we have to shift the orientation by adding 90, and + // reverse which radius is major and minor + if (mOrientations[index] < 0) { + mOrientations[index] += 90; + mPointRadii[index] = new Point((int)event.getToolMajor(eventIndex)/2, + (int)event.getToolMinor(eventIndex)/2); + } else { + mPointRadii[index] = new Point((int)event.getToolMinor(eventIndex)/2, + (int)event.getToolMajor(eventIndex)/2); + } } else { - mPointRadii[index] = new Point((int)event.getToolMinor(eventIndex)/2, - (int)event.getToolMajor(eventIndex)/2); + float size = event.getSize(eventIndex); + DisplayMetrics displaymetrics = new DisplayMetrics(); + GeckoApp.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); + size = size*Math.min(displaymetrics.heightPixels, displaymetrics.widthPixels); + mPointRadii[index] = new Point((int)size,(int)size); + mOrientations[index] = 0; } - } else { - float size = event.getSize(eventIndex); - DisplayMetrics displaymetrics = new DisplayMetrics(); - GeckoApp.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); - size = size*Math.min(displaymetrics.heightPixels, displaymetrics.widthPixels); - mPointRadii[index] = new Point((int)size,(int)size); - mOrientations[index] = 0; + mPressures[index] = event.getPressure(eventIndex); + } catch(Exception ex) { + Log.e(LOGTAG, "Error creating motion point " + index, ex); + mPointRadii[index] = new Point(0, 0); + mPoints[index] = new Point(0, 0); } - mPressures[index] = event.getPressure(eventIndex); } public GeckoEvent(SensorEvent s) {