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 
dpiFromPx(int size, DisplayMetrics metrics)39     public static float dpiFromPx(int size, DisplayMetrics metrics){
40         float densityRatio = (float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT;
41         return (size / densityRatio);
42     }
pxFromDp(float size, DisplayMetrics metrics)43     public static int pxFromDp(float size, DisplayMetrics metrics) {
44         return (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
45                 size, metrics));
46     }
pxFromSp(float size, DisplayMetrics metrics)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 
DynamicGrid(Context context, Resources resources, int minWidthPx, int minHeightPx, int widthPx, int heightPx, int awPx, int ahPx)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 
getDeviceProfile()96     public DeviceProfile getDeviceProfile() {
97         return mProfile;
98     }
99 
toString()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