1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.launcher3; 18 19 import android.content.Context; 20 import android.content.res.Resources; 21 import android.util.DisplayMetrics; 22 import android.util.TypedValue; 23 24 import java.util.ArrayList; 25 26 27 public class DynamicGrid { 28 @SuppressWarnings("unused") 29 private static final String TAG = "DynamicGrid"; 30 31 private DeviceProfile mProfile; 32 private float mMinWidth; 33 private float mMinHeight; 34 35 // This is a static that we use for the default icon size on a 4/5-inch phone 36 static float DEFAULT_ICON_SIZE_DP = 60; 37 static float DEFAULT_ICON_SIZE_PX = 0; 38 39 public static float dpiFromPx(int size, DisplayMetrics metrics){ 40 float densityRatio = (float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT; 41 return (size / densityRatio); 42 } 43 public static int pxFromDp(float size, DisplayMetrics metrics) { 44 return (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45 size, metrics)); 46 } 47 public static int pxFromSp(float size, DisplayMetrics metrics) { 48 return (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 49 size, metrics)); 50 } 51 52 public DynamicGrid(Context context, Resources resources, 53 int minWidthPx, int minHeightPx, 54 int widthPx, int heightPx, 55 int awPx, int ahPx) { 56 DisplayMetrics dm = resources.getDisplayMetrics(); 57 ArrayList<DeviceProfile> deviceProfiles = 58 new ArrayList<DeviceProfile>(); 59 boolean hasAA = !LauncherAppState.isDisableAllApps(); 60 DEFAULT_ICON_SIZE_PX = pxFromDp(DEFAULT_ICON_SIZE_DP, dm); 61 // Our phone profiles include the bar sizes in each orientation 62 deviceProfiles.add(new DeviceProfile("Super Short Stubby", 63 255, 300, 2, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4)); 64 deviceProfiles.add(new DeviceProfile("Shorter Stubby", 65 255, 400, 3, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4)); 66 deviceProfiles.add(new DeviceProfile("Short Stubby", 67 275, 420, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); 68 deviceProfiles.add(new DeviceProfile("Stubby", 69 255, 450, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); 70 deviceProfiles.add(new DeviceProfile("Nexus S", 71 296, 491.33f, 4, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); 72 deviceProfiles.add(new DeviceProfile("Nexus 4", 73 335, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4)); 74 deviceProfiles.add(new DeviceProfile("Nexus 5", 75 359, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4)); 76 deviceProfiles.add(new DeviceProfile("Large Phone", 77 406, 694, 5, 5, 64, 14.4f, 5, 56, R.xml.default_workspace_5x5)); 78 // The tablet profile is odd in that the landscape orientation 79 // also includes the nav bar on the side 80 deviceProfiles.add(new DeviceProfile("Nexus 7", 81 575, 904, 5, 6, 72, 14.4f, 7, 60, R.xml.default_workspace_5x6)); 82 // Larger tablet profiles always have system bars on the top & bottom 83 deviceProfiles.add(new DeviceProfile("Nexus 10", 84 727, 1207, 5, 6, 76, 14.4f, 7, 64, R.xml.default_workspace_5x6)); 85 deviceProfiles.add(new DeviceProfile("20-inch Tablet", 86 1527, 2527, 7, 7, 100, 20, 7, 72, R.xml.default_workspace_4x4)); 87 mMinWidth = dpiFromPx(minWidthPx, dm); 88 mMinHeight = dpiFromPx(minHeightPx, dm); 89 mProfile = new DeviceProfile(context, deviceProfiles, 90 mMinWidth, mMinHeight, 91 widthPx, heightPx, 92 awPx, ahPx, 93 resources); 94 } 95 96 public DeviceProfile getDeviceProfile() { 97 return mProfile; 98 } 99 100 public String toString() { 101 return "-------- DYNAMIC GRID ------- \n" + 102 "Wd: " + mProfile.minWidthDps + ", Hd: " + mProfile.minHeightDps + 103 ", W: " + mProfile.widthPx + ", H: " + mProfile.heightPx + 104 " [r: " + mProfile.numRows + ", c: " + mProfile.numColumns + 105 ", is: " + mProfile.iconSizePx + ", its: " + mProfile.iconTextSizePx + 106 ", cw: " + mProfile.cellWidthPx + ", ch: " + mProfile.cellHeightPx + 107 ", hc: " + mProfile.numHotseatIcons + ", his: " + mProfile.hotseatIconSizePx + "]"; 108 } 109 } 110