Home | History | Annotate | Download | only in launcher3
      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