OSDN Git Service

Determine # of rows/columns based on screen size
authorMichael Jurka <mikejurka@google.com>
Tue, 5 Apr 2011 21:50:34 +0000 (14:50 -0700)
committerMichael Jurka <mikejurka@google.com>
Sat, 14 May 2011 00:55:08 +0000 (17:55 -0700)
Change-Id: I8b1266bd7a66d4a73d4a09570357688333e03d13

res/layout-large-land/workspace.xml [new file with mode: 0644]
res/layout-large-land/workspace_screen.xml
res/layout-large-port/workspace.xml [new file with mode: 0644]
res/layout-large-port/workspace_screen.xml
res/layout-large/launcher.xml
res/values-large-land/dimens.xml
res/values-large-port/dimens.xml
res/values-large/dimens.xml
src/com/android/launcher2/CellLayout.java
src/com/android/launcher2/Workspace.java

diff --git a/res/layout-large-land/workspace.xml b/res/layout-large-land/workspace.xml
new file mode 100644 (file)
index 0000000..e8ea782
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- The workspace contains 5 screens of cells -->
+<com.android.launcher2.Workspace
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
+    android:paddingTop="?android:attr/actionBarSize"
+    android:paddingBottom="10dp"
+    launcher:defaultScreen="2"
+    launcher:pageSpacing="@dimen/workspace_page_spacing_land">
+      <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
+</com.android.launcher2.Workspace>
\ No newline at end of file
index e983b79..25b05e9 100644 (file)
 
     launcher:cellWidth="@dimen/workspace_cell_width"
     launcher:cellHeight="@dimen/workspace_cell_height"
-    launcher:widthGap="@dimen/workspace_width_gap"
-    launcher:heightGap="@dimen/workspace_height_gap"
-    launcher:yAxisStartPadding="15dip"
-    launcher:yAxisEndPadding="15dip"
-    launcher:xAxisStartPadding="25dip"
-    launcher:xAxisEndPadding="25dip" />
+    launcher:widthGap="@dimen/workspace_width_gap_land"
+    launcher:heightGap="@dimen/workspace_height_gap_land"
+
+    launcher:xAxisStartPadding="@dimen/workspace_x_axis_start_padding_land"
+    launcher:xAxisEndPadding="@dimen/workspace_x_axis_end_padding_land"
+    launcher:yAxisStartPadding="@dimen/workspace_y_axis_start_padding_land"
+    launcher:yAxisEndPadding="@dimen/workspace_y_axis_end_padding_land" />
diff --git a/res/layout-large-port/workspace.xml b/res/layout-large-port/workspace.xml
new file mode 100644 (file)
index 0000000..ccd7d33
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- The workspace contains 5 screens of cells -->
+<com.android.launcher2.Workspace
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
+    android:paddingTop="?android:attr/actionBarSize"
+    android:paddingBottom="10dp"
+    launcher:defaultScreen="2"
+    launcher:pageSpacing="@dimen/workspace_page_spacing_port">
+      <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
+      <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
+</com.android.launcher2.Workspace>
\ No newline at end of file
index 406441d..e33c612 100644 (file)
 
     launcher:cellWidth="@dimen/workspace_cell_width"
     launcher:cellHeight="@dimen/workspace_cell_height"
-    launcher:widthGap="@dimen/workspace_width_gap"
-    launcher:heightGap="@dimen/workspace_height_gap"
-    launcher:yAxisStartPadding="25dip"
-    launcher:yAxisEndPadding="25dip"
-    launcher:xAxisStartPadding="15dip"
-    launcher:xAxisEndPadding="15dip"/>
+    launcher:widthGap="@dimen/workspace_width_gap_port"
+    launcher:heightGap="@dimen/workspace_height_gap_port"
+
+    launcher:xAxisStartPadding="@dimen/workspace_x_axis_start_padding_port"
+    launcher:xAxisEndPadding="@dimen/workspace_x_axis_end_padding_port"
+    launcher:yAxisStartPadding="@dimen/workspace_y_axis_start_padding_port"
+    launcher:yAxisEndPadding="@dimen/workspace_y_axis_end_padding_port" />
index 6c6fecf..6a16eb5 100644 (file)
     android:layout_height="match_parent"
     android:focusable="false">
 
-    <!-- The workspace contains 5 screens of cells -->
-    <com.android.launcher2.Workspace
+    <include layout="@layout/workspace"
         android:id="@+id/workspace"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingTop="?android:attr/actionBarSize"
-        android:paddingBottom="10dp"
-        launcher:defaultScreen="2"
-        launcher:cellCountX="8"
-        launcher:cellCountY="7"
-        launcher:pageSpacing="@dimen/workspace_page_spacing">
-
-        <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
-    </com.android.launcher2.Workspace>
+        android:layout_height="match_parent" />
 
     <include layout="@layout/button_bar"
         android:id="@+id/all_apps_button_cluster"
@@ -48,8 +34,7 @@
         android:layout_height="?android:attr/actionBarSize"
         android:layout_gravity="top" />
 
-    <include
-        layout="@layout/all_apps_tabbed"
+    <include layout="@layout/all_apps_tabbed"
         android:id="@+id/all_apps_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
index 8d25555..196cdb0 100644 (file)
          or right while you're dragging. -->
     <dimen name="scroll_zone">100dip</dimen>
 
-    <!-- Width/height gap overrides for the workspace -->
-    <dimen name="workspace_width_gap">32dp</dimen>
-    <dimen name="workspace_height_gap">2dp</dimen>
-
-    <dimen name="workspace_page_spacing">50dp</dimen>
-
     <dimen name="customization_drawer_height">480dp</dimen>
     <dimen name="customization_drawer_content_height">420dp</dimen>
 
index e696e34..47cac78 100644 (file)
          or right while you're dragging. -->
     <dimen name="scroll_zone">40dp</dimen>
 
-    <!-- Width/height gap overrides for the workspace -->
-    <dimen name="workspace_width_gap">0dp</dimen>
-    <dimen name="workspace_height_gap">32dp</dimen>
-
-    <dimen name="workspace_page_spacing">64dp</dimen>
-
     <dimen name="customization_drawer_height">800dp</dimen>
     <dimen name="customization_drawer_content_height">420dp</dimen>
 
index 11f85ab..2416109 100644 (file)
     <dimen name="workspace_cell_width">96dip</dimen>
     <dimen name="workspace_cell_height">96dip</dimen>
 
+    <dimen name="workspace_x_axis_start_padding_land">25dip</dimen>
+    <dimen name="workspace_x_axis_end_padding_land">25dip</dimen>
+    <dimen name="workspace_y_axis_start_padding_land">15dip</dimen>
+    <dimen name="workspace_y_axis_end_padding_land">15dip</dimen>
+    <dimen name="workspace_x_axis_start_padding_port">15dip</dimen>
+    <dimen name="workspace_x_axis_end_padding_port">15dip</dimen>
+    <dimen name="workspace_y_axis_start_padding_port">25dip</dimen>
+    <dimen name="workspace_y_axis_end_padding_port">25dip</dimen>
+
     <!-- Width/height gap overrides for the workspace -->
-    <dimen name="workspace_width_gap">0dp</dimen>
-    <dimen name="workspace_height_gap">0dp</dimen>
+    <dimen name="workspace_width_gap_land">32dp</dimen>
+    <dimen name="workspace_height_gap_land">2dp</dimen>
+    <dimen name="workspace_width_gap_port">0dp</dimen>
+    <dimen name="workspace_height_gap_port">32dp</dimen>
+
+    <dimen name="workspace_page_spacing_land">50dp</dimen>
+    <dimen name="workspace_page_spacing_port">64dp</dimen>
 
     <!-- The corner radius to draw the external drop icon rounded rect -->
     <dimen name="external_drop_icon_rect_radius">10dp</dimen>
@@ -45,6 +59,9 @@
     <dimen name="all_apps_button_drawable_padding">0dip</dimen>
     <dimen name="all_apps_button_vertical_padding">4dip</dimen>
 
+    <integer name="land_all_apps_view_cellCountX">7</integer>
+    <integer name="land_all_apps_view_cellCountY">5</integer>
+
     <dimen name="toolbar_button_vertical_padding">12dip</dimen>
     <dimen name="toolbar_button_horizontal_padding">16dip</dimen>
 
@@ -52,6 +69,9 @@
     <dimen name="delete_zone_vertical_drag_padding">20dip</dimen>
     <dimen name="delete_zone_horizontal_drag_padding">20dip</dimen>
 
+    <!-- roughly a status bar (for determining how many rows of icons are in home) -->
+    <dimen name="status_bar_height">48dip</dimen>
+
     <!-- dimensions for the wallpaper picker wallpaper thumbnail width -->
     <dimen name="wallpaper_chooser_grid_width">196dp</dimen>
     <dimen name="wallpaper_chooser_grid_height">140dp</dimen>
index 8efb6ce..fdef18d 100644 (file)
@@ -267,6 +267,60 @@ public class CellLayout extends ViewGroup {
         addView(mChildren);
     }
 
+    static int widthInPortrait(Resources r, int numCells) {
+        // We use this method from Workspace to figure out how many rows/columns Launcher should
+        // have. We ignore the left/right padding on CellLayout because it turns out in our design
+        // the padding extends outside the visible screen size, but it looked fine anyway.
+        // However, we make sure there's at least enough space for the crosshairs at either
+        // edge to be rendered (half the crosshair is sticking out on either side)
+        int cellWidth = r.getDimensionPixelSize(R.dimen.workspace_cell_width);
+        int widthGap = r.getDimensionPixelSize(R.dimen.workspace_width_gap_port);
+        int crosshairsSize = r.getDrawable(R.drawable.gardening_crosshairs).getIntrinsicWidth();
+
+        return  widthGap * (numCells - 1) + cellWidth * numCells + crosshairsSize;
+    }
+
+    static int widthInLandscape(Resources r, int numCells) {
+        // We use this method from Workspace to figure out how many rows/columns Launcher should
+        // have. We ignore the left/right padding on CellLayout because it turns out in our design
+        // the padding extends outside the visible screen size, but it looked fine anyway.
+        // However, we make sure there's at least enough space for the crosshairs at either
+        // edge to be rendered (half the crosshair is sticking out on either side)
+        int cellWidth = r.getDimensionPixelSize(R.dimen.workspace_cell_width);
+        int widthGap = r.getDimensionPixelSize(R.dimen.workspace_width_gap_land);
+        int crosshairsSize = r.getDrawable(R.drawable.gardening_crosshairs).getIntrinsicWidth();
+
+        return widthGap * (numCells - 1) + cellWidth * numCells + crosshairsSize;
+    }
+
+    static int heightInPortrait(Resources r, int numCells) {
+        // We use this method from Workspace to figure out how many rows/columns Launcher should
+        // have. We ignore the left/right padding on CellLayout because it turns out in our design
+        // the padding extends outside the visible screen size, but it looked fine anyway.
+        // However, we make sure there's at least enough space for the crosshairs at the bottom
+        // to be rendered (half the crosshair is sticking out); we don't worry about the top
+        // crosshair since it can bleed into the action bar space
+        int cellHeight = r.getDimensionPixelSize(R.dimen.workspace_cell_height);
+        int heightGap = r.getDimensionPixelSize(R.dimen.workspace_height_gap_port);
+        int crosshairsSize = r.getDrawable(R.drawable.gardening_crosshairs).getIntrinsicHeight();
+
+        return heightGap * (numCells - 1) + cellHeight * numCells + (crosshairsSize + 1) / 2;
+    }
+
+    static int heightInLandscape(Resources r, int numCells) {
+        // We use this method from Workspace to figure out how many rows/columns Launcher should
+        // have. We ignore the left/right padding on CellLayout because it turns out in our design
+        // the padding extends outside the visible screen size, but it looked fine anyway.
+        // However, we make sure there's at least enough space for the crosshairs at the bottom
+        // to be rendered (half the crosshair is sticking out); we don't worry about the top
+        // crosshair since it can bleed into the action bar space
+        int cellHeight = r.getDimensionPixelSize(R.dimen.workspace_cell_height);
+        int heightGap = r.getDimensionPixelSize(R.dimen.workspace_height_gap_land);
+        int crosshairsSize = r.getDrawable(R.drawable.gardening_crosshairs).getIntrinsicHeight();
+
+        return heightGap * (numCells - 1) + cellHeight * numCells + (crosshairsSize + 1) / 2;
+    }
+
     private void invalidateBubbleTextView(BubbleTextView icon) {
         final int padding = icon.getPressedOrFocusedBackgroundPadding();
         invalidate(icon.getLeft() + getLeftPadding() - padding,
index 1373996..70de0a4 100644 (file)
@@ -52,6 +52,7 @@ import android.graphics.drawable.Drawable;
 import android.os.IBinder;
 import android.os.Parcelable;
 import android.util.AttributeSet;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.Pair;
 import android.view.Display;
@@ -255,10 +256,54 @@ public class Workspace extends SmoothPagedView
 
         mWallpaperManager = WallpaperManager.getInstance(context);
 
+        int cellCountX = DEFAULT_CELL_COUNT_X;
+        int cellCountY = DEFAULT_CELL_COUNT_Y;
+
         TypedArray a = context.obtainStyledAttributes(attrs,
                 R.styleable.Workspace, defStyle, 0);
-        int cellCountX = a.getInt(R.styleable.Workspace_cellCountX, DEFAULT_CELL_COUNT_X);
-        int cellCountY = a.getInt(R.styleable.Workspace_cellCountY, DEFAULT_CELL_COUNT_Y);
+
+        if (LauncherApplication.isScreenLarge()) {
+            final Resources res = context.getResources();
+            final DisplayMetrics dm = res.getDisplayMetrics();
+            float widthDp = dm.widthPixels / dm.density;
+            float heightDp = dm.heightPixels / dm.density;
+
+            final float statusBarHeight = res.getDimension(R.dimen.status_bar_height);
+            TypedArray actionBarSizeTypedArray =
+                context.obtainStyledAttributes(new int[] { android.R.attr.actionBarSize });
+            float actionBarHeight = actionBarSizeTypedArray.getDimension(0, 0f);
+
+            if (heightDp > widthDp) {
+                float temp = widthDp;
+                widthDp = heightDp;
+                heightDp = temp;
+            }
+            int cellCountXLand = 1;
+            int cellCountXPort = 1;
+            while (2*mPageSpacing + CellLayout.widthInLandscape(res, cellCountXLand + 1) <= widthDp) {
+                cellCountXLand++;
+            }
+            while (CellLayout.widthInPortrait(res, cellCountXPort + 1) <= heightDp) {
+                cellCountXPort++;
+            }
+            cellCountX = Math.min(cellCountXLand, cellCountXPort);
+
+            int cellCountYLand = 1;
+            int cellCountYPort = 1;
+            while (statusBarHeight + actionBarHeight +
+                    CellLayout.heightInLandscape(res, cellCountYLand + 1) <= heightDp) {
+                cellCountYLand++;
+            }
+            while (statusBarHeight + actionBarHeight +
+                    CellLayout.heightInPortrait(res, cellCountYPort + 1) <= widthDp) {
+                cellCountYPort++;
+            }
+            cellCountY = Math.min(cellCountYLand, cellCountYPort);
+        }
+
+        // if the value is manually specified, use that instead
+        cellCountX = a.getInt(R.styleable.Workspace_cellCountX, cellCountX);
+        cellCountY = a.getInt(R.styleable.Workspace_cellCountY, cellCountY);
         mDefaultPage = a.getInt(R.styleable.Workspace_defaultScreen, 1);
         a.recycle();