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