fix window layout problem in ViewRoot
 * don't scale LayoutParams (this must be app's scale).
 * scale the layout params' coordinates & size only when requesting layout.
In SurfaceView, window's x,y wasn't scaled before sending to window manager.
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 40b03c8..3d023f7 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -326,8 +326,9 @@
                 mFormat = mRequestedFormat;
                 mType = mRequestedType;
 
-                mLayout.x = mLeft;
-                mLayout.y = mTop;
+                // Scaling window's layout here beause mLayout is not used elsewhere.
+                mLayout.x = (int) (mLeft * mAppScale);
+                mLayout.y = (int) (mTop * mAppScale);
                 mLayout.width = (int) (getWidth() * mAppScale);
                 mLayout.height = (int) (getHeight() * mAppScale);
                 mLayout.format = mRequestedFormat;
@@ -380,7 +381,7 @@
                         synchronized (mCallbacks) {
                             callbacks = new SurfaceHolder.Callback[mCallbacks.size()];
                             mCallbacks.toArray(callbacks);
-                        }            
+                        }
 
                         if (visibleChanged) {
                             mIsCreating = true;
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index 90453ba..5090c56 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -123,9 +123,10 @@
     int mHeight;
     Rect mDirty; // will be a graphics.Region soon
     boolean mIsAnimating;
-    // TODO: change these to scaler class.
-    float mAppScale;
-    float mAppScaleInverted; // = 1.0f / mAppScale
+    // TODO: change these to scalar class.
+    private float mAppScale;
+    private float mAppScaleInverted; // = 1.0f / mAppScale
+    private int[] mWindowLayoutParamsBackup = null;
 
     final View.AttachInfo mAttachInfo;
 
@@ -384,6 +385,9 @@
             if (mView == null) {
                 mView = view;
                 mAppScale = mView.getContext().getApplicationScale();
+                if (mAppScale != 1.0f) {
+                    mWindowLayoutParamsBackup = new int[4];
+                }
                 mAppScaleInverted = 1.0f / mAppScale;
                 mWindowAttributes.copyFrom(attrs);
                 mSoftInputMode = attrs.softInputMode;
@@ -473,7 +477,6 @@
         synchronized (this) {
             int oldSoftInputMode = mWindowAttributes.softInputMode;
             mWindowAttributes.copyFrom(attrs);
-            mWindowAttributes.scale(mAppScale);
 
             if (newView) {
                 mSoftInputMode = attrs.softInputMode;
@@ -2320,12 +2323,22 @@
 
     private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
             boolean insetsPending) throws RemoteException {
+
+        boolean restore = false;
+        if (params != null && mAppScale != 1.0f) {
+            restore = true;
+            params.scale(mAppScale, mWindowLayoutParamsBackup);
+        }
         int relayoutResult = sWindowSession.relayout(
                 mWindow, params,
                 (int) (mView.mMeasuredWidth * mAppScale),
                 (int) (mView.mMeasuredHeight * mAppScale),
                 viewVisibility, insetsPending, mWinFrame,
                 mPendingContentInsets, mPendingVisibleInsets, mSurface);
+        if (restore) {
+            params.restore(mWindowLayoutParamsBackup);
+        }
+
         mPendingContentInsets.scale(mAppScaleInverted);
         mPendingVisibleInsets.scale(mAppScaleInverted);
         mWinFrame.scale(mAppScaleInverted);
@@ -2427,7 +2440,7 @@
         msg.arg2 = handled ? 1 : 0;
         sendMessage(msg);
     }
-    
+
     public void dispatchResized(int w, int h, Rect coveredInsets,
             Rect visibleInsets, boolean reportDraw) {
         if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index f6a171d..c69c281 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -18,6 +18,7 @@
 
 import android.content.pm.ActivityInfo;
 import android.graphics.PixelFormat;
+import android.graphics.Rect;
 import android.os.IBinder;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -954,19 +955,42 @@
             return sb.toString();
         }
 
-        void scale(float scale) {
+        /**
+         * Scale the layout params' coordinates and size.
+         * Returns the original info as a backup so that the caller can
+         * restore the layout params;
+         */
+        void scale(float scale, int[] backup) {
             if (scale != 1.0f) {
+                backup[0] = x;
+                backup[1] = y;
                 x *= scale;
                 y *= scale;
                 if (width > 0) {
+                    backup[2] = width;
                     width *= scale;
                 }
                 if (height > 0) {
+                    backup[3] = height;
                     height *= scale;
                 }
             }
         }
 
+        /**
+         * Restore the layout params' coordinates and size.
+         */
+        void restore(int[] backup) {
+            x = backup[0];
+            y = backup[1];
+            if (width > 0) {
+                width = backup[2];
+            }
+            if (height > 0) {
+                height = backup[3];
+            }
+        }
+
         private CharSequence mTitle = "";
     }
 }