am 7e3e04c: Merge change 1408 into donut

Merge commit '7e3e04c144182c6807c66646b3f988beaba1720e'

* commit '7e3e04c144182c6807c66646b3f988beaba1720e':
  * update all metrics data when updating density.
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 2fc476e..5cb9fe2 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -191,16 +191,11 @@
                 usePreloaded = false;
                 DisplayMetrics newMetrics = new DisplayMetrics();
                 newMetrics.setTo(metrics);
-                float invertedScale = 1.0f / applicationScale;
-                newMetrics.density *= invertedScale;
-                newMetrics.xdpi *= invertedScale;
-                newMetrics.ydpi *= invertedScale;
-                newMetrics.widthPixels *= invertedScale;
-                newMetrics.heightPixels *= invertedScale;
+                float newDensity = metrics.density / applicationScale;
+                newMetrics.updateDensity(newDensity);
                 metrics = newMetrics;
             }
-            //Log.i(TAG, "Resource:" + appDir + ", density " + newMetrics.density + ", orig density:" +
-            //      metrics.density);
+            //Log.i(TAG, "Resource:" + appDir + ", display metrics=" + metrics);
             r = new Resources(assets, metrics, getConfiguration(), usePreloaded);
             //Log.i(TAG, "Created app resources " + r + ": " + r.getConfiguration());
             // XXX need to remove entries when weak references go away
@@ -3502,8 +3497,11 @@
                     Resources r = v.get();
                     if (r != null) {
                         // keep the original density based on application cale.
-                        appDm.density = r.getDisplayMetrics().density;
+                        appDm.updateDensity(r.getDisplayMetrics().density);
+                        Log.i("oshima", "Updated app display metrics " + appDm);
                         r.updateConfiguration(config, appDm);
+                        // reset
+                        appDm.setTo(dm);
                         //Log.i(TAG, "Updated app resources " + v.getKey()
                         //        + " " + r + ": " + r.getConfiguration());
                     } else {
diff --git a/core/java/android/inputmethodservice/Keyboard.java b/core/java/android/inputmethodservice/Keyboard.java
index 6a560ce..fea63be 100755
--- a/core/java/android/inputmethodservice/Keyboard.java
+++ b/core/java/android/inputmethodservice/Keyboard.java
@@ -27,8 +27,7 @@
 import android.util.Log;
 import android.util.TypedValue;
 import android.util.Xml;
-import android.view.Display;
-import android.view.WindowManager;
+import android.util.DisplayMetrics;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -510,10 +509,11 @@
      * @param modeId keyboard mode identifier
      */
     public Keyboard(Context context, int xmlLayoutResId, int modeId) {
-        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
-        final Display display = wm.getDefaultDisplay();
-        mDisplayWidth = display.getWidth();
-        mDisplayHeight = display.getHeight();
+        DisplayMetrics dm = context.getResources().getDisplayMetrics();
+        mDisplayWidth = dm.widthPixels;
+        mDisplayHeight = dm.heightPixels;
+        //Log.v(TAG, "keyboard's display metrics:" + dm);
+
         mDefaultHorizontalGap = 0;
         mDefaultWidth = mDisplayWidth / 10;
         mDefaultVerticalGap = 0;
diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java
index 095f4f4..e4dd020 100644
--- a/core/java/android/util/DisplayMetrics.java
+++ b/core/java/android/util/DisplayMetrics.java
@@ -99,4 +99,24 @@
         xdpi = DEVICE_DENSITY;
         ydpi = DEVICE_DENSITY;
     }
+
+    /**
+     * Set the display metrics' density and update parameters depend on it.
+     * @hide
+     */
+    public void updateDensity(float newDensity) {
+        float ratio = newDensity / density;
+        density = newDensity;
+        scaledDensity = density;
+        widthPixels *= ratio;
+        heightPixels *= ratio;
+        xdpi *= ratio;
+        ydpi *= ratio;
+    }
+
+    public String toString() {
+        return "DisplayMetrics{density=" + density + ", width=" + widthPixels +
+            ", height=" + heightPixels + ", scaledDensity=" + scaledDensity +
+            ", xdpi=" + xdpi + ", ydpi=" + ydpi + "}";
+    }
 }