DisplayMetrics.java revision 11ea33471e1a14a8594f0b2cd012d86340dd3bd8
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.util; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.content.res.CompatibilityInfo; 209189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.content.res.Configuration; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.*; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A structure describing general information about a display, such as its 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size, density, and font scaling. 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DisplayMetrics { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for low-density screens. 31a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 32a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_LOW = 120; 33a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 34a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 35a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for medium-density screens. 36a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 37a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_MEDIUM = 160; 38a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 39a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 40a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for high-density screens. 41a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 42a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_HIGH = 240; 43a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 44a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The reference density used throughout the system. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 47a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_DEFAULT = DENSITY_MEDIUM; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 492e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima /** 502e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima * The device's density. 51a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * @hide becase eventually this should be able to change while 52a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * running, so shouldn't be a constant. 532e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima */ 54a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_DEVICE = getDeviceDensity(); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The absolute width of the display in pixels. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int widthPixels; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The absolute height of the display in pixels. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int heightPixels; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The logical density of the display. This is a scaling factor for the 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Density Independent Pixel unit, where one DIP is one pixel on an 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * providing the baseline of the system's display. Thus on a 160dpi screen 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this density value will be 1; on a 106 dpi screen it would be .75; etc. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This value does not exactly follow the real screen size (as given by 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall UI in steps based on gross changes in the display dpi. For 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * example, a 240x320 screen will have a density of 1 even if its width is 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1.8", 1.3", etc. However, if the screen resolution is increased to 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 320x480 but the screen size remained 1.5"x2" then the density would be 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * increased (probably to 1.5). 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 79a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * @see #DENSITY_DEFAULT 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float density; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * The screen density expressed as dots-per-inch. May be either 8411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link #DENSITY_LOW}, {@link #DENSITY_MEDIUM}, or {@link #DENSITY_HIGH}. 8511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn */ 8611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public int densityDpi; 8711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A scaling factor for fonts displayed on the display. This is the same 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as {@link #density}, except that it may be adjusted in smaller 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * increments at runtime based on a user preference for the font size. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float scaledDensity; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The exact physical pixels per inch of the screen in the X dimension. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float xdpi; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The exact physical pixels per inch of the screen in the Y dimension. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float ydpi; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DisplayMetrics() { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTo(DisplayMetrics o) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthPixels = o.widthPixels; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project heightPixels = o.heightPixels; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project density = o.density; 10911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = o.densityDpi; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaledDensity = o.scaledDensity; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xdpi = o.xdpi; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ydpi = o.ydpi; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setToDefaults() { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthPixels = 0; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project heightPixels = 0; 118a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn density = DENSITY_DEVICE / (float) DENSITY_DEFAULT; 11911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = DENSITY_DEVICE; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaledDensity = density; 121a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn xdpi = DENSITY_DEVICE; 122a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn ydpi = DENSITY_DEVICE; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12458feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima 12558feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima /** 126e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima * Update the display metrics based on the compatibility info and orientation 127723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn * NOTE: DO NOT EXPOSE THIS API! It is introducing a circular dependency 128723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn * with the higher-level android.res package. 1299189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * {@hide} 13058feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima */ 131723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn public void updateMetrics(CompatibilityInfo compatibilityInfo, int orientation, 132723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int screenLayout) { 133c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn boolean expandable = compatibilityInfo.isConfiguredExpandable(); 134c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn boolean largeScreens = compatibilityInfo.isConfiguredLargeScreens(); 135c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 136c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // Note: this assume that configuration is updated before calling 137c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // updateMetrics method. 138c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (!expandable) { 139c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if ((screenLayout&Configuration.SCREENLAYOUT_COMPAT_NEEDED) == 0) { 140c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn expandable = true; 141c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // the current screen size is compatible with non-resizing apps. 142c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn compatibilityInfo.setExpandable(true); 143c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else { 14464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima compatibilityInfo.setExpandable(false); 145c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 146c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 147c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (!largeScreens) { 148c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if ((screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK) 149c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn != Configuration.SCREENLAYOUT_SIZE_LARGE) { 150c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn largeScreens = true; 151c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // the current screen size is not large. 152c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn compatibilityInfo.setLargeScreens(true); 153c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else { 154c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn compatibilityInfo.setLargeScreens(false); 155c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 156c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 157c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 158c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (!expandable || !largeScreens) { 159c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // This is a larger screen device and the app is not 160c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // compatible with large screens, so diddle it. 161c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 162c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // Figure out the compatibility width and height of the screen. 163c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int defaultWidth; 164c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int defaultHeight; 165c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn switch (orientation) { 166c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_LANDSCAPE: { 167c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultWidth = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_HEIGHT * density + 168c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 169c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultHeight = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_WIDTH * density + 170c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 171c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn break; 172723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 173c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_PORTRAIT: 174c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_SQUARE: 175c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn default: { 176c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultWidth = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_WIDTH * density + 177c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 178c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultHeight = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_HEIGHT * density + 179c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 180c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn break; 181e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima } 182c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_UNDEFINED: { 183c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // don't change 184c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return; 185e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima } 186c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 187c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 188c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (defaultWidth < widthPixels) { 189c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // content/window's x offset in original pixels 190c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn widthPixels = defaultWidth; 191c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 192c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (defaultHeight < heightPixels) { 193c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn heightPixels = defaultHeight; 1949189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 1959189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 19611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 19764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (compatibilityInfo.isScalingRequired()) { 19864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima float invertedRatio = compatibilityInfo.applicationInvertedScale; 19964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima density *= invertedRatio; 20011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = (int)((density*DisplayMetrics.DENSITY_DEFAULT)+.5f); 20164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima scaledDensity *= invertedRatio; 20264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima xdpi *= invertedRatio; 20364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima ydpi *= invertedRatio; 20461324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima widthPixels = (int) (widthPixels * invertedRatio + 0.5f); 20561324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima heightPixels = (int) (heightPixels * invertedRatio + 0.5f); 20664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 20758feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima } 20858feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima 20964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima @Override 21058feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima public String toString() { 21158feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima return "DisplayMetrics{density=" + density + ", width=" + widthPixels + 21258feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima ", height=" + heightPixels + ", scaledDensity=" + scaledDensity + 21358feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima ", xdpi=" + xdpi + ", ydpi=" + ydpi + "}"; 21458feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima } 2152a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner 2162a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner private static int getDeviceDensity() { 2172a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // qemu.sf.lcd_density can be used to override ro.sf.lcd_density 2182a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // when running in the emulator, allowing for dynamic configurations. 2192a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // The reason for this is that ro.sf.lcd_density is write-once and is 2202a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // set by the init process when it parses build.prop before anything else. 2212a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner return SystemProperties.getInt("qemu.sf.lcd_density", 222a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT)); 2232a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 225