Add support for xdpi and ydpi in the device config for the GLE.

Change-Id: Ie905f9b586ac5f58e40e86232fbafeaacf6a0c51
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalEditorPart.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalEditorPart.java
index ef0db5a..f6fa0ea 100755
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalEditorPart.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalEditorPart.java
@@ -24,8 +24,6 @@
 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;

 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;

 import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;

-import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier;

-import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density;

 import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;

 import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFile;

 import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFolderType;

@@ -849,22 +847,14 @@
                             Rectangle rect = getBounds();

                             boolean isProjectTheme = mConfigComposite.isProjectTheme();

 

-                            // FIXME pass the density/dpi from somewhere (resource config or skin).

-                            // For now, get it from the config

-                            int density = Density.MEDIUM.getDpiValue();

-                            PixelDensityQualifier qual =

-                                mConfigComposite.getCurrentConfig().getPixelDensityQualifier();

-                            if (qual != null) {

-                                int d = qual.getValue().getDpiValue();

-                                if (d > 0) {

-                                    density = d;

-                                }

-                            }

+                            int density = mConfigComposite.getDensity().getDpiValue();

+                            float xdpi = mConfigComposite.getXDpi();

+                            float ydpi = mConfigComposite.getYDpi();

 

                             ILayoutResult result = computeLayout(bridge, parser,

                                     iProject /* projectKey */,

                                     rect.width, rect.height, !mConfigComposite.getClipping(),

-                                    density, density, density,

+                                    density, xdpi, ydpi,

                                     theme, isProjectTheme,

                                     configuredProjectRes, frameworkResources, mProjectCallback,

                                     mLogger);

diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalLayoutEditor.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalLayoutEditor.java
index f3fd97a..4f4ebb1 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalLayoutEditor.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/GraphicalLayoutEditor.java
@@ -31,8 +31,6 @@
 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
 import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
-import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier;
-import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density;
 import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
 import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFile;
 import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFolderType;
@@ -949,22 +947,14 @@
                             Rectangle rect = getBounds();
                             boolean isProjectTheme = mConfigComposite.isProjectTheme();
 
-                            // FIXME pass the density/dpi from somewhere (resource config or skin).
-                            // For now, get it from the config
-                            int density = Density.MEDIUM.getDpiValue();
-                            PixelDensityQualifier qual =
-                                mConfigComposite.getCurrentConfig().getPixelDensityQualifier();
-                            if (qual != null) {
-                                int d = qual.getValue().getDpiValue();
-                                if (d > 0) {
-                                    density = d;
-                                }
-                            }
+                            int density = mConfigComposite.getDensity().getDpiValue();
+                            float xdpi = mConfigComposite.getXDpi();
+                            float ydpi = mConfigComposite.getYDpi();
 
                             ILayoutResult result = computeLayout(bridge, parser,
                                     iProject /* projectKey */,
                                     rect.width, rect.height, !mConfigComposite.getClipping(),
-                                    density, density, density,
+                                    density, xdpi, ydpi,
                                     theme, isProjectTheme,
                                     configuredProjectRes, frameworkResources, mProjectCallback,
                                     mLogger);
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java
index 969050a..598b11d 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java
@@ -20,11 +20,13 @@
 import com.android.ide.eclipse.adt.internal.resources.ResourceType;
 import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
 import com.android.ide.eclipse.adt.internal.resources.configurations.LanguageQualifier;
+import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier;
 import com.android.ide.eclipse.adt.internal.resources.configurations.RegionQualifier;
 import com.android.ide.eclipse.adt.internal.resources.configurations.ResourceQualifier;
 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenDimensionQualifier;
 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier;
 import com.android.ide.eclipse.adt.internal.resources.configurations.VersionQualifier;
+import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density;
 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier.ScreenOrientation;
 import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
 import com.android.ide.eclipse.adt.internal.sdk.DeviceConfiguration;
@@ -84,6 +86,8 @@
 
     private boolean mClipping = true;
 
+    private DeviceConfiguration mCurrentDevice;
+
     /**
      * Interface implemented by the part which owns a {@link ConfigurationComposite}.
      * This notifies the owners when the configuration change.
@@ -227,15 +231,73 @@
         config.set(mCurrentConfig);
     }
 
+    /**
+     * Returns the currently selected {@link Density}. This is guaranteed to be non null.
+     */
+    public Density getDensity() {
+        if (mCurrentConfig != null) {
+            PixelDensityQualifier qual = mCurrentConfig.getPixelDensityQualifier();
+            if (qual != null) {
+                // just a sanity check
+                Density d = qual.getValue();
+                if (d != Density.NODPI) {
+                    return d;
+                }
+            }
+        }
+
+        // no config? return medium as the default density.
+        return Density.MEDIUM;
+    }
+
+    /**
+     * Returns the current device xdpi.
+     */
+    public float getXDpi() {
+        if (mCurrentDevice != null) {
+            float dpi = mCurrentDevice.getXDpi();
+            if (Float.isNaN(dpi) == false) {
+                return dpi;
+            }
+        }
+
+        // get the pixel density as the density.
+        return getDensity().getDpiValue();
+    }
+
+    /**
+     * Returns the current device ydpi.
+     */
+    public float getYDpi() {
+        if (mCurrentDevice != null) {
+            float dpi = mCurrentDevice.getYDpi();
+            if (Float.isNaN(dpi) == false) {
+                return dpi;
+            }
+        }
+
+        // get the pixel density as the density.
+        return getDensity().getDpiValue();
+    }
+
     public Rectangle getScreenBounds() {
         // get the orientation from the current device config
         ScreenOrientationQualifier qual = mCurrentConfig.getScreenOrientationQualifier();
-        ScreenOrientation orientation = qual.getValue();
+        ScreenOrientation orientation = ScreenOrientation.PORTRAIT;
+        if (qual != null) {
+            orientation = qual.getValue();
+        }
 
         // get the device screen dimension
         ScreenDimensionQualifier qual2 = mCurrentConfig.getScreenDimensionQualifier();
-        int s1 = qual2.getValue1();
-        int s2 = qual2.getValue2();
+        int s1, s2;
+        if (qual2 != null) {
+            s1 = qual2.getValue1();
+            s2 = qual2.getValue2();
+        } else {
+            s1 = 480;
+            s2 = 320;
+        }
 
         switch (orientation) {
             default:
@@ -512,33 +574,36 @@
     private void onDeviceChange(boolean recomputeLayout) {
 
         int deviceIndex = mDeviceList.getSelectionIndex();
-        DeviceConfiguration device = mDevices.get(deviceIndex);
+        if (deviceIndex != -1) {
+            mCurrentDevice = mDevices.get(deviceIndex);
+        } else {
+            mCurrentDevice = null;
+        }
 
         mDeviceConfigs.removeAll();
 
-        Set<String> configNames = device.getConfigs().keySet();
-        for (String name : configNames) {
-            mDeviceConfigs.add(name);
-        }
+        if (mCurrentDevice != null) {
+            Set<String> configNames = mCurrentDevice.getConfigs().keySet();
+            for (String name : configNames) {
+                mDeviceConfigs.add(name);
+            }
 
-        mDeviceConfigs.select(0);
-        if (configNames.size() == 1) {
-            mDeviceConfigs.setEnabled(false);
-        }
+            mDeviceConfigs.select(0);
+            if (configNames.size() == 1) {
+                mDeviceConfigs.setEnabled(false);
+            }
 
+        }
         if (recomputeLayout) {
             onDeviceConfigChange();
         }
     }
 
     private void onDeviceConfigChange() {
-        if (mDevices != null) {
-            int deviceIndex = mDeviceList.getSelectionIndex();
-            DeviceConfiguration device = mDevices.get(deviceIndex);
-
+        if (mCurrentDevice != null) {
             int configIndex = mDeviceConfigs.getSelectionIndex();
             String name = mDeviceConfigs.getItem(configIndex);
-            FolderConfiguration config = device.getConfigs().get(name);
+            FolderConfiguration config = mCurrentDevice.getConfigs().get(name);
 
             // get the current qualifiers from the current config
             LanguageQualifier lang = mCurrentConfig.getLanguageQualifier();
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/DeviceConfiguration.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/DeviceConfiguration.java
index f483de8..eb1ddc2 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/DeviceConfiguration.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/DeviceConfiguration.java
@@ -25,8 +25,11 @@
 public class DeviceConfiguration {
 
     private final String mName;
+
     private Map<String, FolderConfiguration> mMap =
         new HashMap<String, FolderConfiguration>();
+    private float mXDpi = Float.NaN;
+    private float mYDpi = Float.NaN;
 
     DeviceConfiguration(String name) {
         mName = name;
@@ -40,6 +43,14 @@
         mMap = Collections.unmodifiableMap(mMap);
     }
 
+    void setXDpi(float xdpi) {
+        mXDpi = xdpi;
+    }
+
+    void setYDpi(float ydpi) {
+        mYDpi = ydpi;
+    }
+
     public String getName() {
         return mName;
     }
@@ -47,4 +58,20 @@
     public Map<String, FolderConfiguration> getConfigs() {
         return mMap;
     }
+
+    /**
+     * Returns the dpi of the Device screen in X.
+     * @return the dpi of screen or {@link Float#NaN} if it's not set.
+     */
+    public float getXDpi() {
+        return mXDpi;
+    }
+
+    /**
+     * Returns the dpi of the Device screen in Y.
+     * @return the dpi of screen or {@link Float#NaN} if it's not set.
+     */
+    public float getYDpi() {
+        return mYDpi;
+    }
  }
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
index 4003d88..960636e 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
@@ -670,6 +670,8 @@
      */
     private void createDefaultLayoutDevices() {
         DeviceConfiguration adp1 = new DeviceConfiguration("ADP1");
+        adp1.setXDpi(180.6f);
+        adp1.setYDpi(182.f);
         mLayoutDevices.add(adp1);
         // default config
         FolderConfiguration defConfig = new FolderConfiguration();
@@ -700,6 +702,8 @@
         adp1.addConfig("Landscape, opened", opened);
 
         DeviceConfiguration ion = new DeviceConfiguration("Ion");
+        ion.setXDpi(180.6f);
+        ion.setYDpi(182.f);
         mLayoutDevices.add(ion);
         // default config
         defConfig = new FolderConfiguration();