15f8afe6280eae34620067696173e71943e1a30a3Winson Chung/* 25f8afe6280eae34620067696173e71943e1a30a3Winson Chung * Copyright (C) 2008 The Android Open Source Project 35f8afe6280eae34620067696173e71943e1a30a3Winson Chung * 45f8afe6280eae34620067696173e71943e1a30a3Winson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 55f8afe6280eae34620067696173e71943e1a30a3Winson Chung * you may not use this file except in compliance with the License. 65f8afe6280eae34620067696173e71943e1a30a3Winson Chung * You may obtain a copy of the License at 75f8afe6280eae34620067696173e71943e1a30a3Winson Chung * 85f8afe6280eae34620067696173e71943e1a30a3Winson Chung * http://www.apache.org/licenses/LICENSE-2.0 95f8afe6280eae34620067696173e71943e1a30a3Winson Chung * 105f8afe6280eae34620067696173e71943e1a30a3Winson Chung * Unless required by applicable law or agreed to in writing, software 115f8afe6280eae34620067696173e71943e1a30a3Winson Chung * distributed under the License is distributed on an "AS IS" BASIS, 125f8afe6280eae34620067696173e71943e1a30a3Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f8afe6280eae34620067696173e71943e1a30a3Winson Chung * See the License for the specific language governing permissions and 145f8afe6280eae34620067696173e71943e1a30a3Winson Chung * limitations under the License. 155f8afe6280eae34620067696173e71943e1a30a3Winson Chung */ 165f8afe6280eae34620067696173e71943e1a30a3Winson Chung 175f8afe6280eae34620067696173e71943e1a30a3Winson Chungpackage com.android.launcher3; 185f8afe6280eae34620067696173e71943e1a30a3Winson Chung 19f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chungimport android.content.Context; 205f8afe6280eae34620067696173e71943e1a30a3Winson Chungimport android.content.res.Resources; 215f8afe6280eae34620067696173e71943e1a30a3Winson Chungimport android.util.DisplayMetrics; 225f8afe6280eae34620067696173e71943e1a30a3Winson Chungimport android.util.TypedValue; 235f8afe6280eae34620067696173e71943e1a30a3Winson Chung 245f8afe6280eae34620067696173e71943e1a30a3Winson Chungimport java.util.ArrayList; 255f8afe6280eae34620067696173e71943e1a30a3Winson Chung 265f8afe6280eae34620067696173e71943e1a30a3Winson Chung 275f8afe6280eae34620067696173e71943e1a30a3Winson Chungpublic class DynamicGrid { 285f8afe6280eae34620067696173e71943e1a30a3Winson Chung @SuppressWarnings("unused") 295f8afe6280eae34620067696173e71943e1a30a3Winson Chung private static final String TAG = "DynamicGrid"; 305f8afe6280eae34620067696173e71943e1a30a3Winson Chung 315f8afe6280eae34620067696173e71943e1a30a3Winson Chung private DeviceProfile mProfile; 325f8afe6280eae34620067696173e71943e1a30a3Winson Chung private float mMinWidth; 335f8afe6280eae34620067696173e71943e1a30a3Winson Chung private float mMinHeight; 345f8afe6280eae34620067696173e71943e1a30a3Winson Chung 3567ca7e4cc5ebeffefc3d8a71fb378fa1402a96e1Winson Chung // This is a static that we use for the default icon size on a 4/5-inch phone 3667ca7e4cc5ebeffefc3d8a71fb378fa1402a96e1Winson Chung static float DEFAULT_ICON_SIZE_DP = 60; 3767ca7e4cc5ebeffefc3d8a71fb378fa1402a96e1Winson Chung static float DEFAULT_ICON_SIZE_PX = 0; 3867ca7e4cc5ebeffefc3d8a71fb378fa1402a96e1Winson Chung 39892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung public static float dpiFromPx(int size, DisplayMetrics metrics){ 405f8afe6280eae34620067696173e71943e1a30a3Winson Chung float densityRatio = (float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT; 41892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung return (size / densityRatio); 42892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung } 43892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung public static int pxFromDp(float size, DisplayMetrics metrics) { 44892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung return (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung size, metrics)); 46892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung } 47892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung public static int pxFromSp(float size, DisplayMetrics metrics) { 48892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung return (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 49892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung size, metrics)); 505f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 515f8afe6280eae34620067696173e71943e1a30a3Winson Chung 52f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung public DynamicGrid(Context context, Resources resources, 53f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung int minWidthPx, int minHeightPx, 54892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung int widthPx, int heightPx, 55892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung int awPx, int ahPx) { 565f8afe6280eae34620067696173e71943e1a30a3Winson Chung DisplayMetrics dm = resources.getDisplayMetrics(); 575f8afe6280eae34620067696173e71943e1a30a3Winson Chung ArrayList<DeviceProfile> deviceProfiles = 585f8afe6280eae34620067696173e71943e1a30a3Winson Chung new ArrayList<DeviceProfile>(); 5916f3ea870aac47292cd6cbe1a4b4343173097aa9Nilesh Agrawal boolean hasAA = !LauncherAppState.isDisableAllApps(); 6067ca7e4cc5ebeffefc3d8a71fb378fa1402a96e1Winson Chung DEFAULT_ICON_SIZE_PX = pxFromDp(DEFAULT_ICON_SIZE_DP, dm); 615f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Our phone profiles include the bar sizes in each orientation 625f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Super Short Stubby", 63cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 255, 300, 2, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4)); 645f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Shorter Stubby", 65cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 255, 400, 3, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4)); 665f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Short Stubby", 67cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 275, 420, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); 685f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Stubby", 69cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 255, 450, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); 705f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Nexus S", 71cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 296, 491.33f, 4, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); 725f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Nexus 4", 73cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 335, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4)); 743abfd16e5d8f4af36fbe7e8c429cdd1227af1a50Winson Chung deviceProfiles.add(new DeviceProfile("Nexus 5", 75cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 359, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4)); 766d110117bee23d7fb25b08442614b3e0b4c47a75Winson Chung deviceProfiles.add(new DeviceProfile("Large Phone", 77cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 406, 694, 5, 5, 64, 14.4f, 5, 56, R.xml.default_workspace_5x5)); 785f8afe6280eae34620067696173e71943e1a30a3Winson Chung // The tablet profile is odd in that the landscape orientation 795f8afe6280eae34620067696173e71943e1a30a3Winson Chung // also includes the nav bar on the side 805f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Nexus 7", 81cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 575, 904, 5, 6, 72, 14.4f, 7, 60, R.xml.default_workspace_5x6)); 825f8afe6280eae34620067696173e71943e1a30a3Winson Chung // Larger tablet profiles always have system bars on the top & bottom 835f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("Nexus 10", 84cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 727, 1207, 5, 6, 76, 14.4f, 7, 64, R.xml.default_workspace_5x6)); 855f8afe6280eae34620067696173e71943e1a30a3Winson Chung deviceProfiles.add(new DeviceProfile("20-inch Tablet", 86cee8c66f9a688705f7880f2bffc9d2f95803eb81Adam Cohen 1527, 2527, 7, 7, 100, 20, 7, 72, R.xml.default_workspace_4x4)); 875f8afe6280eae34620067696173e71943e1a30a3Winson Chung mMinWidth = dpiFromPx(minWidthPx, dm); 885f8afe6280eae34620067696173e71943e1a30a3Winson Chung mMinHeight = dpiFromPx(minHeightPx, dm); 89f7d458543e64307b01de803d2ddfee2f21b0bd28Winson Chung mProfile = new DeviceProfile(context, deviceProfiles, 90892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung mMinWidth, mMinHeight, 915f8afe6280eae34620067696173e71943e1a30a3Winson Chung widthPx, heightPx, 92892c74d460ad98c6306420e1127c9aa3e505ba25Winson Chung awPx, ahPx, 935f8afe6280eae34620067696173e71943e1a30a3Winson Chung resources); 945f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 955f8afe6280eae34620067696173e71943e1a30a3Winson Chung 96b38002419dcb456b51f5d320b224737f16a07088Winson Chung public DeviceProfile getDeviceProfile() { 975f8afe6280eae34620067696173e71943e1a30a3Winson Chung return mProfile; 985f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 995f8afe6280eae34620067696173e71943e1a30a3Winson Chung 1005f8afe6280eae34620067696173e71943e1a30a3Winson Chung public String toString() { 1015f8afe6280eae34620067696173e71943e1a30a3Winson Chung return "-------- DYNAMIC GRID ------- \n" + 1025f8afe6280eae34620067696173e71943e1a30a3Winson Chung "Wd: " + mProfile.minWidthDps + ", Hd: " + mProfile.minHeightDps + 1035f8afe6280eae34620067696173e71943e1a30a3Winson Chung ", W: " + mProfile.widthPx + ", H: " + mProfile.heightPx + 1045f8afe6280eae34620067696173e71943e1a30a3Winson Chung " [r: " + mProfile.numRows + ", c: " + mProfile.numColumns + 1056e1c0d34bb31cacc24c57c89ab01deaa8985814fWinson Chung ", is: " + mProfile.iconSizePx + ", its: " + mProfile.iconTextSizePx + 1065f8afe6280eae34620067696173e71943e1a30a3Winson Chung ", cw: " + mProfile.cellWidthPx + ", ch: " + mProfile.cellHeightPx + 1075f8afe6280eae34620067696173e71943e1a30a3Winson Chung ", hc: " + mProfile.numHotseatIcons + ", his: " + mProfile.hotseatIconSizePx + "]"; 1085f8afe6280eae34620067696173e71943e1a30a3Winson Chung } 1095f8afe6280eae34620067696173e71943e1a30a3Winson Chung} 110