Return adjusted display for WindowManager.getDefaultDisplay()
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 8de938d..a9aa1ee 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -34,6 +34,7 @@
 import android.util.SparseArray;
 import android.util.TypedValue;
 import android.util.LongSparseArray;
+import android.view.Display;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -87,6 +88,7 @@
     PluralRules mPluralRule;
     
     private final CompatibilityInfo mCompatibilityInfo;
+    private Display mDefaultDisplay;
 
     private static final LongSparseArray<Object> EMPTY_ARRAY = new LongSparseArray<Object>() {
         @Override
@@ -1915,6 +1917,24 @@
                 + Integer.toHexString(id));
     }
 
+    /**
+     * Returns the display adjusted for the Resources' metrics.
+     * @hide
+     */
+    public Display getDefaultDisplay(Display defaultDisplay) {
+        if (mDefaultDisplay == null) {
+            if (!mCompatibilityInfo.isScalingRequired() && mCompatibilityInfo.supportsScreen()) {
+                // the app supports the display. just use the default one.
+                mDefaultDisplay = defaultDisplay;
+            } else {
+                // display needs adjustment.
+                mDefaultDisplay = Display.createMetricsBasedDisplay(
+                        defaultDisplay.getDisplayId(), mMetrics);
+            }
+        }
+        return mDefaultDisplay;
+    }
+
     private TypedArray getCachedStyledAttributes(int len) {
         synchronized (mTmpValue) {
             TypedArray attrs = mCachedStyledAttributes;
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 09ebeed5..5551f64 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -117,5 +117,32 @@
     
     private static final Object mStaticInit = new Object();
     private static boolean mInitialized = false;
+
+    /**
+     * Returns a display object which uses the metric's width/height instead.
+     * @hide
+     */
+    public static Display createMetricsBasedDisplay(int displayId, DisplayMetrics metrics) {
+        return new CompatibleDisplay(displayId, metrics);
+    }
+
+    private static class CompatibleDisplay extends Display {
+        private final DisplayMetrics mMetrics;
+
+        private CompatibleDisplay(int displayId, DisplayMetrics metrics) {
+            super(displayId);
+            mMetrics = metrics;
+        }
+
+        @Override
+        public int getWidth() {
+            return mMetrics.widthPixels;
+        }
+
+        @Override
+        public int getHeight() {
+            return mMetrics.heightPixels;
+        }
+    }
 }
 
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index d7457a0..576c8c1 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -358,6 +358,8 @@
     private class LocalWindowManager implements WindowManager {
         LocalWindowManager(WindowManager wm) {
             mWindowManager = wm;
+            mDefaultDisplay = mContext.getResources().getDefaultDisplay(
+                    mWindowManager.getDefaultDisplay());
         }
 
         public final void addView(View view, ViewGroup.LayoutParams params) {
@@ -420,10 +422,12 @@
         }
 
         public Display getDefaultDisplay() {
-            return mWindowManager.getDefaultDisplay();
+            return mDefaultDisplay;
         }
         
-        WindowManager mWindowManager;
+        private final WindowManager mWindowManager;
+
+        private final Display mDefaultDisplay;
     }
 
     /**