* Revert the change that I introduced while refactroing in SurfaceView#dispatchTouchEvent
* Don't scale back the event if the canvas is used in SurfaceView.
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 95bba97..c73d29e 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -140,7 +140,14 @@
     int mType = -1;
     final Rect mSurfaceFrame = new Rect();
     private Translator mTranslator;
-
+    
+    // A flag to indicate that the Canvas has to be scaled
+    private boolean mScaleCanvas = false;
+    // A flag to indicate that the Canvas is in use and being scaled.
+    // This may remain to be false even if mScaleCanvas is true if the applicatio
+    // does not use the canvas (such as GLSurfaceView, VideoView).
+    private boolean mCanvasScaled = false;
+    
     public SurfaceView(Context context) {
         super(context);
         setWillNotDraw(true);
@@ -254,18 +261,21 @@
 
     @Override
     public boolean dispatchTouchEvent(MotionEvent event) {
-        // SurfaceView uses pre-scaled size unless fixed size is requested. This hook
-        // scales the event back to the pre-scaled coordinates for such surface.
-        if (mScaled) {
+        if (mTranslator == null || mCanvasScaled) {
+            // Use the event as is if no scaling is required, or the surface's canvas
+            // is scaled too.
+            return super.dispatchTouchEvent(event);
+        } else {
+            // The surface is in native size, so we need to scale the event
+            // back to native location.
             MotionEvent scaledBack = MotionEvent.obtain(event);
-            mTranslator.translateEventInScreenToAppWindow(event);
+            // scale back to original
+            scaledBack.scale(mTranslator.applicationScale);
             try {
                 return super.dispatchTouchEvent(scaledBack);
             } finally {
                 scaledBack.recycle();
             }
-        } else {
-            return super.dispatchTouchEvent(event);
         }
     }
 
@@ -291,8 +301,6 @@
         mWindowType = type;
     }
 
-    boolean mScaled = false;
-    
     private void updateWindow(boolean force) {
         if (!mHaveFrame) {
             return;
@@ -301,7 +309,7 @@
         mTranslator = viewRoot.mTranslator;
 
         float appScale = mTranslator == null ? 1.0f : mTranslator.applicationScale;
-        
+
         Resources res = getContext().getResources();
         if (mTranslator != null || !res.getCompatibilityInfo().supportsScreen()) {
             mSurface.setCompatibleDisplayMetrics(res.getDisplayMetrics());
@@ -312,14 +320,15 @@
         int myHeight = mRequestedHeight;
         if (myHeight <= 0) myHeight = getHeight();
 
-        // Use original size if the app specified the size of the view,
-        // and let the flinger to scale up.
+        // Use requested size if the app specified the size of the view
+        // and let the flinger to scale up. Otherwise, use the native size
+        // (* appScale) and assume the application can handle it.
         if (mRequestedWidth <= 0 && mTranslator != null) {
             myWidth = (int) (myWidth * appScale + 0.5f);
             myHeight = (int) (myHeight * appScale + 0.5f);
-            mScaled = true;
+            mScaleCanvas = true;
         } else {
-            mScaled = false;
+            mScaleCanvas = false;
         }
 
         getLocationInWindow(mLocation);
@@ -641,7 +650,9 @@
             if (localLOGV) Log.i(TAG, "Returned canvas: " + c);
             if (c != null) {
                 mLastLockTime = SystemClock.uptimeMillis();
-                if (mScaled) {
+                if (mScaleCanvas) {
+                    // When the canvas is scaled, don't scale back the event's location.
+                    mCanvasScaled = true;
                     mSaveCount = c.save();
                     mTranslator.translateCanvas(c);
                 }
@@ -667,7 +678,7 @@
         }
 
         public void unlockCanvasAndPost(Canvas canvas) {
-            if (mScaled) {
+            if (mCanvasScaled) {
                 canvas.restoreToCount(mSaveCount);
             }
             mSurface.unlockCanvasAndPost(canvas);