Initial Changes for Dynamic Grid

Change-Id: I9e6f1e5167791cf8dc140778dfa447f86424e9bf
This commit is contained in:
Winson Chung 2013-08-12 16:19:28 -07:00
parent 8a6870101c
commit 5f8afe6280
66 changed files with 847 additions and 1355 deletions

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 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.
-->
<com.android.launcher3.BubbleTextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/WorkspaceIcon.Landscape"
android:focusable="true"
android:background="@drawable/focusable_view_bg" />

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 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.
-->
<com.android.launcher3.FolderIcon
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:focusable="true"
android:background="@drawable/focusable_view_bg">
<ImageView
android:id="@+id/preview_background"
android:layout_gravity="center_horizontal"
android:layout_width="@dimen/folder_preview_size"
android:layout_height="@dimen/folder_preview_size"
android:src="@drawable/portal_ring_inner_holo"/>
<com.android.launcher3.BubbleTextView
android:id="@+id/folder_icon_name"
style="@style/WorkspaceIcon.Landscape.Folder"/>
</com.android.launcher3.FolderIcon>

View File

@ -1,36 +0,0 @@
<?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.
-->
<com.android.launcher3.Hotseat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
launcher:cellCountX="1"
launcher:cellCountY="@integer/hotseat_cell_count">
<com.android.launcher3.CellLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingTop="@dimen/button_bar_width_left_padding"
android:paddingBottom="@dimen/button_bar_width_right_padding"
android:paddingStart="@dimen/button_bar_height_top_padding"
android:paddingEnd="@dimen/button_bar_height_bottom_padding"
launcher:cellWidth="@dimen/hotseat_cell_width"
launcher:cellHeight="@dimen/hotseat_cell_height"
launcher:widthGap="@dimen/hotseat_width_gap"
launcher:heightGap="@dimen/hotseat_height_gap"
launcher:maxGap="@dimen/workspace_max_gap" />
</com.android.launcher3.Hotseat>

View File

@ -36,28 +36,13 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:paddingStart="@dimen/workspace_left_padding"
android:paddingEnd="@dimen/workspace_right_padding"
android:paddingTop="@dimen/workspace_top_padding"
android:paddingBottom="@dimen/workspace_bottom_padding"
launcher:defaultScreen="@integer/config_workspaceDefaultScreen"
launcher:cellCountX="@integer/cell_count_x"
launcher:cellCountY="@integer/cell_count_y"
launcher:pageSpacing="@dimen/workspace_page_spacing"
launcher:scrollIndicatorPaddingLeft="@dimen/qsb_bar_height"
launcher:scrollIndicatorPaddingRight="@dimen/button_bar_height" />
<include
android:id="@+id/qsb_divider"
layout="@layout/workspace_divider"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/qsb_bar_height"
android:layout_gravity="start" />
launcher:pageIndicator="@id/page_indicator" />
<include layout="@layout/hotseat"
android:id="@+id/hotseat"
android:layout_width="@dimen/button_bar_height_plus_padding"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end" />
@ -84,16 +69,18 @@
android:layout_height="match_parent"
android:visibility="gone" />
<!-- TODO: Fix
<com.android.launcher3.DrawableStateProxyView
android:id="@+id/voice_button_proxy"
android:layout_width="@dimen/qsb_bar_height"
android:layout_height="@dimen/app_icon_size"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_gravity="top|start"
android:layout_marginTop="64dp"
android:clickable="true"
android:onClick="onClickVoiceButton"
android:importantForAccessibility="no"
launcher:sourceViewId="@+id/voice_button" />
-->
<include layout="@layout/apps_customize_pane"
android:id="@+id/apps_customize_pane"

View File

@ -15,7 +15,7 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/qsb_bar_height"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- Global search icon -->

View File

@ -1,36 +0,0 @@
<?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.
-->
<com.android.launcher3.Hotseat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
launcher:cellCountX="@integer/hotseat_cell_count"
launcher:cellCountY="1">
<com.android.launcher3.CellLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:paddingTop="@dimen/button_bar_height_top_padding"
android:paddingBottom="@dimen/button_bar_height_bottom_padding"
android:paddingStart="@dimen/button_bar_width_left_padding"
android:paddingEnd="@dimen/button_bar_width_right_padding"
launcher:cellWidth="@dimen/hotseat_cell_width"
launcher:cellHeight="@dimen/hotseat_cell_height"
launcher:widthGap="@dimen/hotseat_width_gap"
launcher:heightGap="@dimen/hotseat_height_gap"
launcher:maxGap="@dimen/workspace_max_gap" />
</com.android.launcher3.Hotseat>

View File

@ -35,25 +35,15 @@
android:id="@+id/workspace"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:paddingStart="@dimen/workspace_left_padding"
android:paddingEnd="@dimen/workspace_right_padding"
android:paddingTop="@dimen/workspace_top_padding"
android:paddingBottom="@dimen/workspace_bottom_padding"
launcher:defaultScreen="@integer/config_workspaceDefaultScreen"
launcher:cellCountX="@integer/cell_count_x"
launcher:cellCountY="@integer/cell_count_y"
launcher:pageSpacing="@dimen/workspace_page_spacing"
launcher:pageIndicator="@id/page_indicator"
launcher:scrollIndicatorPaddingLeft="@dimen/workspace_divider_padding_left"
launcher:scrollIndicatorPaddingRight="@dimen/workspace_divider_padding_right">
launcher:pageIndicator="@id/page_indicator">
</com.android.launcher3.Workspace>
<include layout="@layout/hotseat"
android:id="@+id/hotseat"
android:layout_width="match_parent"
android:layout_height="@dimen/button_bar_height_plus_padding"
android:layout_gravity="bottom" />
android:layout_height="match_parent" />
<include layout="@layout/overview_panel"
android:id="@+id/overview_panel"
@ -66,8 +56,7 @@
layout="@layout/page_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="@dimen/button_bar_height_plus_padding" />
android:layout_gravity="center_horizontal" />
<include
android:id="@+id/qsb_bar"
@ -90,8 +79,8 @@
<com.android.launcher3.DrawableStateProxyView
android:id="@+id/voice_button_proxy"
android:layout_width="80dp"
android:layout_height="@dimen/qsb_bar_height"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_gravity="top|end"
android:clickable="true"
android:onClick="onClickVoiceButton"

View File

@ -17,9 +17,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
style="@style/SearchDropTargetBar"
android:layout_width="match_parent"
android:layout_height="@dimen/search_bar_height"
android:layout_gravity="bottom|center_horizontal"
android:background="@drawable/search_frame">
<!-- Global search icon -->
<com.android.launcher3.HolographicLinearLayout
@ -29,8 +26,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toStartOf="@+id/voice_button_container"
android:paddingStart="8dp"
android:onClick="onClickSearchButton"
@ -41,7 +38,8 @@
android:id="@+id/search_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="fitStart"
android:layout_gravity="start"
android:scaleType="fitCenter"
android:src="@drawable/ic_home_search_normal_holo"
android:adjustViewBounds="true" />
</com.android.launcher3.HolographicLinearLayout>
@ -51,22 +49,22 @@
style="@style/SearchButton"
launcher:sourceImageViewId="@+id/voice_button"
android:id="@+id/voice_button_container"
android:layout_width="@dimen/search_bar_height"
android:layout_width="@dimen/app_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:paddingEnd="8dp"
android:gravity="end"
android:onClick="onClickVoiceButton"
android:focusable="true"
android:clickable="true"
android:contentDescription="@string/accessibility_voice_search_button">
<ImageView
android:id="@+id/voice_button"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitEnd"
android:layout_gravity="end"
android:scaleType="fitCenter"
android:src="@drawable/ic_home_voice_search_holo"
android:adjustViewBounds="true" />
</com.android.launcher3.HolographicLinearLayout>

View File

@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 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.
-->
<!-- Full screen view projects under the status bar and contains the background -->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
android:id="@+id/launcher"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/workspace_bg">
<com.android.launcher3.DragLayer
android:id="@+id/drag_layer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<include
android:id="@+id/page_indicator"
layout="@layout/page_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal" />
<!-- The workspace contains 5 screens of cells -->
<com.android.launcher3.Workspace
android:id="@+id/workspace"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:paddingStart="@dimen/workspace_left_padding"
android:paddingEnd="@dimen/workspace_right_padding"
android:paddingTop="@dimen/workspace_top_padding"
android:paddingBottom="@dimen/workspace_bottom_padding"
launcher:defaultScreen="@integer/config_workspaceDefaultScreen"
launcher:cellCountX="@integer/cell_count_x"
launcher:cellCountY="@integer/cell_count_y"
launcher:pageSpacing="@dimen/workspace_page_spacing"
launcher:pageIndicator="@id/page_indicator"
launcher:scrollIndicatorPaddingLeft="@dimen/qsb_bar_height"
launcher:scrollIndicatorPaddingRight="@dimen/button_bar_height" />
<include
android:id="@+id/qsb_divider"
layout="@layout/workspace_divider"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/qsb_bar_height"
android:layout_gravity="start" />
<include layout="@layout/hotseat"
android:id="@+id/hotseat"
android:layout_width="@dimen/button_bar_height_plus_padding"
android:layout_height="match_parent"
android:layout_gravity="end" />
<include
android:id="@+id/qsb_bar"
layout="@layout/qsb_bar" />
<!-- The Workspace cling must appear under the AppsCustomizePagedView below to ensure
that it is still visible during the transition to AllApps and doesn't overlay on
top of that view. -->
<include layout="@layout/workspace_cling"
android:id="@+id/workspace_cling"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<include layout="@layout/folder_cling"
android:id="@+id/folder_cling"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<com.android.launcher3.DrawableStateProxyView
android:id="@+id/voice_button_proxy"
android:layout_width="@dimen/qsb_bar_height"
android:layout_height="@dimen/app_icon_size"
android:layout_gravity="top|start"
android:layout_marginTop="64dp"
android:clickable="true"
android:onClick="onClickVoiceButton"
android:importantForAccessibility="no"
launcher:sourceViewId="@+id/voice_button" />
<include layout="@layout/apps_customize_pane"
android:id="@+id/apps_customize_pane"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible" />
</com.android.launcher3.DragLayer>
</FrameLayout>

View File

@ -1,36 +0,0 @@
<?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.
-->
<com.android.launcher3.Hotseat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
launcher:cellCountX="@integer/hotseat_cell_count"
launcher:cellCountY="1">
<com.android.launcher3.CellLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:paddingTop="@dimen/button_bar_height_top_padding"
android:paddingBottom="@dimen/button_bar_height_bottom_padding"
android:paddingStart="@dimen/button_bar_width_left_padding"
android:paddingEnd="@dimen/button_bar_width_right_padding"
launcher:cellWidth="@dimen/hotseat_cell_width"
launcher:cellHeight="@dimen/hotseat_cell_height"
launcher:widthGap="@dimen/hotseat_width_gap"
launcher:heightGap="@dimen/hotseat_height_gap"
launcher:maxGap="@dimen/hotseat_width_gap" />
</com.android.launcher3.Hotseat>

View File

@ -35,25 +35,15 @@
android:id="@+id/workspace"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/workspace_left_padding"
android:paddingEnd="@dimen/workspace_right_padding"
android:paddingTop="@dimen/workspace_top_padding"
android:paddingBottom="@dimen/workspace_bottom_padding"
android:layout_gravity="center"
launcher:defaultScreen="@integer/config_workspaceDefaultScreen"
launcher:cellCountX="@integer/cell_count_x"
launcher:cellCountY="@integer/cell_count_y"
launcher:pageSpacing="@dimen/workspace_page_spacing"
launcher:pageIndicator="@id/page_indicator"
launcher:scrollIndicatorPaddingLeft="@dimen/workspace_divider_padding_left"
launcher:scrollIndicatorPaddingRight="@dimen/workspace_divider_padding_right">
launcher:pageIndicator="@id/page_indicator">
</com.android.launcher3.Workspace>
<include layout="@layout/hotseat"
android:id="@+id/hotseat"
android:layout_width="match_parent"
android:layout_height="@dimen/button_bar_height_plus_padding"
android:layout_gravity="bottom" />
android:layout_height="match_parent" />
<include
android:id="@+id/qsb_bar"
@ -70,8 +60,7 @@
layout="@layout/page_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="@dimen/button_bar_height_plus_padding" />
android:layout_gravity="center_horizontal" />
<!-- The Workspace cling must appear under the AppsCustomizePagedView below to ensure
that it is still visible during the transition to AllApps and doesn't overlay on
@ -90,9 +79,8 @@
<com.android.launcher3.DrawableStateProxyView
android:id="@+id/voice_button_proxy"
android:layout_width="80dp"
android:layout_height="@dimen/qsb_bar_height"
android:layout_marginEnd="@dimen/qsb_voice_proxy_padding_right"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_gravity="top|end"
android:clickable="true"
android:onClick="onClickVoiceButton"

View File

@ -17,9 +17,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
style="@style/SearchDropTargetBar"
android:layout_width="match_parent"
android:layout_height="@dimen/search_bar_height"
android:layout_gravity="bottom|center_horizontal"
android:background="@drawable/search_frame">
<!-- Global search icon -->
<com.android.launcher3.HolographicLinearLayout
@ -29,8 +26,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toStartOf="@+id/voice_button_container"
android:paddingStart="8dp"
android:onClick="onClickSearchButton"
@ -41,6 +38,8 @@
android:id="@+id/search_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:scaleType="fitCenter"
android:src="@drawable/ic_home_search_normal_holo"
android:adjustViewBounds="true" />
</com.android.launcher3.HolographicLinearLayout>
@ -50,21 +49,22 @@
style="@style/SearchButton"
launcher:sourceImageViewId="@+id/voice_button"
android:id="@+id/voice_button_container"
android:layout_width="@dimen/search_bar_height"
android:layout_width="@dimen/app_icon_size"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:paddingEnd="8dp"
android:gravity="end"
android:onClick="onClickVoiceButton"
android:focusable="true"
android:clickable="true"
android:contentDescription="@string/accessibility_voice_search_button">
<ImageView
android:id="@+id/voice_button"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end"
android:scaleType="fitCenter"
android:src="@drawable/ic_home_voice_search_holo"
android:adjustViewBounds="true" />
</com.android.launcher3.HolographicLinearLayout>

View File

@ -1,33 +0,0 @@
<?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.launcher3.Workspace
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
android:paddingStart="@dimen/workspace_left_padding"
android:paddingEnd="@dimen/workspace_right_padding"
android:paddingTop="@dimen/workspace_top_padding"
android:paddingBottom="@dimen/workspace_bottom_padding"
launcher:defaultScreen="2"
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.launcher3.Workspace>

View File

@ -15,6 +15,6 @@
-->
<com.android.launcher3.BubbleTextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/WorkspaceIcon.Portrait"
style="@style/WorkspaceIcon"
android:focusable="true"
android:background="@drawable/focusable_view_bg" />

View File

@ -17,18 +17,19 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:layout_gravity="center_vertical">
<ImageView
android:id="@+id/inactive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/now_page"
android:src="@drawable/custom_content_page"
/>
<ImageView
android:id="@+id/active"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/now_page"
android:src="@drawable/custom_content_page"
android:alpha="0"
/>
</com.android.launcher3.PageIndicatorMarker>

View File

@ -24,10 +24,10 @@
<ImageView
android:id="@+id/preview_background"
android:layout_gravity="center_horizontal"
android:layout_width="@dimen/folder_preview_size"
android:layout_height="@dimen/folder_preview_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/portal_ring_inner_holo"/>
<com.android.launcher3.BubbleTextView
android:id="@+id/folder_icon_name"
style="@style/WorkspaceIcon.Portrait.Folder"/>
style="@style/WorkspaceIcon"/>
</com.android.launcher3.FolderIcon>

View File

@ -13,11 +13,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<ImageView
<com.android.launcher3.Hotseat
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingStart="@dimen/workspace_divider_padding_left"
android:paddingEnd="@dimen/workspace_divider_padding_right"
android:paddingTop="@dimen/workspace_divider_padding_top"
android:paddingBottom="@dimen/workspace_divider_padding_bottom"
android:scaleType="fitXY"
android:src="@drawable/hotseat_track_holo" />
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3">
<com.android.launcher3.CellLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center" />
</com.android.launcher3.Hotseat>

View File

@ -17,7 +17,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:layout_gravity="center_vertical">
<ImageView
android:id="@+id/inactive"
android:layout_width="wrap_content"

View File

@ -16,16 +16,24 @@
<com.android.launcher3.SearchDropTargetBar
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/QSBBar"
android:focusable="false">
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Search buttons container -->
<include android:id="@+id/qsb_search_bar"
layout="@layout/search_bar" />
layout="@layout/search_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<!-- Drag specific targets container -->
<LinearLayout
style="@style/SearchDropTargetBar"
android:id="@+id/drag_target_bar">
android:id="@+id/drag_target_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<include
layout="@layout/drop_target_bar" />

View File

@ -30,16 +30,8 @@
android:id="@+id/folder_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="@dimen/folder_padding"
android:paddingEnd="@dimen/folder_padding"
android:paddingTop="@dimen/folder_padding"
android:paddingBottom="@dimen/folder_padding"
android:cacheColorHint="#ff333333"
android:hapticFeedbackEnabled="false"
launcher:widthGap="@dimen/folder_width_gap"
launcher:heightGap="@dimen/folder_height_gap"
launcher:cellWidth="@dimen/folder_cell_width"
launcher:cellHeight="@dimen/folder_cell_height" />
android:hapticFeedbackEnabled="false" />
</ScrollView>
<com.android.launcher3.FolderEditText

View File

@ -20,14 +20,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="@dimen/cell_layout_left_padding"
android:paddingEnd="@dimen/cell_layout_right_padding"
android:paddingTop="@dimen/cell_layout_top_padding"
android:paddingBottom="@dimen/cell_layout_bottom_padding"
android:hapticFeedbackEnabled="false"
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:maxGap="@dimen/workspace_max_gap" />

View File

@ -20,11 +20,4 @@
<bool name="config_useDropTargetDownTransition">false</bool>
<!-- Whether or not to fade the side pages -->
<bool name="config_workspaceFadeAdjacentScreens">false</bool>
<!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
>= folder_max_num_items. If any values are set to 0, the values will be determined automatically.
A value of -1 indicates unbounded -->
<integer name="folder_max_count_x">6</integer>
<integer name="folder_max_count_y">-1</integer>
<integer name="folder_max_num_items">-1</integer>
</resources>

View File

@ -20,39 +20,9 @@
<dimen name="toolbar_button_horizontal_padding">0dip</dimen>
<!-- Workspace -->
<dimen name="hotseat_cell_width">64dp</dimen>
<dimen name="hotseat_cell_height">58dp</dimen>
<!-- We really want the page spacing to be the max of either the button bar
height or the qsb bar height -->
<dimen name="workspace_page_spacing">-1dp</dimen>
<dimen name="workspace_divider_padding_left">0dp</dimen>
<dimen name="workspace_divider_padding_right">0dp</dimen>
<dimen name="workspace_divider_padding_top">12dp</dimen>
<dimen name="workspace_divider_padding_bottom">12dp</dimen>
<!-- Block spacing on each side of the screen. And also padding
for the portals to look right. -->
<dimen name="cell_layout_left_padding">@dimen/cell_layout_left_padding_land</dimen>
<dimen name="cell_layout_right_padding">@dimen/cell_layout_right_padding_land</dimen>
<dimen name="cell_layout_top_padding">@dimen/cell_layout_top_padding_land</dimen>
<dimen name="cell_layout_bottom_padding">@dimen/cell_layout_bottom_padding_land</dimen>
<!-- Workspace padding -->
<dimen name="workspace_left_padding">@dimen/workspace_left_padding_land</dimen>
<dimen name="workspace_right_padding">@dimen/workspace_right_padding_land</dimen>
<dimen name="workspace_top_padding">@dimen/workspace_top_padding_land</dimen>
<dimen name="workspace_bottom_padding">@dimen/workspace_bottom_padding_land</dimen>
<dimen name="app_icon_padding_top">6dp</dimen>
<!-- height of the bottom row of controls -->
<dimen name="button_bar_height">68dip</dimen>
<!-- Because portal animations go beyond the bounds of an icon, we need
to make the dock layout slightly larger than the button_bar_height -->
<dimen name="button_bar_height_top_padding">8dp</dimen>
<dimen name="button_bar_height_bottom_padding">0dp</dimen>
<dimen name="button_bar_width_left_padding">0dp</dimen>
<dimen name="button_bar_width_right_padding">0dp</dimen>
<dimen name="button_bar_height_plus_padding">76dp</dimen>
<!-- AppsCustomize -->
<dimen name="apps_customize_cell_width">80dp</dimen>
@ -71,14 +41,4 @@
<integer name="apps_customize_widget_cell_count_y">2</integer>
<integer name="apps_customize_cling_focused_x">2</integer>
<integer name="apps_customize_cling_focused_y">1</integer>
<!-- Folders -->
<!-- The size of the image which sits behind the preview of the folder contents -->
<dimen name="folder_preview_size">58dp</dimen>
<!-- Workspace cell size -->
<dimen name="workspace_cell_width">@dimen/workspace_cell_width_land</dimen>
<dimen name="workspace_cell_height">@dimen/workspace_cell_height_land</dimen>
<dimen name="workspace_width_gap">@dimen/workspace_width_gap_land</dimen>
<dimen name="workspace_height_gap">@dimen/workspace_height_gap_land</dimen>
</resources>

View File

@ -20,23 +20,10 @@
<resources>
<!-- Search Bar -->
<style name="QSBBar">
<item name="android:orientation">vertical</item>
<item name="android:layout_width">@dimen/qsb_bar_height</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_gravity">start</item>
</style>
<style name="SearchDropTargetBar">
<item name="android:orientation">vertical</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center_horizontal</item>
</style>
<style name="SearchButton">
<item name="android:layout_gravity">center_horizontal</item>
<item name="android:paddingTop">@dimen/toolbar_button_vertical_padding</item>
<item name="android:paddingBottom">@dimen/toolbar_button_vertical_padding</item>
<item name="android:paddingStart">@dimen/toolbar_button_horizontal_padding</item>
<item name="android:paddingEnd">@dimen/toolbar_button_horizontal_padding</item>
</style>
<style name="DropTargetButtonContainer">
<item name="android:layout_width">match_parent</item>

View File

@ -15,25 +15,7 @@
-->
<resources>
<!-- QSB -->
<dimen name="qsb_bar_height_inset">37dp</dimen>
<dimen name="qsb_bar_height">43dp</dimen>
<dimen name="qsb_padding_left">3dp</dimen>
<dimen name="qsb_padding_right">3dp</dimen>
<!-- Workspace -->
<!-- Block spacing on each side of the screen. And also padding
for the portals to look right. -->
<dimen name="cell_layout_left_padding">@dimen/cell_layout_left_padding_port</dimen>
<dimen name="cell_layout_right_padding">@dimen/cell_layout_right_padding_port</dimen>
<dimen name="cell_layout_top_padding">@dimen/cell_layout_top_padding_port</dimen>
<dimen name="cell_layout_bottom_padding">@dimen/cell_layout_bottom_padding_port</dimen>
<!-- Workspace padding -->
<dimen name="workspace_left_padding">@dimen/workspace_left_padding_port</dimen>
<dimen name="workspace_right_padding">@dimen/workspace_right_padding_port</dimen>
<dimen name="workspace_top_padding">@dimen/workspace_top_padding_port</dimen>
<dimen name="workspace_bottom_padding">@dimen/workspace_bottom_padding_port</dimen>
<dimen name="workspace_page_spacing">-1dp</dimen>
<!-- AppsCustomize -->
@ -50,10 +32,4 @@
<dimen name="apps_customize_widget_cell_height_gap">10dp</dimen>
<integer name="apps_customize_widget_cell_count_x">2</integer>
<integer name="apps_customize_widget_cell_count_y">3</integer>
<!-- Workspace cell size -->
<dimen name="workspace_cell_width">@dimen/workspace_cell_width_port</dimen>
<dimen name="workspace_cell_height">@dimen/workspace_cell_height_port</dimen>
<dimen name="workspace_width_gap">@dimen/workspace_width_gap_port</dimen>
<dimen name="workspace_height_gap">@dimen/workspace_height_gap_port</dimen>
</resources>

View File

@ -17,10 +17,4 @@
<resources>
<!-- Clings -->
<dimen name="folderClingMarginTop">50dp</dimen>
<!-- Workspace -->
<dimen name="workspace_divider_padding_top">6dp</dimen>
<dimen name="workspace_divider_padding_bottom">6dp</dimen>
<dimen name="qsb_bar_height">48dp</dimen>
</resources>

View File

@ -1,28 +0,0 @@
<?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.
*/
-->
<resources>
<!-- Workspace -->
<style name="QSBBar">
<item name="android:orientation">vertical</item>
<item name="android:layout_width">@dimen/qsb_bar_height</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_gravity">start|center_vertical</item>
</style>
</resources>

View File

@ -18,18 +18,6 @@
<!-- Clings -->
<dimen name="folderClingMarginTop">70dp</dimen>
<!-- Workspace -->
<dimen name="workspace_divider_padding_left">6dp</dimen>
<dimen name="workspace_divider_padding_right">6dp</dimen>
<!-- qsb_bar_height_inset represents qsb_bar_height minus the padding
that we put on each page for allowing folders to draw out of bounds -->
<dimen name="qsb_bar_height_inset">48dp</dimen>
<dimen name="qsb_bar_height">54dp</dimen>
<dimen name="qsb_padding_left">6dp</dimen>
<dimen name="qsb_padding_right">6dp</dimen>
<dimen name="search_bar_height">48dp</dimen>
<!-- AppsCustomize -->
<dimen name="apps_customize_pageLayoutPaddingTop">16dp</dimen>
<dimen name="apps_customize_pageLayoutPaddingBottom">20dp</dimen>

View File

@ -17,26 +17,4 @@
<resources>
<!-- Drag padding to add to the bottom of drop targets -->
<dimen name="drop_target_drag_padding">20dp</dimen>
<!-- Hotseat -->
<dimen name="hotseat_width_gap">0dp</dimen>
<dimen name="hotseat_height_gap">0dp</dimen>
<!-- height of the bottom row of controls -->
<dimen name="button_bar_height">80dip</dimen>
<!-- Because portal animations go beyond the bounds of an icon, we need
to make the dock layout slightly larger than the button_bar_height -->
<dimen name="button_bar_height_bottom_padding">8dp</dimen>
<dimen name="button_bar_width_left_padding">8dp</dimen>
<dimen name="button_bar_width_right_padding">8dp</dimen>
<dimen name="button_bar_height_plus_padding">80dp</dimen>
<!-- CellLayout padding land / port-->
<dimen name="cell_layout_left_padding_port">8dp</dimen>
<dimen name="cell_layout_left_padding_land">8dp</dimen>
<dimen name="cell_layout_right_padding_port">8dp</dimen>
<dimen name="cell_layout_right_padding_land">8dp</dimen>
<dimen name="cell_layout_top_padding_port">8dp</dimen>
<dimen name="cell_layout_top_padding_land">8dp</dimen>
<dimen name="cell_layout_bottom_padding_port">8dp</dimen>
<dimen name="cell_layout_bottom_padding_land">8dp</dimen>
</resources>

View File

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 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.
-->
<resources>
<!-- Workspace -->
<!-- qsb_bar_height_inset represents qsb_bar_height minus the padding
that we put on each page for allowing folders to draw out of bounds -->
<dimen name="qsb_bar_height_inset">48dp</dimen>
<dimen name="qsb_bar_height">56dp</dimen>
<dimen name="qsb_padding_left">8dp</dimen>
<dimen name="qsb_padding_right">8dp</dimen>
<dimen name="search_bar_height">48dp</dimen>
<dimen name="workspace_divider_padding_left">8dp</dimen>
<dimen name="workspace_divider_padding_right">8dp</dimen>
<dimen name="workspace_width_gap_land">0dp</dimen>
<dimen name="workspace_width_gap_port">8dp</dimen>
<dimen name="workspace_height_gap_land">0dp</dimen>
<dimen name="workspace_height_gap_port">0dp</dimen>
<dimen name="hotseat_width_gap">2dp</dimen>
</resources>

View File

@ -1,8 +0,0 @@
<resources>
<!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
>= folder_max_num_items. If any values are set to 0, the values will be determined automatically.
A value of -1 indicates unbounded -->
<integer name="folder_max_count_x">8</integer>
<integer name="folder_max_count_y">-1</integer>
<integer name="folder_max_num_items">-1</integer>
</resources>

View File

@ -15,14 +15,6 @@
-->
<resources>
<dimen name="app_icon_padding_top">0dp</dimen>
<dimen name="app_icon_drawable_padding_land">0dp</dimen>
<dimen name="workspace_icon_text_size">11sp</dimen>
<!-- Hotseat -->
<dimen name="button_bar_width_left_padding">14dp</dimen>
<dimen name="button_bar_width_right_padding">14dp</dimen>
<!-- AppsCustomize -->
<dimen name="apps_customize_pageLayoutWidthGap">36dp</dimen>
<dimen name="apps_customize_pageLayoutHeightGap">8dp</dimen>
@ -30,13 +22,6 @@
<dimen name="apps_customize_pageLayoutPaddingBottom">14dp</dimen>
<!-- QSB -->
<dimen name="qsb_bar_height">82dp</dimen>
<dimen name="toolbar_button_vertical_padding">12dip</dimen>
<dimen name="toolbar_button_horizontal_padding">20dip</dimen>
<!-- Workspace -->
<dimen name="workspace_divider_padding_top">12dp</dimen>
<dimen name="workspace_divider_padding_bottom">12dp</dimen>
<dimen name="workspace_divider_padding_left">0dp</dimen>
<dimen name="workspace_divider_padding_right">0dp</dimen>
</resources>

View File

@ -22,7 +22,4 @@
<dimen name="apps_customize_pageLayoutHeightGap">24dp</dimen>
<dimen name="apps_customize_pageLayoutPaddingTop">25dp</dimen>
<dimen name="apps_customize_pageLayoutPaddingBottom">10dp</dimen>
<!-- QSB -->
<dimen name="qsb_bar_height">54dp</dimen>
</resources>

View File

@ -1,8 +1,5 @@
<resources>
<integer name="cell_count_x">6</integer>
<integer name="cell_count_y">6</integer>
<integer name="hotseat_cell_count">7</integer>
<integer name="hotseat_all_apps_index">3</integer>
<bool name="is_tablet">true</bool>
<bool name="allow_rotation">true</bool>
<!-- Whether or not to use custom clings if a custom workspace layout is passed in -->
@ -11,18 +8,7 @@
<!-- DragController -->
<integer name="config_flingToDeleteMinVelocity">-1000</integer>
<!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
>= folder_max_num_items. If any values are set to 0, the values will be determined automatically.
A value of -1 indicates unbounded -->
<integer name="folder_max_count_x">6</integer>
<integer name="folder_max_count_y">-1</integer>
<integer name="folder_max_num_items">-1</integer>
<!-- Camera distance for the overscroll effect. We use a higher value here because the
workspace screens run nearly flush to the edge of the screen-->
<integer name="config_cameraDistance">14000</integer>
<!-- Hotseat -->
<!-- must be between 0 and 100 -->
<integer name="hotseat_item_scale_percentage">80</integer>
</resources>

View File

@ -16,44 +16,6 @@
<resources>
<dimen name="app_icon_size">64dp</dimen>
<dimen name="reveal_radius">64dp</dimen>
<dimen name="app_icon_drawable_padding">3dp</dimen>
<dimen name="app_icon_padding_top">4dp</dimen>
<!-- qsb_bar_height_inset represents qsb_bar_height minus the padding
that we put on each page for allowing folders to draw out of bounds -->
<dimen name="qsb_bar_height_inset">34dp</dimen>
<dimen name="qsb_bar_height">48dp</dimen>
<dimen name="qsb_padding_left">16dp</dimen>
<dimen name="qsb_padding_right">16dp</dimen>
<dimen name="search_bar_height">48dp</dimen>
<!-- Hotseat -->
<dimen name="hotseat_cell_width">70dp</dimen>
<dimen name="hotseat_cell_height">70dp</dimen>
<dimen name="hotseat_width_gap">-1dp</dimen>
<dimen name="hotseat_height_gap">-1dp</dimen>
<dimen name="button_bar_height">94dip</dimen>
<dimen name="button_bar_height_bottom_padding">14dp</dimen>
<dimen name="button_bar_height_top_padding">20dp</dimen>
<dimen name="button_bar_width_left_padding">25dp</dimen>
<dimen name="button_bar_width_right_padding">25dp</dimen>
<dimen name="button_bar_height_plus_padding">104dp</dimen>
<!-- Folders -->
<!-- The size of the image which sits behind the preview of the folder contents -->
<dimen name="folder_preview_size">68dp</dimen>
<dimen name="folder_cell_width">86dp</dimen>
<dimen name="folder_cell_height">90dp</dimen>
<dimen name="folder_width_gap">3dp</dimen>
<dimen name="folder_height_gap">3dp</dimen>
<dimen name="folder_padding">6dp</dimen>
<dimen name="cell_layout_left_padding_port">12dp</dimen>
<dimen name="cell_layout_right_padding_port">12dp</dimen>
<dimen name="workspace_divider_padding_left">19dp</dimen>
<dimen name="workspace_divider_padding_right">19dp</dimen>
<!-- AppsCustomize -->
<dimen name="apps_customize_cell_width">96dp</dimen>
@ -67,13 +29,4 @@
<dimen name="app_widget_preview_label_margin_top">8dp</dimen>
<dimen name="app_widget_preview_label_margin_left">@dimen/app_widget_preview_padding_left</dimen>
<dimen name="app_widget_preview_label_margin_right">@dimen/app_widget_preview_padding_right</dimen>
<!-- Workspace cell size -->
<dimen name="workspace_cell_width_land">88dp</dimen>
<dimen name="workspace_cell_width_port">96dp</dimen>
<dimen name="workspace_cell_height_land">88dp</dimen>
<dimen name="workspace_cell_height_port">96dp</dimen>
<dimen name="workspace_width_gap_land">32dp</dimen>
<dimen name="workspace_width_gap_port">0dp</dimen>
<dimen name="workspace_height_gap_land">0dp</dimen>
<dimen name="workspace_height_gap_port">24dp</dimen>
</resources>

View File

@ -33,26 +33,9 @@
<dimen name="scroll_zone">40dp</dimen>
<dimen name="workspace_page_spacing">24dp</dimen>
<dimen name="qsb_bar_height">102dp</dimen>
<dimen name="qsb_bar_height_inset">102dp</dimen>
<dimen name="qsb_padding_left">72dp</dimen>
<dimen name="qsb_padding_right">72dp</dimen>
<!-- We offset the proxy to overlap with the voice icon -->
<dimen name="qsb_voice_proxy_padding_right">100dp</dimen>
<integer name="apps_customize_cling_focused_x">2</integer>
<integer name="apps_customize_cling_focused_y">2</integer>
<!-- Divider width set to match the qsb width -->
<dimen name="workspace_divider_padding_left">72dp</dimen>
<dimen name="workspace_divider_padding_right">72dp</dimen>
<!-- Hotseat -->
<dimen name="hotseat_width_gap">14dp</dimen>
<dimen name="button_bar_height">126dp</dimen>
<dimen name="button_bar_height_plus_padding">126dp</dimen>
<dimen name="button_bar_height_bottom_padding">32dp</dimen>
<!-- Cling -->
<!-- The offset for the text in the cling -->
<dimen name="cling_text_block_offset_x">80dp</dimen>

View File

@ -1,25 +1,14 @@
<resources>
<integer name="cell_count_x">8</integer>
<integer name="cell_count_y">5</integer>
<integer name="hotseat_cell_count">9</integer>
<integer name="hotseat_all_apps_index">4</integer>
<bool name="config_largeHeap">true</bool>
<bool name="is_large_screen">true</bool>
<bool name="is_large_tablet">true</bool>
<!-- AllApps/Customize/AppsCustomize -->
<!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
<integer name="config_workspaceSpringLoadShrinkPercentage">90</integer>
<!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
>= folder_max_num_items. If any values are set to 0, the values will be determined automatically.
A value of -1 indicates unbounded -->
<integer name="folder_max_count_x">0</integer>
<integer name="folder_max_count_y">-1</integer>
<integer name="folder_max_num_items">-1</integer>
<!-- Workspace -->
<!-- Whether or not the drop targets drop down as opposed to fade in -->
<bool name="config_useDropTargetDownTransition">true</bool>
<bool name="config_useDropTargetDownTransition">false</bool>
<!-- Whether or not to fade the side pages -->
<bool name="config_workspaceFadeAdjacentScreens">true</bool>

View File

@ -16,38 +16,16 @@
<resources>
<dimen name="app_icon_size">72dp</dimen>
<dimen name="app_icon_padding_top">0dp</dimen>
<dimen name="reveal_radius">72dp</dimen>
<!-- Hotseat -->
<dimen name="button_bar_height">82dp</dimen>
<dimen name="button_bar_height_top_padding">12dp</dimen>
<dimen name="button_bar_height_bottom_padding">12dp</dimen>
<dimen name="button_bar_width_left_padding">12dp</dimen>
<dimen name="button_bar_width_right_padding">12dp</dimen>
<dimen name="button_bar_height_plus_padding">82dp</dimen>
<dimen name="hotseat_width_gap">58dp</dimen>
<!-- QSB -->
<dimen name="toolbar_button_vertical_padding">8dip</dimen>
<dimen name="toolbar_button_horizontal_padding">8dip</dimen>
<!-- Workspace -->
<dimen name="qsb_bar_height">60dp</dimen>
<dimen name="qsb_bar_height_inset">60dp</dimen>
<dimen name="qsb_padding_left">177dp</dimen>
<dimen name="qsb_padding_right">177dp</dimen>
<!-- We offset the proxy to overlap with the voice icon -->
<dimen name="qsb_voice_proxy_padding_right">230dp</dimen>
<!-- 44dp high for the optical bounds -->
<dimen name="search_bar_height">52dp</dimen>
<!-- AppsCustomize -->
<dimen name="apps_customize_cell_width">96dp</dimen>
<dimen name="apps_customize_cell_height">96dp</dimen>
<integer name="apps_customize_maxCellCountX">-1</integer>
<integer name="apps_customize_maxCellCountY">-1</integer>
<dimen name="all_apps_button_vertical_padding">4dip</dimen>
<!-- dimensions for the wallpaper picker wallpaper thumbnail width -->
<dimen name="wallpaper_chooser_grid_width">196dp</dimen>
@ -57,51 +35,4 @@
the drag view should be offset from the position of the original view. -->
<dimen name="dragViewOffsetX">0dp</dimen>
<dimen name="dragViewOffsetY">0dp</dimen>
<!-- CellLayout padding land / port-->
<dimen name="cell_layout_left_padding_port">4dp</dimen>
<dimen name="cell_layout_left_padding_land">4dp</dimen>
<dimen name="cell_layout_right_padding_port">4dp</dimen>
<dimen name="cell_layout_right_padding_land">4dp</dimen>
<dimen name="cell_layout_top_padding_port">12dp</dimen>
<dimen name="cell_layout_top_padding_land">12dp</dimen>
<dimen name="cell_layout_bottom_padding_port">8dp</dimen>
<dimen name="cell_layout_bottom_padding_land">8dp</dimen>
<!-- Folders -->
<!-- The size of the image which sits behind the preview of the folder contents -->
<dimen name="folder_cell_width">96dp</dimen>
<dimen name="folder_cell_height">96dp</dimen>
<dimen name="folder_preview_size">70dp</dimen>
<dimen name="folder_width_gap">2dp</dimen>
<dimen name="folder_height_gap">2dp</dimen>
<dimen name="folder_padding">4dp</dimen>
<!-- Workspace padding -->
<dimen name="workspace_left_padding_port">0dp</dimen>
<dimen name="workspace_left_padding_land">0dp</dimen>
<dimen name="workspace_right_padding_port">0dp</dimen>
<dimen name="workspace_right_padding_land">0dp</dimen>
<dimen name="workspace_top_padding_port">@dimen/qsb_bar_height_inset</dimen>
<dimen name="workspace_top_padding_land">@dimen/qsb_bar_height_inset</dimen>
<dimen name="workspace_bottom_padding_port">@dimen/button_bar_height_plus_padding</dimen>
<dimen name="workspace_bottom_padding_land">@dimen/button_bar_height_plus_padding</dimen>
<!-- Divider width set to match the qsb width -->
<dimen name="workspace_divider_width">0dp</dimen>
<dimen name="workspace_divider_padding_left">177dp</dimen>
<dimen name="workspace_divider_padding_right">177dp</dimen>
<dimen name="workspace_divider_padding_top">0dp</dimen>
<dimen name="workspace_divider_padding_bottom">0dp</dimen>
<!-- Workspace cell size -->
<dimen name="workspace_cell_width_land">96dp</dimen>
<dimen name="workspace_cell_width_port">96dp</dimen>
<dimen name="workspace_cell_height_land">96dp</dimen>
<dimen name="workspace_cell_height_port">96dp</dimen>
<dimen name="workspace_width_gap_land">50dp</dimen>
<dimen name="workspace_width_gap_port">0dp</dimen>
<dimen name="workspace_height_gap_land">16dp</dimen>
<dimen name="workspace_height_gap_port">70dp</dimen>
</resources>

View File

@ -51,43 +51,6 @@
</style>
<!-- Workspace -->
<style name="WorkspaceIcon.Portrait">
<item name="android:drawablePadding">0dp</item>
<item name="android:paddingStart">4dp</item>
<item name="android:paddingEnd">4dp</item>
<item name="android:paddingTop">@dimen/app_icon_padding_top</item>
<item name="android:paddingBottom">4dp</item>
<item name="android:textSize">13sp</item>
</style>
<style name="WorkspaceIcon.Portrait.Folder">
<item name="android:shadowRadius">0.0</item> <!-- Don't use text shadow -->
<item name="android:drawablePadding">0dp</item>
<item name="android:paddingStart">4dp</item>
<item name="android:paddingEnd">4dp</item>
<item name="android:paddingTop">0dp</item>
<item name="android:paddingBottom">0dp</item>
<item name="android:textSize">13sp</item>
<item name="android:layout_marginTop">-2dp</item>
</style>
<style name="WorkspaceIcon.Landscape">
<item name="android:drawablePadding">0dp</item>
<item name="android:paddingStart">4dp</item>
<item name="android:paddingEnd">4dp</item>
<item name="android:paddingTop">@dimen/app_icon_padding_top</item>
<item name="android:paddingBottom">4dp</item>
<item name="android:textSize">13sp</item>
</style>
<style name="WorkspaceIcon.Landscape.Folder">
<item name="android:shadowRadius">0.0</item> <!-- Don't use text shadow -->
<item name="android:drawablePadding">0dp</item>
<item name="android:paddingStart">4dp</item>
<item name="android:paddingEnd">4dp</item>
<item name="android:paddingTop">0dp</item>
<item name="android:paddingBottom">0dp</item>
<item name="android:textSize">13sp</item>
<item name="android:layout_marginTop">-2dp</item>
</style>
<style name="Theme" parent="android:Theme.Holo.Wallpaper.NoTitleBar">
<item name="android:windowActionModeOverlay">true</item>
</style>
@ -123,23 +86,10 @@
<!-- QSB Search / Drop Target bar -->
<style name="QSBBar">
<item name="android:orientation">horizontal</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">@dimen/qsb_bar_height</item>
<item name="android:layout_gravity">top|center_horizontal</item>
<item name="android:paddingStart">@dimen/qsb_padding_left</item>
<item name="android:paddingEnd">@dimen/qsb_padding_right</item>
</style>
<style name="SearchDropTargetBar">
<item name="android:orientation">horizontal</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_gravity">bottom|center_horizontal</item>
</style>
<style name="SearchButton">
<item name="android:layout_gravity">center_vertical</item>
<item name="android:paddingTop">@dimen/toolbar_button_vertical_padding</item>
<item name="android:paddingBottom">@dimen/toolbar_button_vertical_padding</item>
</style>
<style name="DropTargetButtonContainer">
<item name="android:layout_width">0dp</item>

View File

@ -106,9 +106,6 @@
<attr name="pageSpacing" format="dimension" />
<!-- The page indicator for this workspace -->
<attr name="pageIndicator" format="reference" />
<!-- The padding for the scroll indicator area -->
<attr name="scrollIndicatorPaddingLeft" format="dimension" />
<attr name="scrollIndicatorPaddingRight" format="dimension" />
</declare-styleable>
<!-- AppsCustomizePagedView specific attributes. These attributes are used to

View File

@ -1,6 +1,7 @@
<resources>
<bool name="config_largeHeap">false</bool>
<bool name="is_large_screen">false</bool>
<bool name="is_tablet">false</bool>
<bool name="is_large_tablet">false</bool>
<bool name="allow_rotation">false</bool>
<!-- Max number of page indicators to show -->
@ -40,7 +41,7 @@
<!-- Workspace -->
<!-- Whether or not the drop targets drop down as opposed to fade in -->
<bool name="config_useDropTargetDownTransition">true</bool>
<bool name="config_useDropTargetDownTransition">false</bool>
<!-- Whether or not to fade the side pages -->
<bool name="config_workspaceFadeAdjacentScreens">false</bool>
@ -72,25 +73,11 @@
<!-- Camera distance for the overscroll effect -->
<integer name="config_cameraDistance">6500</integer>
<!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
>= folder_max_num_items. If any values are set to 0, the values will be determined automatically.
A value of -1 indicates unbounded -->
<integer name="folder_max_count_x">4</integer>
<integer name="folder_max_count_y">-1</integer>
<integer name="folder_max_num_items">-1</integer>
<integer name="cell_count_x">4</integer>
<integer name="cell_count_y">4</integer>
<!-- Whether or not to use custom clings if a custom workspace layout is passed in -->
<bool name="config_useCustomClings">false</bool>
<!-- Hotseat -->
<bool name="hotseat_transpose_layout_with_orientation">true</bool>
<integer name="hotseat_cell_count">5</integer>
<integer name="hotseat_all_apps_index">2</integer>
<!-- must be between 0 and 100 -->
<integer name="hotseat_item_scale_percentage">100</integer>
<!-- Memory debugging, including a memory dump icon -->
<bool name="debug_memory_enabled">true</bool>

View File

@ -15,48 +15,30 @@
-->
<resources>
<!-- Dynamic Grid -->
<dimen name="dynamic_grid_edge_margin">6dp</dimen>
<dimen name="dynamic_grid_search_bar_max_width">500dp</dimen>
<dimen name="dynamic_grid_search_bar_height">48dp</dimen>
<dimen name="dynamic_grid_page_indicator_height">24dp</dimen>
<!-- Cling -->
<dimen name="clingPunchThroughGraphicCenterRadius">94dp</dimen>
<dimen name="folderClingMarginTop">20dp</dimen>
<!-- The offset for the text in the cling -->
<dimen name="cling_text_block_offset_x">0dp</dimen>
<dimen name="cling_text_block_offset_y">0dp</dimen>
<dimen name="reveal_radius">48dp</dimen>
<!-- entries for custom clings, will be set in overlays -->
<add-resource type="dimen" name="custom_cling_margin_top" />
<add-resource type="dimen" name="custom_cling_margin_right" />
<add-resource type="dimen" name="custom_cling_margin_left" />
<!-- Workspace -->
<!-- qsb_bar_height_inset represents qsb_bar_height minus the padding
that we put on each page for allowing folders to draw out of bounds -->
<dimen name="qsb_bar_height_inset">34dp</dimen>
<dimen name="qsb_bar_height">40dp</dimen>
<dimen name="qsb_padding_left">0dp</dimen>
<dimen name="qsb_padding_right">0dp</dimen>
<dimen name="search_bar_height">40dp</dimen>
<dimen name="workspace_max_gap">16dp</dimen>
<dimen name="folder_cell_width">74dp</dimen>
<dimen name="folder_cell_height">82dp</dimen>
<dimen name="folder_icon_padding_top">2dp</dimen>
<dimen name="workspace_divider_padding_left">3dp</dimen>
<dimen name="workspace_divider_padding_right">3dp</dimen>
<dimen name="workspace_divider_padding_top">0dp</dimen>
<dimen name="workspace_divider_padding_bottom">0dp</dimen>
<dimen name="hotseat_cell_width">64dp</dimen>
<dimen name="hotseat_cell_height">64dp</dimen>
<dimen name="hotseat_width_gap">-1dp</dimen>
<dimen name="hotseat_height_gap">-1dp</dimen>
<dimen name="workspace_overscroll_drawable_padding">0dp</dimen>
<dimen name="workspace_icon_text_size">12sp</dimen>
<dimen name="workspace_spring_loaded_page_spacing">15dp</dimen>
<dimen name="overview_panel_bottom_padding">50dp</dimen>
<dimen name="overview_panel_buttonSpacing">40dp</dimen>
<dimen name="app_icon_drawable_padding">6dp</dimen>
<dimen name="app_icon_drawable_padding_land">2dp</dimen>
<dimen name="app_icon_padding_top">8dp</dimen>
<!-- QSB -->
<dimen name="toolbar_button_vertical_padding">4dip</dimen>
<dimen name="toolbar_button_horizontal_padding">12dip</dimen>
@ -83,16 +65,6 @@
<dimen name="apps_customize_page_indicator_height">12dp</dimen>
<dimen name="apps_customize_page_indicator_margin">4dp</dimen>
<!-- height of the bottom row of controls -->
<dimen name="button_bar_height">62dip</dimen>
<!-- Because portal animations go beyond the bounds of an icon, we need
to make the dock layout slightly larger than the button_bar_height -->
<dimen name="button_bar_height_top_padding">8dp</dimen>
<dimen name="button_bar_height_bottom_padding">0dp</dimen>
<dimen name="button_bar_width_left_padding">0dp</dimen>
<dimen name="button_bar_width_right_padding">0dp</dimen>
<dimen name="button_bar_height_plus_padding">70dp</dimen>
<!-- Drag padding to add to the bottom of drop targets -->
<dimen name="drop_target_drag_padding">14dp</dimen>
@ -123,42 +95,7 @@
<dimen name="shortcut_preview_padding_top">0dp</dimen>
<!-- Folders -->
<!-- The size of the image which sits behind the preview of the folder contents -->
<dimen name="folder_preview_size">62dp</dimen>
<!-- The amount that the preview contents are inset from the preview background -->
<dimen name="folder_preview_padding">4dp</dimen>
<dimen name="folder_name_padding">10dp</dimen>
<dimen name="folder_width_gap">0dp</dimen>
<dimen name="folder_height_gap">0dp</dimen>
<dimen name="folder_padding">0dp</dimen>
<!-- CellLayout padding -->
<dimen name="cell_layout_left_padding_port">0dp</dimen>
<dimen name="cell_layout_left_padding_land">0dp</dimen>
<dimen name="cell_layout_right_padding_port">0dp</dimen>
<dimen name="cell_layout_right_padding_land">0dp</dimen>
<dimen name="cell_layout_top_padding_port">6dp</dimen>
<dimen name="cell_layout_top_padding_land">0dp</dimen>
<dimen name="cell_layout_bottom_padding_port">0dp</dimen>
<dimen name="cell_layout_bottom_padding_land">0dp</dimen>
<!-- Workspace padding -->
<dimen name="workspace_left_padding_port">0dp</dimen>
<dimen name="workspace_left_padding_land">@dimen/qsb_bar_height</dimen>
<dimen name="workspace_right_padding_port">0dp</dimen>
<dimen name="workspace_right_padding_land">@dimen/button_bar_height</dimen>
<dimen name="workspace_top_padding_port">@dimen/qsb_bar_height_inset</dimen>
<dimen name="workspace_top_padding_land">0dp</dimen>
<dimen name="workspace_bottom_padding_port">@dimen/button_bar_height</dimen>
<dimen name="workspace_bottom_padding_land">0dp</dimen>
<!-- Workspace cell size -->
<dimen name="workspace_cell_width_land">106dp</dimen>
<dimen name="workspace_cell_width_port">80dp</dimen>
<dimen name="workspace_cell_height_land">74dp</dimen>
<dimen name="workspace_cell_height_port">100dp</dimen>
<dimen name="workspace_width_gap_land">0dp</dimen>
<dimen name="workspace_width_gap_port">0dp</dimen>
<dimen name="workspace_height_gap_land">0dp</dimen>
<dimen name="workspace_height_gap_port">0dp</dimen>
</resources>

View File

@ -63,38 +63,14 @@
<item name="android:gravity">center_horizontal</item>
<item name="android:singleLine">true</item>
<item name="android:ellipsize">marquee</item>
<item name="android:textSize">@dimen/workspace_icon_text_size</item>
<item name="android:textColor">@color/workspace_icon_text_color</item>
<item name="android:shadowRadius">2.0</item>
<item name="android:shadowColor">#B0000000</item>
</style>
<style name="WorkspaceIcon.Portrait">
<item name="android:drawablePadding">@dimen/app_icon_drawable_padding</item>
<item name="android:paddingStart">4dp</item>
<item name="android:paddingEnd">4dp</item>
<item name="android:paddingTop">@dimen/app_icon_padding_top</item>
<item name="android:paddingBottom">4dp</item>
</style>
<style name="WorkspaceIcon.Landscape">
<item name="android:drawablePadding">@dimen/app_icon_drawable_padding_land</item>
<item name="android:paddingStart">4dp</item>
<item name="android:paddingEnd">4dp</item>
<item name="android:paddingTop">@dimen/app_icon_padding_top</item>
<item name="android:paddingBottom">4dp</item>
</style>
<style name="WorkspaceIcon.Portrait.Folder">
<item name="android:shadowRadius">0.0</item> <!-- Don't use text shadow -->
<item name="android:drawablePadding">0dp</item>
<item name="android:paddingTop">@dimen/folder_icon_padding_top</item>
</style>
<style name="WorkspaceIcon.Landscape.Folder">
<item name="android:shadowRadius">0.0</item> <!-- Don't use text shadow -->
<item name="android:drawablePadding">0dp</item>
<item name="android:paddingTop">0dp</item>
<item name="android:layout_marginTop">-2dp</item>
</style>
<style name="WorkspaceIcon.Portrait.AppsCustomize">
@ -118,22 +94,10 @@
<style name="QSBBar">
<item name="android:orientation">horizontal</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">@dimen/qsb_bar_height</item>
<item name="android:layout_gravity">top|center_horizontal</item>
<item name="android:paddingStart">@dimen/qsb_padding_left</item>
<item name="android:paddingEnd">@dimen/qsb_padding_right</item>
</style>
<style name="SearchDropTargetBar">
<item name="android:orientation">horizontal</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:layout_gravity">bottom|center_horizontal</item>
</style>
<style name="SearchButton">
<item name="android:layout_gravity">center_vertical</item>
<item name="android:paddingTop">@dimen/toolbar_button_vertical_padding</item>
<item name="android:paddingBottom">@dimen/toolbar_button_vertical_padding</item>
</style>
<style name="DropTargetButtonContainer">
<item name="android:layout_width">0dp</item>

View File

@ -360,12 +360,6 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
Configuration.ORIENTATION_LANDSCAPE;
int maxCellCountX = Integer.MAX_VALUE;
int maxCellCountY = Integer.MAX_VALUE;
if (LauncherAppState.getInstance().isScreenLarge()) {
maxCellCountX = (isLandscape ? LauncherModel.getCellCountX() :
LauncherModel.getCellCountY());
maxCellCountY = (isLandscape ? LauncherModel.getCellCountY() :
LauncherModel.getCellCountX());
}
if (mMaxAppCellCountX > -1) {
maxCellCountX = Math.min(maxCellCountX, mMaxAppCellCountX);
}
@ -1162,7 +1156,9 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
// Note: We force a measure here to get around the fact that when we do layout calculations
// immediately after syncing, we don't have a proper width.
int widthSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.AT_MOST);
int workspaceWidth = mLauncher.getWorkspace().getMeasuredWidth();
int widthSpec = MeasureSpec.makeMeasureSpec(Math.min(getMeasuredWidth(), workspaceWidth),
MeasureSpec.AT_MOST);
int heightSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST);
layout.setMinimumWidth(getPageContentWidth());
layout.measure(widthSpec, heightSpec);

View File

@ -25,6 +25,7 @@ import android.graphics.Region;
import android.graphics.Region.Op;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.widget.TextView;
@ -34,7 +35,6 @@ import android.widget.TextView;
* too aggressive.
*/
public class BubbleTextView extends TextView {
static final float CORNER_RADIUS = 4.0f;
static final float SHADOW_LARGE_RADIUS = 4.0f;
static final float SHADOW_SMALL_RADIUS = 1.75f;
static final float SHADOW_Y_OFFSET = 2.0f;
@ -55,6 +55,8 @@ public class BubbleTextView extends TextView {
private int mPressedOutlineColor;
private int mPressedGlowColor;
private boolean mIsTextVisible;
private boolean mBackgroundSizeChanged;
private Drawable mBackground;
@ -76,6 +78,15 @@ public class BubbleTextView extends TextView {
init();
}
public void onFinishInflate() {
super.onFinishInflate();
// Ensure we are using the right text size
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
setTextSize(TypedValue.COMPLEX_UNIT_SP, grid.iconTextSize);
}
private void init() {
mLongPressHelper = new CheckLongPressHelper(this);
mBackground = getBackground();
@ -326,6 +337,20 @@ public class BubbleTextView extends TextView {
if (mBackground != null) mBackground.setCallback(null);
}
public void setTextVisibility(boolean visible) {
Resources res = getResources();
if (visible) {
setTextColor(res.getColor(R.color.workspace_icon_text_color));
} else {
setTextColor(res.getColor(android.R.color.transparent));
}
mIsTextVisible = visible;
}
public boolean isTextVisible() {
return mIsTextVisible;
}
@Override
protected boolean onSetAlpha(int alpha) {
if (mPrevAlpha != alpha) {

View File

@ -191,11 +191,11 @@ public class CellLayout extends ViewGroup {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout, defStyle, 0);
mCellWidth = a.getDimensionPixelSize(R.styleable.CellLayout_cellWidth, 10);
mCellHeight = a.getDimensionPixelSize(R.styleable.CellLayout_cellHeight, 10);
mWidthGap = mOriginalWidthGap = a.getDimensionPixelSize(R.styleable.CellLayout_widthGap, 0);
mHeightGap = mOriginalHeightGap = a.getDimensionPixelSize(R.styleable.CellLayout_heightGap, 0);
mMaxGap = a.getDimensionPixelSize(R.styleable.CellLayout_maxGap, 0);
mCellWidth = -1;
mCellHeight = -1;
mWidthGap = mOriginalWidthGap = 0;
mHeightGap = mOriginalHeightGap = 0;
mMaxGap = Integer.MAX_VALUE;
mCountX = LauncherModel.getCellCountX();
mCountY = LauncherModel.getCellCountY();
mOccupied = new boolean[mCountX][mCountY];
@ -208,7 +208,9 @@ public class CellLayout extends ViewGroup {
setAlwaysDrawnWithCacheEnabled(false);
final Resources res = getResources();
mHotseatScale = (res.getInteger(R.integer.hotseat_item_scale_percentage) / 100f);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
mHotseatScale = (float) grid.hotseatIconSize / grid.iconSize;
mNormalBackground = res.getDrawable(R.drawable.homescreen_blue_normal_holo);
mActiveGlowBackground = res.getDrawable(R.drawable.homescreen_blue_strong_holo);
@ -219,16 +221,13 @@ public class CellLayout extends ViewGroup {
res.getDimensionPixelSize(R.dimen.workspace_overscroll_drawable_padding);
mReorderHintAnimationMagnitude = (REORDER_HINT_MAGNITUDE *
res.getDimensionPixelSize(R.dimen.app_icon_size));
grid.iconSizePx);
mNormalBackground.setFilterBitmap(true);
mActiveGlowBackground.setFilterBitmap(true);
// Initialize the data structures used for the drag visualization.
mEaseOutInterpolator = new DecelerateInterpolator(2.5f); // Quint ease out
mDragCell[0] = mDragCell[1] = -1;
for (int i = 0; i < mDragOutlines.length; i++) {
mDragOutlines[i] = new Rect(-1, -1, -1, -1);
@ -289,33 +288,11 @@ public class CellLayout extends ViewGroup {
mShortcutsAndWidgets = new ShortcutAndWidgetContainer(context);
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
mCountX);
mCountX, mCountY);
addView(mShortcutsAndWidgets);
}
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.
int cellWidth = r.getDimensionPixelSize(R.dimen.workspace_cell_width);
int minGap = Math.min(r.getDimensionPixelSize(R.dimen.workspace_width_gap),
r.getDimensionPixelSize(R.dimen.workspace_height_gap));
return minGap * (numCells - 1) + cellWidth * numCells;
}
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.
int cellHeight = r.getDimensionPixelSize(R.dimen.workspace_cell_height);
int minGap = Math.min(r.getDimensionPixelSize(R.dimen.workspace_width_gap),
r.getDimensionPixelSize(R.dimen.workspace_height_gap));
return minGap * (numCells - 1) + cellHeight * numCells;
}
public void enableHardwareLayers() {
mShortcutsAndWidgets.setLayerType(LAYER_TYPE_HARDWARE, sPaint);
}
@ -332,6 +309,13 @@ public class CellLayout extends ViewGroup {
return mIsHotseat ? mHotseatScale : 1.0f;
}
public void setCellDimensions(int width, int height) {
mCellWidth = width;
mCellHeight = height;
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
mCountX, mCountY);
}
public void setGridSize(int x, int y) {
mCountX = x;
mCountY = y;
@ -339,7 +323,7 @@ public class CellLayout extends ViewGroup {
mTmpOccupied = new boolean[mCountX][mCountY];
mTempRectStack.clear();
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
mCountX);
mCountX, mCountY);
requestLayout();
}
@ -500,17 +484,21 @@ public class CellLayout extends ViewGroup {
int previewOffset = FolderRingAnimator.sPreviewSize;
// The folder outer / inner ring image(s)
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
for (int i = 0; i < mFolderOuterRings.size(); i++) {
FolderRingAnimator fra = mFolderOuterRings.get(i);
// Draw outer ring
Drawable d = FolderRingAnimator.sSharedOuterRingDrawable;
int width = (int) fra.getOuterRingSize();
int width = (int) (fra.getOuterRingSize() * getChildrenScale());
int height = width;
cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
View child = getChildAt(fra.mCellX, fra.mCellY);
int centerX = mTempLocation[0] + mCellWidth / 2;
int centerY = mTempLocation[1] + previewOffset / 2;
int centerY = mTempLocation[1] + previewOffset / 2 +
child.getPaddingTop() + grid.folderBackgroundOffset;
canvas.save();
canvas.translate(centerX - width / 2, centerY - height / 2);
@ -520,12 +508,14 @@ public class CellLayout extends ViewGroup {
// Draw inner ring
d = FolderRingAnimator.sSharedInnerRingDrawable;
width = (int) fra.getInnerRingSize();
width = (int) (fra.getInnerRingSize() * getChildrenScale());
height = width;
cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
child = getChildAt(fra.mCellX, fra.mCellY);
centerX = mTempLocation[0] + mCellWidth / 2;
centerY = mTempLocation[1] + previewOffset / 2;
centerY = mTempLocation[1] + previewOffset / 2 +
child.getPaddingTop() + grid.folderBackgroundOffset;
canvas.save();
canvas.translate(centerX - width / 2, centerY - width / 2);
d.setBounds(0, 0, width, height);
@ -539,8 +529,10 @@ public class CellLayout extends ViewGroup {
int height = d.getIntrinsicHeight();
cellToPoint(mFolderLeaveBehindCell[0], mFolderLeaveBehindCell[1], mTempLocation);
View child = getChildAt(mFolderLeaveBehindCell[0], mFolderLeaveBehindCell[1]);
int centerX = mTempLocation[0] + mCellWidth / 2;
int centerY = mTempLocation[1] + previewOffset / 2;
int centerY = mTempLocation[1] + previewOffset / 2 +
child.getPaddingTop() + grid.folderBackgroundOffset;
canvas.save();
canvas.translate(centerX - width / 2, centerY - width / 2);
@ -620,6 +612,7 @@ public class CellLayout extends ViewGroup {
public void setIsHotseat(boolean isHotseat) {
mIsHotseat = isHotseat;
mShortcutsAndWidgets.setIsHotseat(isHotseat);
}
public boolean addViewToCellLayout(View child, int index, int childId, LayoutParams params,
@ -631,11 +624,7 @@ public class CellLayout extends ViewGroup {
BubbleTextView bubbleChild = (BubbleTextView) child;
Resources res = getResources();
if (mIsHotseat) {
bubbleChild.setTextColor(res.getColor(android.R.color.transparent));
} else {
bubbleChild.setTextColor(res.getColor(R.color.workspace_icon_text_color));
}
bubbleChild.setTextVisibility(!mIsHotseat);
}
child.setScaleX(getChildrenScale());
@ -940,49 +929,10 @@ public class CellLayout extends ViewGroup {
static void getMetrics(Rect metrics, Resources res, int measureWidth, int measureHeight,
int countX, int countY, int orientation) {
int numWidthGaps = countX - 1;
int numHeightGaps = countY - 1;
int widthGap;
int heightGap;
int cellWidth;
int cellHeight;
int paddingLeft;
int paddingRight;
int paddingTop;
int paddingBottom;
int maxGap = res.getDimensionPixelSize(R.dimen.workspace_max_gap);
if (orientation == LANDSCAPE) {
cellWidth = res.getDimensionPixelSize(R.dimen.workspace_cell_width_land);
cellHeight = res.getDimensionPixelSize(R.dimen.workspace_cell_height_land);
widthGap = res.getDimensionPixelSize(R.dimen.workspace_width_gap_land);
heightGap = res.getDimensionPixelSize(R.dimen.workspace_height_gap_land);
paddingLeft = res.getDimensionPixelSize(R.dimen.cell_layout_left_padding_land);
paddingRight = res.getDimensionPixelSize(R.dimen.cell_layout_right_padding_land);
paddingTop = res.getDimensionPixelSize(R.dimen.cell_layout_top_padding_land);
paddingBottom = res.getDimensionPixelSize(R.dimen.cell_layout_bottom_padding_land);
} else {
// PORTRAIT
cellWidth = res.getDimensionPixelSize(R.dimen.workspace_cell_width_port);
cellHeight = res.getDimensionPixelSize(R.dimen.workspace_cell_height_port);
widthGap = res.getDimensionPixelSize(R.dimen.workspace_width_gap_port);
heightGap = res.getDimensionPixelSize(R.dimen.workspace_height_gap_port);
paddingLeft = res.getDimensionPixelSize(R.dimen.cell_layout_left_padding_port);
paddingRight = res.getDimensionPixelSize(R.dimen.cell_layout_right_padding_port);
paddingTop = res.getDimensionPixelSize(R.dimen.cell_layout_top_padding_port);
paddingBottom = res.getDimensionPixelSize(R.dimen.cell_layout_bottom_padding_port);
}
if (widthGap < 0 || heightGap < 0) {
int hSpace = measureWidth - paddingLeft - paddingRight;
int vSpace = measureHeight - paddingTop - paddingBottom;
int hFreeSpace = hSpace - (countX * cellWidth);
int vFreeSpace = vSpace - (countY * cellHeight);
widthGap = Math.min(maxGap, numWidthGaps > 0 ? (hFreeSpace / numWidthGaps) : 0);
heightGap = Math.min(maxGap, numHeightGaps > 0 ? (vFreeSpace / numHeightGaps) : 0);
}
metrics.set(cellWidth, cellHeight, widthGap, heightGap);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
metrics.set(grid.calculateCellWidth(measureWidth, countX),
grid.calculateCellHeight(measureHeight, countY), 0, 0);
}
public void setFixedSize(int width, int height) {
@ -992,14 +942,22 @@ public class CellLayout extends ViewGroup {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (mCellWidth < 0 || mCellHeight < 0) {
mCellWidth = grid.calculateCellWidth(widthSize, mCountX);
mCellHeight = grid.calculateCellHeight(heightSize, mCountY);
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap,
mHeightGap, mCountX, mCountY);
}
int newWidth = widthSpecSize;
int newHeight = heightSpecSize;
int newWidth = widthSize;
int newHeight = heightSize;
if (mFixedWidth > 0 && mFixedHeight > 0) {
newWidth = mFixedWidth;
newHeight = mFixedHeight;
@ -1011,29 +969,21 @@ public class CellLayout extends ViewGroup {
int numHeightGaps = mCountY - 1;
if (mOriginalWidthGap < 0 || mOriginalHeightGap < 0) {
int hSpace = widthSpecSize - getPaddingLeft() - getPaddingRight();
int vSpace = heightSpecSize - getPaddingTop() - getPaddingBottom();
int hSpace = widthSize - getPaddingLeft() - getPaddingRight();
int vSpace = heightSize - getPaddingTop() - getPaddingBottom();
int hFreeSpace = hSpace - (mCountX * mCellWidth);
int vFreeSpace = vSpace - (mCountY * mCellHeight);
mWidthGap = Math.min(mMaxGap, numWidthGaps > 0 ? (hFreeSpace / numWidthGaps) : 0);
mHeightGap = Math.min(mMaxGap,numHeightGaps > 0 ? (vFreeSpace / numHeightGaps) : 0);
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
mCountX);
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap,
mHeightGap, mCountX, mCountY);
} else {
mWidthGap = mOriginalWidthGap;
mHeightGap = mOriginalHeightGap;
}
// Initial values correspond to widthSpecMode == MeasureSpec.EXACTLY
if (widthSpecMode == MeasureSpec.AT_MOST) {
newWidth = getPaddingLeft() + getPaddingRight() + (mCountX * mCellWidth) +
((mCountX - 1) * mWidthGap);
newHeight = getPaddingTop() + getPaddingBottom() + (mCountY * mCellHeight) +
((mCountY - 1) * mHeightGap);
setMeasuredDimension(newWidth, newHeight);
}
int count = getChildCount();
int maxWidth = 0;
int maxHeight = 0;
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(newWidth - getPaddingLeft() -
@ -1041,8 +991,10 @@ public class CellLayout extends ViewGroup {
int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(newHeight - getPaddingTop() -
getPaddingBottom(), MeasureSpec.EXACTLY);
child.measure(childWidthMeasureSpec, childheightMeasureSpec);
maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
}
setMeasuredDimension(newWidth, newHeight);
setMeasuredDimension(maxWidth, maxHeight);
}
@Override
@ -1530,7 +1482,7 @@ public class CellLayout extends ViewGroup {
* matches exactly. Otherwise we find the best matching direction.
* @param occoupied The array which represents which cells in the CellLayout are occupied
* @param blockOccupied The array which represents which cells in the specified block (cellX,
* cellY, spanX, spanY) are occupied. This is used when try to move a group of views.
* cellY, spanX, spanY) are occupied. This is used when try to move a group of views.
* @param result Array in which to place the result, or null (in which case a new array will
* be allocated)
* @return The X, Y cell of a vacant area that can contain this object,
@ -2003,7 +1955,7 @@ public class CellLayout extends ViewGroup {
private boolean attemptPushInDirection(ArrayList<View> intersectingViews, Rect occupied,
int[] direction, View ignoreView, ItemConfiguration solution) {
if ((Math.abs(direction[0]) + Math.abs(direction[1])) > 1) {
// If the direction vector has two non-zero components, we try pushing
// If the direction vector has two non-zero components, we try pushing
// separately in each of the components.
int temp = direction[1];
direction[1] = 0;
@ -2044,7 +1996,7 @@ public class CellLayout extends ViewGroup {
direction[0] = temp;
direction[0] *= -1;
direction[1] *= -1;
} else {
// If the direction vector has a single non-zero component, we push first in the
// direction of the vector
@ -2062,8 +2014,8 @@ public class CellLayout extends ViewGroup {
// Switch the direction back
direction[0] *= -1;
direction[1] *= -1;
// If we have failed to find a push solution with the above, then we try
// If we have failed to find a push solution with the above, then we try
// to find a solution by pushing along the perpendicular axis.
// Swap the components
@ -2125,7 +2077,7 @@ public class CellLayout extends ViewGroup {
}
}
// First we try to find a solution which respects the push mechanic. That is,
// First we try to find a solution which respects the push mechanic. That is,
// we try to find a solution such that no displaced item travels through another item
// without also displacing that item.
if (attemptPushInDirection(mIntersectingViews, mOccupiedRect, direction, ignoreView,
@ -3013,10 +2965,13 @@ public class CellLayout extends ViewGroup {
}
public static int[] rectToCell(Resources resources, int width, int height, int[] result) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
// Always assume we're working with the smallest span to make sure we
// reserve enough space in both orientations.
int actualWidth = resources.getDimensionPixelSize(R.dimen.workspace_cell_width);
int actualHeight = resources.getDimensionPixelSize(R.dimen.workspace_cell_height);
int actualWidth = grid.cellWidthPx;
int actualHeight = grid.cellHeightPx;
int smallerSize = Math.min(actualWidth, actualHeight);
// Always round up to next largest cell

View File

@ -90,13 +90,15 @@ public class Cling extends FrameLayout {
mPositionData = positionData;
Resources r = getContext().getResources();
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
mPunchThroughGraphic = r.getDrawable(R.drawable.cling);
mPunchThroughGraphicCenterRadius =
r.getDimensionPixelSize(R.dimen.clingPunchThroughGraphicCenterRadius);
mAppIconSize = r.getDimensionPixelSize(R.dimen.app_icon_size);
mRevealRadius = r.getDimensionPixelSize(R.dimen.reveal_radius) * 1f;
mButtonBarHeight = r.getDimensionPixelSize(R.dimen.button_bar_height);
mAppIconSize = grid.iconSizePx;
mRevealRadius = grid.iconSizePx * 1f;
mButtonBarHeight = grid.hotseatBarHeightPx;
mErasePaint = new Paint();
mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));

View File

@ -28,11 +28,7 @@ import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.*;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.DecelerateInterpolator;
@ -503,6 +499,7 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang
toX -= (dragView.getMeasuredWidth() - Math.round(scale * child.getMeasuredWidth())) / 2;
} else if (child instanceof FolderIcon) {
// Account for holographic blur padding on the drag view
toY += Math.round(scale * (child.getPaddingTop() - dragView.getDragRegionTop()));
toY -= scale * Workspace.DRAG_BITMAP_PADDING / 2;
toY -= (1 - scale) * dragView.getMeasuredHeight() / 2;
// Center in the x coordinate about the target's drawable

View File

@ -0,0 +1,478 @@
/*
* Copyright (C) 2008 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.
*/
package com.android.launcher3;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Paint.FontMetrics;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class DeviceProfileQuery {
float widthDps;
float heightDps;
float value;
PointF dimens;
DeviceProfileQuery(float w, float h, float v) {
widthDps = w;
heightDps = h;
value = v;
dimens = new PointF(w, h);
}
}
class DeviceProfile {
String name;
float minWidthDps;
float minHeightDps;
float numRows;
float numColumns;
float iconSize;
float iconTextSize;
float numHotseatIcons;
float hotseatIconSize;
boolean isLandscape;
boolean isTablet;
boolean isLargeTablet;
boolean transposeLayoutWithOrientation;
int edgeMarginPx;
int widthPx;
int heightPx;
int iconSizePx;
int iconTextSizePx;
int cellWidthPx;
int cellHeightPx;
int folderBackgroundOffset;
int folderIconSizePx;
int folderCellWidthPx;
int folderCellHeightPx;
int hotseatCellWidthPx;
int hotseatCellHeightPx;
int hotseatIconSizePx;
int hotseatBarHeightPx;
int searchBarSpaceWidthPx;
int searchBarSpaceMaxWidthPx;
int searchBarSpaceHeightPx;
int searchBarHeightPx;
int pageIndicatorHeightPx;
DeviceProfile(String n, float w, float h, float r, float c,
float is, float its, float hs, float his) {
name = n;
minWidthDps = w;
minHeightDps = h;
numRows = r;
numColumns = c;
iconSize = is;
iconTextSize = its;
numHotseatIcons = hs;
hotseatIconSize = his;
}
DeviceProfile(ArrayList<DeviceProfile> profiles,
float minWidth, int minWidthPx,
float minHeight, int minHeightPx,
int wPx, int hPx,
Resources resources) {
DisplayMetrics dm = resources.getDisplayMetrics();
ArrayList<DeviceProfileQuery> points =
new ArrayList<DeviceProfileQuery>();
transposeLayoutWithOrientation =
resources.getBoolean(R.bool.hotseat_transpose_layout_with_orientation);
updateFromConfiguration(resources, wPx, hPx);
minWidthDps = minWidth;
minHeightDps = minHeight;
edgeMarginPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);
pageIndicatorHeightPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_page_indicator_height);
// Interpolate the rows
for (DeviceProfile p : profiles) {
points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.numRows));
}
numRows = Math.round(invDistWeightedInterpolate(minWidth, minHeight, points));
// Interpolate the columns
points.clear();
for (DeviceProfile p : profiles) {
points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.numColumns));
}
numColumns = Math.round(invDistWeightedInterpolate(minWidth, minHeight, points));
// Interpolate the icon size
points.clear();
for (DeviceProfile p : profiles) {
points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.iconSize));
}
iconSize = invDistWeightedInterpolate(minWidth, minHeight, points);
iconSizePx = (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
iconSize, dm));
// Interpolate the icon text size
points.clear();
for (DeviceProfile p : profiles) {
points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.iconTextSize));
}
iconTextSize = invDistWeightedInterpolate(minWidth, minHeight, points);
iconTextSizePx = (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
iconTextSize, dm));
// Interpolate the hotseat size
points.clear();
for (DeviceProfile p : profiles) {
points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.numHotseatIcons));
}
numHotseatIcons = Math.round(invDistWeightedInterpolate(minWidth, minHeight, points));
// Interpolate the hotseat icon size
points.clear();
for (DeviceProfile p : profiles) {
points.add(new DeviceProfileQuery(p.minWidthDps, p.minHeightDps, p.hotseatIconSize));
}
// Hotseat
hotseatIconSize = invDistWeightedInterpolate(minWidth, minHeight, points);
hotseatIconSizePx = (int) Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
hotseatIconSize, dm));
hotseatBarHeightPx = iconSizePx + 4 * edgeMarginPx;
hotseatCellWidthPx = iconSizePx;
hotseatCellHeightPx = iconSizePx;
// Search Bar
searchBarSpaceMaxWidthPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_max_width);
searchBarHeightPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_height);
searchBarSpaceWidthPx = Math.min(searchBarSpaceMaxWidthPx, widthPx);
searchBarSpaceHeightPx = searchBarHeightPx + 2 * edgeMarginPx;
// Calculate the actual text height
Paint textPaint = new Paint();
textPaint.setTextSize(iconTextSizePx);
FontMetrics fm = textPaint.getFontMetrics();
cellWidthPx = iconSizePx;
cellHeightPx = iconSizePx + (int) Math.ceil(fm.bottom - fm.top);
// Folder
folderCellWidthPx = cellWidthPx + 3 * edgeMarginPx;
folderCellHeightPx = cellHeightPx + edgeMarginPx;
folderBackgroundOffset = -edgeMarginPx;
folderIconSizePx = iconSizePx + 2 * -folderBackgroundOffset;
}
void updateFromConfiguration(Resources resources, int wPx, int hPx) {
isLandscape = (resources.getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE);
isTablet = resources.getBoolean(R.bool.is_tablet);
isLargeTablet = resources.getBoolean(R.bool.is_large_tablet);
widthPx = wPx;
heightPx = hPx;
}
private float dist(PointF p0, PointF p1) {
return (float) Math.sqrt((p1.x - p0.x)*(p1.x-p0.x) +
(p1.y-p0.y)*(p1.y-p0.y));
}
private float weight(PointF a, PointF b,
float pow) {
float d = dist(a, b);
if (d == 0f) {
return Float.POSITIVE_INFINITY;
}
return (float) (1f / Math.pow(d, pow));
}
private float invDistWeightedInterpolate(float width, float height,
ArrayList<DeviceProfileQuery> points) {
float sum = 0;
float weights = 0;
float pow = 5;
float kNearestNeighbors = 3;
final PointF xy = new PointF(width, height);
ArrayList<DeviceProfileQuery> pointsByNearness = points;
Collections.sort(pointsByNearness, new Comparator<DeviceProfileQuery>() {
public int compare(DeviceProfileQuery a, DeviceProfileQuery b) {
return (int) (dist(xy, a.dimens) - dist(xy, b.dimens));
}
});
for (int i = 0; i < pointsByNearness.size(); ++i) {
DeviceProfileQuery p = pointsByNearness.get(i);
if (i < kNearestNeighbors) {
float w = weight(xy, p.dimens, pow);
if (w == Float.POSITIVE_INFINITY) {
return p.value;
}
weights += w;
}
}
for (int i = 0; i < pointsByNearness.size(); ++i) {
DeviceProfileQuery p = pointsByNearness.get(i);
if (i < kNearestNeighbors) {
float w = weight(xy, p.dimens, pow);
sum += w * p.value / weights;
}
}
return sum;
}
Rect getWorkspacePadding(int orientation) {
Rect padding = new Rect();
if (orientation == CellLayout.LANDSCAPE &&
transposeLayoutWithOrientation) {
// Pad the left and right of the workspace with search/hotseat bar sizes
padding.set(searchBarSpaceHeightPx, edgeMarginPx,
hotseatBarHeightPx, edgeMarginPx);
} else {
if (isTablet()) {
// Pad the left and right of the workspace to ensure consistent spacing
// between all icons
int width = (orientation == CellLayout.LANDSCAPE)
? Math.max(widthPx, heightPx)
: Math.min(widthPx, heightPx);
// XXX: If the icon size changes across orientations, we will have to take
// that into account here too.
int gap = (int) ((width - 2 * edgeMarginPx -
(numColumns * cellWidthPx)) / (2 * (numColumns + 1)));
padding.set(edgeMarginPx + gap,
searchBarSpaceHeightPx,
edgeMarginPx + gap,
hotseatBarHeightPx + pageIndicatorHeightPx);
} else {
// Pad the top and bottom of the workspace with search/hotseat bar sizes
padding.set(edgeMarginPx,
searchBarSpaceHeightPx,
edgeMarginPx,
hotseatBarHeightPx + pageIndicatorHeightPx);
}
}
return padding;
}
int calculateCellWidth(int width, int countX) {
return width / countX;
}
int calculateCellHeight(int height, int countY) {
return height / countY;
}
boolean isTablet() {
return isTablet;
}
boolean isLargeTablet() {
return isLargeTablet;
}
public void layout(Launcher launcher) {
FrameLayout.LayoutParams lp;
Resources res = launcher.getResources();
boolean hasVerticalBarLayout = isLandscape &&
res.getBoolean(R.bool.hotseat_transpose_layout_with_orientation);
// Layout the search bar space
View searchBarSpace = launcher.findViewById(R.id.qsb_bar);
lp = (FrameLayout.LayoutParams) searchBarSpace.getLayoutParams();
if (hasVerticalBarLayout) {
// Vertical search bar
lp.gravity = Gravity.TOP | Gravity.LEFT;
lp.width = searchBarSpaceHeightPx;
lp.height = LayoutParams.MATCH_PARENT;
searchBarSpace.setPadding(
0, 2 * edgeMarginPx, 0,
2 * edgeMarginPx);
} else {
// Horizontal search bar
lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
lp.width = searchBarSpaceWidthPx;
lp.height = searchBarSpaceHeightPx;
searchBarSpace.setPadding(
2 * edgeMarginPx,
2 * edgeMarginPx,
2 * edgeMarginPx, 0);
}
searchBarSpace.setLayoutParams(lp);
// Layout the search bar
View searchBar = searchBarSpace.findViewById(R.id.qsb_search_bar);
lp = (FrameLayout.LayoutParams) searchBar.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
lp.height = LayoutParams.MATCH_PARENT;
searchBar.setLayoutParams(lp);
// Layout the voice proxy
View voiceButtonProxy = launcher.findViewById(R.id.voice_button_proxy);
if (voiceButtonProxy != null) {
if (hasVerticalBarLayout) {
// TODO: MOVE THIS INTO SEARCH BAR MEASURE
} else {
lp = (FrameLayout.LayoutParams) voiceButtonProxy.getLayoutParams();
lp.gravity = Gravity.TOP | Gravity.END;
lp.width = (widthPx - searchBarSpaceWidthPx) / 2 +
2 * iconSizePx;
lp.height = searchBarSpaceHeightPx;
}
}
// Layout the workspace
View workspace = launcher.findViewById(R.id.workspace);
lp = (FrameLayout.LayoutParams) workspace.getLayoutParams();
lp.gravity = Gravity.CENTER;
Rect padding = getWorkspacePadding(isLandscape
? CellLayout.LANDSCAPE
: CellLayout.PORTRAIT);
workspace.setPadding(padding.left, padding.top,
padding.right, padding.bottom);
workspace.setLayoutParams(lp);
// Layout the hotseat
View hotseat = launcher.findViewById(R.id.hotseat);
lp = (FrameLayout.LayoutParams) hotseat.getLayoutParams();
if (hasVerticalBarLayout) {
// Vertical hotseat
lp.gravity = Gravity.RIGHT;
lp.width = hotseatBarHeightPx;
lp.height = LayoutParams.MATCH_PARENT;
hotseat.setPadding(0, 2 * edgeMarginPx,
2 * edgeMarginPx, 2 * edgeMarginPx);
} else if (isTablet()) {
// Pad the hotseat with the grid gap calculated above
int gridGap = (int) ((widthPx - 2 * edgeMarginPx -
(numColumns * cellWidthPx)) / (2 * (numColumns + 1)));
int gridWidth = (int) ((numColumns * cellWidthPx) +
((numColumns - 1) * gridGap));
int hotseatGap = (int) Math.max(0,
(gridWidth - (numHotseatIcons * hotseatCellWidthPx))
/ (numHotseatIcons - 1));
lp.gravity = Gravity.BOTTOM;
lp.width = LayoutParams.MATCH_PARENT;
lp.height = hotseatBarHeightPx;
hotseat.setPadding(2 * edgeMarginPx + gridGap + hotseatGap, 0,
2 * edgeMarginPx + gridGap + hotseatGap,
2 * edgeMarginPx);
} else {
// For phones, layout the hotseat without any bottom margin
// to ensure that we have space for the folders
lp.gravity = Gravity.BOTTOM;
lp.width = LayoutParams.MATCH_PARENT;
lp.height = hotseatBarHeightPx;
hotseat.setPadding(2 * edgeMarginPx, 0,
2 * edgeMarginPx, 0);
}
hotseat.setLayoutParams(lp);
// Layout the page indicators
View pageIndicator = launcher.findViewById(R.id.page_indicator);
if (pageIndicator != null) {
if (hasVerticalBarLayout) {
// Hide the page indicators when we have vertical search/hotseat
pageIndicator.setVisibility(View.GONE);
} else {
// Put the page indicators above the hotseat
lp = (FrameLayout.LayoutParams) pageIndicator.getLayoutParams();
lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
lp.width = LayoutParams.WRAP_CONTENT;
lp.height = pageIndicatorHeightPx;
lp.bottomMargin = hotseatBarHeightPx;
pageIndicator.setLayoutParams(lp);
}
}
}
}
public class DynamicGrid {
@SuppressWarnings("unused")
private static final String TAG = "DynamicGrid";
private DeviceProfile mProfile;
private float mMinWidth;
private float mMinHeight;
public static int dpiFromPx(int size, DisplayMetrics metrics){
float densityRatio = (float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT;
return (int) Math.round(size / densityRatio);
}
public DynamicGrid(Resources resources, int minWidthPx, int minHeightPx,
int widthPx, int heightPx) {
DisplayMetrics dm = resources.getDisplayMetrics();
ArrayList<DeviceProfile> deviceProfiles =
new ArrayList<DeviceProfile>();
// Our phone profiles include the bar sizes in each orientation
deviceProfiles.add(new DeviceProfile("Super Short Stubby",
255, 300, 2, 3, 48, 12, 4, 48));
deviceProfiles.add(new DeviceProfile("Shorter Stubby",
255, 400, 3, 3, 48, 12, 4, 48));
deviceProfiles.add(new DeviceProfile("Short Stubby",
275, 420, 3, 4, 48, 12, 4, 48));
deviceProfiles.add(new DeviceProfile("Stubby",
255, 450, 3, 4, 48, 12, 4, 48));
deviceProfiles.add(new DeviceProfile("Nexus S",
296, 491.33f, 4, 4, 48, 12, 4, 48));
deviceProfiles.add(new DeviceProfile("Nexus 4",
359, 518, 4, 4, 60, 12, 5, 56));
// The tablet profile is odd in that the landscape orientation
// also includes the nav bar on the side
deviceProfiles.add(new DeviceProfile("Nexus 7",
575, 904, 6, 6, 72, 14.4f, 7, 60));
// Larger tablet profiles always have system bars on the top & bottom
deviceProfiles.add(new DeviceProfile("Nexus 10",
727, 1207, 5, 8, 80, 14.4f, 9, 64));
/*
deviceProfiles.add(new DeviceProfile("Nexus 7",
600, 960, 5, 5, 72, 14.4f, 5, 60));
deviceProfiles.add(new DeviceProfile("Nexus 10",
800, 1280, 5, 5, 80, 14.4f, 6, 64));
*/
deviceProfiles.add(new DeviceProfile("20-inch Tablet",
1527, 2527, 7, 7, 100, 20, 7, 72));
mMinWidth = dpiFromPx(minWidthPx, dm);
mMinHeight = dpiFromPx(minHeightPx, dm);
mProfile = new DeviceProfile(deviceProfiles,
mMinWidth, minWidthPx,
mMinHeight, minHeightPx,
widthPx, heightPx,
resources);
}
DeviceProfile getDeviceProfile() {
return mProfile;
}
public String toString() {
return "-------- DYNAMIC GRID ------- \n" +
"Wd: " + mProfile.minWidthDps + ", Hd: " + mProfile.minHeightDps +
", W: " + mProfile.widthPx + ", H: " + mProfile.heightPx +
" [r: " + mProfile.numRows + ", c: " + mProfile.numColumns +
", is: " + mProfile.iconSizePx + ", its: " + mProfile.iconTextSize +
", cw: " + mProfile.cellWidthPx + ", ch: " + mProfile.cellHeightPx +
", hc: " + mProfile.numHotseatIcons + ", his: " + mProfile.hotseatIconSizePx + "]";
}
}

View File

@ -138,39 +138,16 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
*/
public Folder(Context context, AttributeSet attrs) {
super(context, attrs);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
setAlwaysDrawnWithCacheEnabled(false);
mInflater = LayoutInflater.from(context);
mIconCache = (LauncherAppState.getInstance()).getIconCache();
mIconCache = app.getIconCache();
Resources res = getResources();
mMaxCountX = mMaxVisibleX = res.getInteger(R.integer.folder_max_count_x);
mMaxCountY = mMaxVisibleY = res.getInteger(R.integer.folder_max_count_y);
mMaxNumItems = res.getInteger(R.integer.folder_max_num_items);
if (mMaxCountY == -1) {
// -2 indicates unlimited
mMaxCountY = Integer.MAX_VALUE;
mMaxVisibleX = LauncherModel.getCellCountX() + 1;
}
if (mMaxNumItems == -1) {
// -2 indicates unlimited
mMaxNumItems = Integer.MAX_VALUE;
mMaxVisibleY = LauncherModel.getCellCountY() + 1;
}
if (mMaxCountX == 0) {
mMaxCountX = mMaxVisibleX = LauncherModel.getCellCountX();
mMaxVisibleX++;
}
if (mMaxCountY == 0) {
mMaxCountY = mMaxVisibleY = LauncherModel.getCellCountY();
mMaxVisibleY++;
}
if (mMaxNumItems == 0) {
mMaxNumItems = mMaxCountX * mMaxCountY;
if (mMaxNumItems < 0) {
mMaxNumItems = Integer.MAX_VALUE;
}
}
mMaxCountX = mMaxVisibleX = mMaxVisibleY = (int) (grid.numColumns);
mMaxCountY = mMaxNumItems = Integer.MAX_VALUE;
mInputMethodManager = (InputMethodManager)
getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
@ -196,10 +173,13 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
mScrollView = (ScrollView) findViewById(R.id.scroll_view);
mContent = (CellLayout) findViewById(R.id.folder_content);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
// Beyond this height, the area scrolls
mContent.setCellDimensions(grid.folderCellWidthPx, grid.folderCellHeightPx);
mContent.setGridSize(mMaxVisibleX, mMaxVisibleY);
mMaxContentAreaHeight = mContent.getDesiredHeight() - SCROLL_CUT_OFF_AMOUNT;
mContent.setGridSize(0, 0);
mContent.getShortcutsAndWidgets().setMotionEventSplittingEnabled(false);
mContent.setInvertIfRtl(true);
@ -535,13 +515,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
oa.start();
}
void notifyDataSetChanged() {
// recreate all the children if the data set changes under us. We may want to do this more
// intelligently (ie just removing the views that should no longer exist)
mContent.removeAllViewsInLayout();
bind(mInfo);
}
public boolean acceptDrop(DragObject d) {
final ItemInfo item = (ItemInfo) d.dragInfo;
final int itemType = item.itemType;
@ -764,6 +737,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
boolean beingCalledAfterUninstall = mDeferredAction != null;
boolean successfulDrop =
success && (!beingCalledAfterUninstall || mUninstallSuccessful);
if (successfulDrop) {
if (mDeleteFolderOnDropCompleted && !mItemAddedBackToSelfViaIcon) {
replaceFolderWithFinalItem();
@ -783,6 +757,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
completeDragExit();
}
}
mDeleteFolderOnDropCompleted = false;
mDragInProgress = false;
mItemAddedBackToSelfViaIcon = false;
@ -981,7 +956,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int contentAreaHeight = mContent.getDesiredHeight();
if (contentAreaHeight >= mMaxContentAreaHeight) {
// Subtract a bit so the user can see that it's scrollable.

View File

@ -132,10 +132,18 @@ public class FolderIcon extends LinearLayout implements FolderListener {
}
FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(resId, group, false);
icon.setClipToPadding(false);
icon.mFolderName = (BubbleTextView) icon.findViewById(R.id.folder_icon_name);
icon.mFolderName.setText(folderInfo.title);
icon.mPreviewBackground = (ImageView) icon.findViewById(R.id.preview_background);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
// Offset the preview background to center this view accordingly
LinearLayout.LayoutParams lp =
(LinearLayout.LayoutParams) icon.mPreviewBackground.getLayoutParams();
lp.topMargin = grid.folderBackgroundOffset;
lp.width = grid.folderIconSizePx;
lp.height = grid.folderIconSizePx;
icon.setTag(folderInfo);
icon.setOnClickListener(launcher);
@ -187,7 +195,10 @@ public class FolderIcon extends LinearLayout implements FolderListener {
throw new RuntimeException("FolderRingAnimator loading drawables on non-UI thread "
+ Thread.currentThread());
}
sPreviewSize = res.getDimensionPixelSize(R.dimen.folder_preview_size);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
sPreviewSize = grid.folderIconSizePx;
sPreviewPadding = res.getDimensionPixelSize(R.dimen.folder_preview_padding);
sSharedOuterRingDrawable = res.getDrawable(R.drawable.portal_ring_outer_holo);
sSharedInnerRingDrawable = res.getDrawable(R.drawable.portal_ring_inner_holo);
@ -392,7 +403,7 @@ public class FolderIcon extends LinearLayout implements FolderListener {
center[1] = (int) Math.round(scaleRelativeToDragLayer * center[1]);
to.offset(center[0] - animateView.getMeasuredWidth() / 2,
center[1] - animateView.getMeasuredHeight() / 2);
center[1] - animateView.getMeasuredHeight() / 2);
float finalAlpha = index < NUM_ITEMS_IN_PREVIEW ? 0.5f : 0f;
@ -430,10 +441,13 @@ public class FolderIcon extends LinearLayout implements FolderListener {
private void computePreviewDrawingParams(int drawableSize, int totalSize) {
if (mIntrinsicIconSize != drawableSize || mTotalWidth != totalSize) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
mIntrinsicIconSize = drawableSize;
mTotalWidth = totalSize;
final int previewSize = FolderRingAnimator.sPreviewSize;
final int previewSize = mPreviewBackground.getLayoutParams().height;
final int previewPadding = FolderRingAnimator.sPreviewPadding;
mAvailableSpaceInPreview = (previewSize - 2 * previewPadding);
@ -447,7 +461,7 @@ public class FolderIcon extends LinearLayout implements FolderListener {
mMaxPerspectiveShift = mBaselineIconSize * PERSPECTIVE_SHIFT_FACTOR;
mPreviewOffsetX = (mTotalWidth - mAvailableSpaceInPreview) / 2;
mPreviewOffsetY = previewPadding;
mPreviewOffsetY = previewPadding + grid.folderBackgroundOffset;
}
}
@ -494,7 +508,7 @@ public class FolderIcon extends LinearLayout implements FolderListener {
// We want to imagine our coordinates from the bottom left, growing up and to the
// right. This is natural for the x-axis, but for the y-axis, we have to invert things.
float transY = mAvailableSpaceInPreview - (offset + scaledSize + scaleOffsetCorrection);
float transY = mAvailableSpaceInPreview - (offset + scaledSize + scaleOffsetCorrection) + getPaddingTop();
float transX = offset + scaleOffsetCorrection;
float totalScale = mBaselineIconScale * scale;
final int overlayAlpha = (int) (80 * (1 - r));
@ -569,7 +583,7 @@ public class FolderIcon extends LinearLayout implements FolderListener {
final float scale0 = 1.0f;
final float transX0 = (mAvailableSpaceInPreview - d.getIntrinsicWidth()) / 2;
final float transY0 = (mAvailableSpaceInPreview - d.getIntrinsicHeight()) / 2;
final float transY0 = (mAvailableSpaceInPreview - d.getIntrinsicHeight()) / 2 + getPaddingTop();
mAnimParams.drawable = d;
ValueAnimator va = LauncherAnimUtils.ofFloat(this, 0f, 1.0f);

View File

@ -37,11 +37,8 @@ public class Hotseat extends FrameLayout {
@SuppressWarnings("unused")
private static final String TAG = "Hotseat";
private Launcher mLauncher;
private CellLayout mContent;
private int mCellCountX;
private int mCellCountY;
private int mAllAppsButtonRank;
private boolean mTransposeLayoutWithOrientation;
@ -61,9 +58,6 @@ public class Hotseat extends FrameLayout {
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.Hotseat, defStyle, 0);
Resources r = context.getResources();
mCellCountX = a.getInt(R.styleable.Hotseat_cellCountX, -1);
mCellCountY = a.getInt(R.styleable.Hotseat_cellCountY, -1);
mAllAppsButtonRank = r.getInteger(R.integer.hotseat_all_apps_index);
mTransposeLayoutWithOrientation =
r.getBoolean(R.bool.hotseat_transpose_layout_with_orientation);
mIsLandscape = context.getResources().getConfiguration().orientation ==
@ -71,7 +65,6 @@ public class Hotseat extends FrameLayout {
}
public void setup(Launcher launcher) {
mLauncher = launcher;
setOnKeyListener(new HotseatIconKeyEventListener());
}
@ -101,10 +94,16 @@ public class Hotseat extends FrameLayout {
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (mCellCountX < 0) mCellCountX = LauncherModel.getCellCountX();
if (mCellCountY < 0) mCellCountY = LauncherModel.getCellCountY();
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
mAllAppsButtonRank = (int) (grid.numHotseatIcons / 2);
mContent = (CellLayout) findViewById(R.id.layout);
mContent.setGridSize(mCellCountX, mCellCountY);
if (grid.isLandscape && !grid.isLargeTablet()) {
mContent.setGridSize(1, (int) grid.numHotseatIcons);
} else {
mContent.setGridSize((int) grid.numHotseatIcons, 1);
}
mContent.setIsHotseat(true);
resetLayout();

View File

@ -51,6 +51,7 @@ import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@ -199,7 +200,6 @@ public class Launcher extends Activity
private enum State { NONE, WORKSPACE, APPS_CUSTOMIZE, APPS_CUSTOMIZE_SPRING_LOADED };
private State mState = State.WORKSPACE;
private AnimatorSet mStateAnimation;
private AnimatorSet mDividerAnimator;
static final int APPWIDGET_HOST_ID = 1024;
private static final int EXIT_SPRINGLOADED_MODE_SHORT_TIMEOUT = 300;
@ -221,7 +221,6 @@ public class Launcher extends Activity
private LayoutInflater mInflater;
private Workspace mWorkspace;
private View mQsbDivider;
private View mLauncherView;
private DragLayer mDragLayer;
private DragController mDragController;
@ -372,9 +371,23 @@ public class Launcher extends Activity
super.onCreate(savedInstanceState);
// the LauncherApplication should call this, but in case of Instrumentation it might not be present yet
LauncherAppState.setApplicationContext(getApplicationContext());
LauncherAppState app = LauncherAppState.getInstance();
// Determine the dynamic grid properties
Point smallestSize = new Point();
Point largestSize = new Point();
Point realSize = new Point();
Display display = getWindowManager().getDefaultDisplay();
display.getCurrentSizeRange(smallestSize, largestSize);
display.getRealSize(realSize);
// Lazy-initialize the dynamic grid
DeviceProfile grid = app.initDynamicGrid(this,
Math.min(smallestSize.x, smallestSize.y),
Math.min(largestSize.x, largestSize.y),
realSize.x, realSize.y);
// the LauncherApplication should call this, but in case of Instrumentation it might not be present yet
mSharedPrefs = getSharedPreferences(LauncherAppState.getSharedPreferencesKey(),
Context.MODE_PRIVATE);
mModel = app.setLauncher(this);
@ -400,6 +413,7 @@ public class Launcher extends Activity
checkForLocaleChange();
setContentView(R.layout.launcher);
grid.layout(this);
setupViews();
showFirstRunWorkspaceCling();
@ -1061,7 +1075,6 @@ public class Launcher extends Activity
mLauncherView = findViewById(R.id.launcher);
mDragLayer = (DragLayer) findViewById(R.id.drag_layer);
mWorkspace = (Workspace) mDragLayer.findViewById(R.id.workspace);
mQsbDivider = findViewById(R.id.qsb_divider);
mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
mWorkspaceBackgroundDrawable = getResources().getDrawable(R.drawable.workspace_bg);
@ -2014,6 +2027,9 @@ public class Launcher extends Activity
FolderIcon.fromXml(R.layout.folder_icon, this, layout, folderInfo, mIconCache);
mWorkspace.addInScreen(newFolder, container, screenId, cellX, cellY, 1, 1,
isWorkspaceLocked());
// Force measure the new folder icon
CellLayout parent = mWorkspace.getParentCellLayoutForView(newFolder);
parent.getShortcutsAndWidgets().measureChild(newFolder);
return newFolder;
}
@ -2784,11 +2800,6 @@ public class Launcher extends Activity
dispatchOnLauncherTransitionEnd(fromView, animated, false);
dispatchOnLauncherTransitionEnd(toView, animated, false);
if (mWorkspace != null
&& !springLoaded
&& !LauncherAppState.getInstance().isScreenLarge()) {
hideDockDivider();
}
if (!animationCancelled) {
updateWallpaperVisibility(false);
}
@ -2855,8 +2866,6 @@ public class Launcher extends Activity
toView.bringToFront();
if (!springLoaded && !LauncherAppState.getInstance().isScreenLarge()) {
hideDockDivider();
// Hide the search bar
if (mSearchDropTargetBar != null) {
mSearchDropTargetBar.hideSearchBar(false);
@ -3008,9 +3017,6 @@ public class Launcher extends Activity
mSearchDropTargetBar.showSearchBar(wasInSpringLoadedMode);
}
// We only need to animate in the dock divider if we're going from spring loaded mode
showDockDivider(animated && wasInSpringLoadedMode);
// Set focus to the AppsCustomize button
if (mAllAppsButton != null) {
mAllAppsButton.requestFocus();
@ -3056,7 +3062,6 @@ public class Launcher extends Activity
void enterSpringLoadedDragMode() {
if (isAllAppsVisible()) {
hideAppsCustomizeHelper(State.APPS_CUSTOMIZE_SPRING_LOADED, true, true, null);
hideDockDivider();
mState = State.APPS_CUSTOMIZE_SPRING_LOADED;
}
}
@ -3093,33 +3098,6 @@ public class Launcher extends Activity
// Otherwise, we are not in spring loaded mode, so don't do anything.
}
void hideDockDivider() {
if (mQsbDivider != null) {
mQsbDivider.setVisibility(View.INVISIBLE);
}
}
void showDockDivider(boolean animated) {
if (mQsbDivider != null) {
mQsbDivider.setVisibility(View.VISIBLE);
if (mDividerAnimator != null) {
mDividerAnimator.cancel();
mQsbDivider.setAlpha(1f);
mDividerAnimator = null;
}
if (animated) {
mDividerAnimator = LauncherAnimUtils.createAnimatorSet();
mDividerAnimator.playTogether(LauncherAnimUtils.ofFloat(mQsbDivider, "alpha", 1f));
int duration = 0;
if (mSearchDropTargetBar != null) {
duration = mSearchDropTargetBar.getTransitionInDuration();
}
mDividerAnimator.setDuration(duration);
mDividerAnimator.start();
}
}
}
void lockAllApps() {
// TODO
}

View File

@ -21,11 +21,14 @@ import android.content.*;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.os.Handler;
import android.provider.Settings;
import android.util.Log;
import android.view.Display;
import java.lang.ref.WeakReference;
public class LauncherAppState {
private static final String TAG = "LauncherAppState";
private static final String SHARED_PREFERENCES_KEY = "com.android.launcher3.prefs";
private LauncherModel mModel;
@ -41,6 +44,8 @@ public class LauncherAppState {
private static Object mLock = new Object();
private static LauncherAppState INSTANCE;
private DynamicGrid mDynamicGrid;
public static LauncherAppState getInstance() {
if (INSTANCE == null) {
INSTANCE = new LauncherAppState();
@ -71,7 +76,7 @@ public class LauncherAppState {
}
// set sIsScreenXLarge and mScreenDensity *before* creating icon cache
mIsScreenLarge = sContext.getResources().getBoolean(R.bool.is_large_screen);
mIsScreenLarge = sContext.getResources().getBoolean(R.bool.is_large_tablet);
mScreenDensity = sContext.getResources().getDisplayMetrics().density;
mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
@ -158,6 +163,27 @@ public class LauncherAppState {
return SHARED_PREFERENCES_KEY;
}
DeviceProfile initDynamicGrid(Context context, int minWidth, int minHeight, int width, int height) {
boolean created = false;
if (mDynamicGrid == null) {
mDynamicGrid = new DynamicGrid(context.getResources(),
minWidth, minHeight, width, height);
created = true;
}
DeviceProfile grid = mDynamicGrid.getDeviceProfile();
if (created) {
LauncherModel.updateWorkspaceLayoutCells((int) grid.numColumns, (int) grid.numRows);
}
// Update the icon size
Utilities.setIconSize(grid.iconSizePx);
grid.updateFromConfiguration(context.getResources(), width, height);
return grid;
}
DynamicGrid getDynamicGrid() {
return mDynamicGrid;
}
public boolean isScreenLarge() {
return mIsScreenLarge;
}

View File

@ -18,6 +18,7 @@ package com.android.launcher3;
import android.appwidget.AppWidgetHostView;
import android.content.Context;
import android.graphics.Canvas;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;

View File

@ -1556,6 +1556,11 @@ public class LauncherModel extends BroadcastReceiver {
}
}
private boolean checkItemDimensions(ItemInfo info) {
return (info.cellX + info.spanX) > mCellCountX ||
(info.cellY + info.spanY) > mCellCountY;
}
// check & update map of what's occupied; used to discard overlapping/invalid items
private boolean checkItemPlacement(HashMap<Long, ItemInfo[][]> occupied, ItemInfo item) {
long containerIndex = item.screenId;
@ -1743,6 +1748,16 @@ public class LauncherModel extends BroadcastReceiver {
info.screenId = c.getInt(screenIndex);
info.cellX = c.getInt(cellXIndex);
info.cellY = c.getInt(cellYIndex);
info.spanX = 1;
info.spanY = 1;
// Skip loading items that are out of bounds
if (container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {
if (checkItemDimensions(info)) {
Log.d(TAG, "Skipped loading out of bounds shortcut: "
+ info.intent);
continue;
}
}
// check & update map of what's occupied
if (!checkItemPlacement(occupied, info)) {
break;
@ -1781,11 +1796,22 @@ public class LauncherModel extends BroadcastReceiver {
folderInfo.screenId = c.getInt(screenIndex);
folderInfo.cellX = c.getInt(cellXIndex);
folderInfo.cellY = c.getInt(cellYIndex);
folderInfo.spanX = 1;
folderInfo.spanY = 1;
// Skip loading items that are out of bounds
if (container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {
int iconSpan = 1;
if (checkItemDimensions(folderInfo)) {
Log.d(TAG, "Skipped loading out of bounds folder");
continue;
}
}
// check & update map of what's occupied
if (!checkItemPlacement(occupied, folderInfo)) {
break;
}
switch (container) {
case LauncherSettings.Favorites.CONTAINER_DESKTOP:
case LauncherSettings.Favorites.CONTAINER_HOTSEAT:
@ -1834,6 +1860,13 @@ public class LauncherModel extends BroadcastReceiver {
}
appWidgetInfo.container = c.getInt(containerIndex);
// Skip loading items that are out of bounds
if (container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {
if (checkItemDimensions(appWidgetInfo)) {
Log.d(TAG, "Skipped loading out of bounds app widget");
continue;
}
}
// check & update map of what's occupied
if (!checkItemPlacement(occupied, appWidgetInfo)) {
break;

View File

@ -963,8 +963,6 @@ public class LauncherProvider extends ContentProvider {
ContentValues values = new ContentValues();
PackageManager packageManager = mContext.getPackageManager();
int allAppsButtonRank =
mContext.getResources().getInteger(R.integer.hotseat_all_apps_index);
int i = 0;
try {
XmlResourceParser parser = mContext.getResources().getXml(workspaceResourceId);
@ -995,14 +993,6 @@ public class LauncherProvider extends ContentProvider {
String x = a.getString(R.styleable.Favorite_x);
String y = a.getString(R.styleable.Favorite_y);
// If we are adding to the hotseat, the screen is used as the position in the
// hotseat. This screen can't be at position 0 because AllApps is in the
// zeroth position.
if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT
&& Integer.valueOf(screen) == allAppsButtonRank) {
throw new RuntimeException("Invalid screen position for hotseat item");
}
values.clear();
values.put(LauncherSettings.Favorites.CONTAINER, container);
values.put(LauncherSettings.Favorites.SCREEN, screen);

View File

@ -59,11 +59,11 @@ public class PagedViewCellLayout extends ViewGroup implements Page {
setAlwaysDrawnWithCacheEnabled(false);
// setup default cell parameters
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
Resources resources = context.getResources();
mOriginalCellWidth = mCellWidth =
resources.getDimensionPixelSize(R.dimen.apps_customize_cell_width);
mOriginalCellHeight = mCellHeight =
resources.getDimensionPixelSize(R.dimen.apps_customize_cell_height);
mOriginalCellWidth = mCellWidth = grid.cellWidthPx;
mOriginalCellHeight = mCellHeight = grid.cellHeightPx;
mCellCountX = LauncherModel.getCellCountX();
mCellCountY = LauncherModel.getCellCountY();
mOriginalWidthGap = mOriginalHeightGap = mWidthGap = mHeightGap = -1;

View File

@ -99,7 +99,6 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D
mDropTargetBar = findViewById(R.id.drag_target_bar);
mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
mBarHeight = getResources().getDimensionPixelSize(R.dimen.qsb_bar_height);
mInfoDropTarget.setSearchDropTargetBar(this);
mDeleteDropTarget.setSearchDropTargetBar(this);
@ -109,6 +108,9 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D
// Create the various fade animations
if (mEnableDropDownDropTargets) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
mBarHeight = grid.searchBarSpaceHeightPx;
mDropTargetBar.setTranslationY(-mBarHeight);
mDropTargetBarAnim = LauncherAnimUtils.ofFloat(mDropTargetBar, "translationY",
-mBarHeight, 0f);

View File

@ -33,6 +33,8 @@ public class ShortcutAndWidgetContainer extends ViewGroup {
private final WallpaperManager mWallpaperManager;
private boolean mIsHotseatLayout;
private int mCellWidth;
private int mCellHeight;
@ -40,6 +42,7 @@ public class ShortcutAndWidgetContainer extends ViewGroup {
private int mHeightGap;
private int mCountX;
private int mCountY;
private boolean mInvertIfRtl = false;
@ -49,12 +52,13 @@ public class ShortcutAndWidgetContainer extends ViewGroup {
}
public void setCellDimensions(int cellWidth, int cellHeight, int widthGap, int heightGap,
int countX) {
int countX, int countY) {
mCellWidth = cellWidth;
mCellHeight = cellHeight;
mWidthGap = widthGap;
mHeightGap = heightGap;
mCountX = countX;
mCountY = countY;
}
public View getChildAt(int x, int y) {
@ -113,13 +117,28 @@ public class ShortcutAndWidgetContainer extends ViewGroup {
mInvertIfRtl = invert;
}
public void setIsHotseat(boolean isHotseat) {
mIsHotseatLayout = isHotseat;
}
public void measureChild(View child) {
final LauncherAppState app = LauncherAppState.getInstance();
final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
final int cellWidth = mCellWidth;
final int cellHeight = mCellHeight;
CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
if (!lp.isFullscreen) {
lp.setup(cellWidth, cellHeight, mWidthGap, mHeightGap, invertLayoutHorizontally(),
mCountX);
if (child instanceof LauncherAppWidgetHostView) {
// Widgets have their own padding, so skip
} else {
// Otherwise, center the icon
int cHeight = mIsHotseatLayout ? grid.hotseatCellHeightPx : Math.min(getMeasuredHeight(), grid.cellHeightPx);
int cellPaddingY = (int) Math.max(0, ((lp.height - cHeight) / 2f));
child.setPadding(0, cellPaddingY, 0, 0);
}
} else {
lp.x = 0;
lp.y = 0;
@ -142,12 +161,14 @@ public class ShortcutAndWidgetContainer extends ViewGroup {
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getVisibility() != GONE) {
CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
int childLeft = lp.x;
int childTop = lp.y;
child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height);

View File

@ -120,19 +120,12 @@ final class Utilities {
int sourceWidth = icon.getIntrinsicWidth();
int sourceHeight = icon.getIntrinsicHeight();
if (sourceWidth > 0 && sourceHeight > 0) {
// There are intrinsic sizes.
if (width < sourceWidth || height < sourceHeight) {
// It's too big, scale it down.
final float ratio = (float) sourceWidth / sourceHeight;
if (sourceWidth > sourceHeight) {
height = (int) (width / ratio);
} else if (sourceHeight > sourceWidth) {
width = (int) (height * ratio);
}
} else if (sourceWidth < width && sourceHeight < height) {
// Don't scale up the icon
width = sourceWidth;
height = sourceHeight;
// Scale the icon proportionally to the icon dimensions
final float ratio = (float) sourceWidth / sourceHeight;
if (sourceWidth > sourceHeight) {
height = (int) (width / ratio);
} else if (sourceHeight > sourceWidth) {
width = (int) (height * ratio);
}
}
@ -169,34 +162,8 @@ final class Utilities {
}
}
static void drawSelectedAllAppsBitmap(Canvas dest, int destWidth, int destHeight,
boolean pressed, Bitmap src) {
synchronized (sCanvas) { // we share the statics :-(
if (sIconWidth == -1) {
// We can't have gotten to here without src being initialized, which
// comes from this file already. So just assert.
//initStatics(context);
throw new RuntimeException("Assertion failed: Utilities not initialized");
}
dest.drawColor(0, PorterDuff.Mode.CLEAR);
int[] xy = new int[2];
Bitmap mask = src.extractAlpha(sBlurPaint, xy);
float px = (destWidth - src.getWidth()) / 2;
float py = (destHeight - src.getHeight()) / 2;
dest.drawBitmap(mask, px + xy[0], py + xy[1],
pressed ? sGlowColorPressedPaint : sGlowColorFocusedPaint);
mask.recycle();
}
}
/**
* Returns a Bitmap representing the thumbnail of the specified Bitmap.
* The size of the thumbnail is defined by the dimension
* android.R.dimen.launcher_application_icon_size.
*
* @param bitmap The bitmap to get a thumbnail of.
* @param context The application's context.
@ -219,24 +186,6 @@ final class Utilities {
}
}
static Bitmap drawDisabledBitmap(Bitmap bitmap, Context context) {
synchronized (sCanvas) { // we share the statics :-(
if (sIconWidth == -1) {
initStatics(context);
}
final Bitmap disabled = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Bitmap.Config.ARGB_8888);
final Canvas canvas = sCanvas;
canvas.setBitmap(disabled);
canvas.drawBitmap(bitmap, 0.0f, 0.0f, sDisabledPaint);
canvas.setBitmap(null);
return disabled;
}
}
/**
* Given a coordinate relative to the descendant, find the coordinate in a parent view's
* coordinates.
@ -345,26 +294,8 @@ final class Utilities {
sDisabledPaint.setAlpha(0x88);
}
/** Only works for positive numbers. */
static int roundToPow2(int n) {
int orig = n;
n >>= 1;
int mask = 0x8000000;
while (mask != 0 && (n & mask) == 0) {
mask >>= 1;
}
while (mask != 0) {
n |= mask;
mask >>= 1;
}
n += 1;
if (n != orig) {
n <<= 1;
}
return n;
}
static int generateRandomId() {
return new Random(System.currentTimeMillis()).nextInt(1 << 24);
public static void setIconSize(int widthPx) {
sIconWidth = sIconHeight = widthPx;
sIconTextureWidth = sIconTextureHeight = widthPx;
}
}

View File

@ -138,10 +138,12 @@ public class WidgetPreviewLoader {
}
public WidgetPreviewLoader(Launcher launcher) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
mContext = mLauncher = launcher;
mPackageManager = mContext.getPackageManager();
mAppIconSize = mContext.getResources().getDimensionPixelSize(R.dimen.app_icon_size);
LauncherAppState app = LauncherAppState.getInstance();
mAppIconSize = grid.iconSizePx;
mIconCache = app.getIconCache();
mDb = app.getWidgetPreviewCacheDb();
mLoadedPreviews = new HashMap<String, WeakReference<Bitmap>>();

View File

@ -164,9 +164,6 @@ public class Workspace extends SmoothPagedView
private float mSpringLoadedShrinkFactor;
private float mOverviewModeShrinkFactor;
private static final int DEFAULT_CELL_COUNT_X = 4;
private static final int DEFAULT_CELL_COUNT_Y = 4;
// State variable that indicates whether the pages are small (ie when you're
// in all apps or customize mode)
@ -188,7 +185,6 @@ public class Workspace extends SmoothPagedView
private final Rect mTempRect = new Rect();
private final int[] mTempXY = new int[2];
private int[] mTempVisiblePagesRange = new int[2];
private float mOverscrollFade = 0;
private boolean mOverscrollTransformsSet;
public static final int DRAG_BITMAP_PADDING = 2;
private boolean mWorkspaceFadeInAdjacentScreens;
@ -301,52 +297,17 @@ public class Workspace extends SmoothPagedView
mFadeInAdjacentScreens = false;
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);
if (LauncherAppState.getInstance().isScreenLarge()) {
// Determine number of rows/columns dynamically
// TODO: This code currently fails on tablets with an aspect ratio < 1.3.
// Around that ratio we should make cells the same size in portrait and
// landscape
TypedArray actionBarSizeTypedArray =
context.obtainStyledAttributes(new int[] { android.R.attr.actionBarSize });
final float actionBarHeight = actionBarSizeTypedArray.getDimension(0, 0f);
Point minDims = new Point();
Point maxDims = new Point();
mLauncher.getWindowManager().getDefaultDisplay().getCurrentSizeRange(minDims, maxDims);
cellCountX = 1;
while (CellLayout.widthInPortrait(res, cellCountX + 1) <= minDims.x) {
cellCountX++;
}
cellCountY = 1;
while (actionBarHeight + CellLayout.heightInLandscape(res, cellCountY + 1)
<= minDims.y) {
cellCountY++;
}
}
mSpringLoadedShrinkFactor =
res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f;
mOverviewModeShrinkFactor =
res.getInteger(R.integer.config_workspaceOverviewShrinkPercentage) / 100.0f;
mCameraDistance = res.getInteger(R.integer.config_cameraDistance);
// 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();
setOnHierarchyChangeListener(this);
LauncherModel.updateWorkspaceLayoutCells(cellCountX, cellCountY);
setHapticFeedbackEnabled(false);
initWorkspace();
@ -417,6 +378,7 @@ public class Workspace extends SmoothPagedView
mCurrentPage = mDefaultPage;
Launcher.setScreen(mCurrentPage);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
mIconCache = app.getIconCache();
setWillNotDraw(false);
setClipChildren(false);
@ -438,7 +400,7 @@ public class Workspace extends SmoothPagedView
mWallpaperTravelWidth = (int) (mDisplaySize.x *
wallpaperTravelToScreenWidthRatio(mDisplaySize.x, mDisplaySize.y));
mMaxDistanceForFolderCreation = (0.55f * res.getDimensionPixelSize(R.dimen.app_icon_size));
mMaxDistanceForFolderCreation = (0.55f * grid.iconSizePx);
mFlingThresholdVelocity = (int) (FLING_THRESHOLD_VELOCITY * mDensity);
}
@ -615,7 +577,10 @@ public class Workspace extends SmoothPagedView
}
public long getScreenIdForPageIndex(int index) {
return mScreenOrder.get(index);
if (0 <= index && index < mScreenOrder.size()) {
return mScreenOrder.get(index);
}
return -1;
}
ArrayList<Long> getScreenOrder() {
@ -1401,7 +1366,6 @@ public class Workspace extends SmoothPagedView
cl.setOverScrollAmount(Math.abs(scrollProgress), isLeftPage);
float rotation = -WORKSPACE_OVERSCROLL_ROTATION * scrollProgress;
cl.setRotationY(rotation);
setFadeForOverScroll(Math.abs(scrollProgress));
if (!mOverscrollTransformsSet) {
mOverscrollTransformsSet = true;
cl.setCameraDistance(mDensity * mCameraDistance);
@ -1410,9 +1374,6 @@ public class Workspace extends SmoothPagedView
cl.setOverscrollTransformsDirty(true);
}
} else {
if (mOverscrollFade != 0) {
setFadeForOverScroll(0);
}
if (mOverscrollTransformsSet) {
mOverscrollTransformsSet = false;
((CellLayout) getChildAt(0)).resetOverscrollTransforms();
@ -2165,11 +2126,12 @@ public class Workspace extends SmoothPagedView
Math.round(mTempXY[1] - (bmpHeight - scale * bmpHeight) / 2
- DRAG_BITMAP_PADDING / 2);
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
Point dragVisualizeOffset = null;
Rect dragRect = null;
if (child instanceof BubbleTextView || child instanceof PagedViewIcon) {
int iconSize = r.getDimensionPixelSize(R.dimen.app_icon_size);
int iconPaddingTop = r.getDimensionPixelSize(R.dimen.app_icon_padding_top);
int iconSize = grid.iconSizePx;
int top = child.getPaddingTop();
int left = (bmpWidth - iconSize) / 2;
int right = left + iconSize;
@ -2177,12 +2139,11 @@ public class Workspace extends SmoothPagedView
dragLayerY += top;
// Note: The drag region is used to calculate drag layer offsets, but the
// dragVisualizeOffset in addition to the dragRect (the size) to position the outline.
dragVisualizeOffset = new Point(-DRAG_BITMAP_PADDING / 2,
iconPaddingTop - DRAG_BITMAP_PADDING / 2);
dragVisualizeOffset = new Point(-DRAG_BITMAP_PADDING / 2, DRAG_BITMAP_PADDING / 2);
dragRect = new Rect(left, top, right, bottom);
} else if (child instanceof FolderIcon) {
int previewSize = r.getDimensionPixelSize(R.dimen.folder_preview_size);
dragRect = new Rect(0, 0, child.getWidth(), previewSize);
int previewSize = grid.folderIconSizePx;
dragRect = new Rect(0, child.getPaddingTop(), child.getWidth(), previewSize);
}
// Clear the pressed state if necessary
@ -2665,6 +2626,9 @@ public class Workspace extends SmoothPagedView
}
static Rect getCellLayoutMetrics(Launcher launcher, int orientation) {
LauncherAppState app = LauncherAppState.getInstance();
DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
Resources res = launcher.getResources();
Display display = launcher.getWindowManager().getDefaultDisplay();
Point smallestSize = new Point();
@ -2672,12 +2636,9 @@ public class Workspace extends SmoothPagedView
display.getCurrentSizeRange(smallestSize, largestSize);
if (orientation == CellLayout.LANDSCAPE) {
if (mLandscapeCellLayoutMetrics == null) {
int paddingLeft = res.getDimensionPixelSize(R.dimen.workspace_left_padding_land);
int paddingRight = res.getDimensionPixelSize(R.dimen.workspace_right_padding_land);
int paddingTop = res.getDimensionPixelSize(R.dimen.workspace_top_padding_land);
int paddingBottom = res.getDimensionPixelSize(R.dimen.workspace_bottom_padding_land);
int width = largestSize.x - paddingLeft - paddingRight;
int height = smallestSize.y - paddingTop - paddingBottom;
Rect padding = grid.getWorkspacePadding(CellLayout.LANDSCAPE);
int width = largestSize.x - padding.left - padding.right;
int height = smallestSize.y - padding.top - padding.bottom;
mLandscapeCellLayoutMetrics = new Rect();
CellLayout.getMetrics(mLandscapeCellLayoutMetrics, res,
width, height, LauncherModel.getCellCountX(), LauncherModel.getCellCountY(),
@ -2686,12 +2647,9 @@ public class Workspace extends SmoothPagedView
return mLandscapeCellLayoutMetrics;
} else if (orientation == CellLayout.PORTRAIT) {
if (mPortraitCellLayoutMetrics == null) {
int paddingLeft = res.getDimensionPixelSize(R.dimen.workspace_left_padding_land);
int paddingRight = res.getDimensionPixelSize(R.dimen.workspace_right_padding_land);
int paddingTop = res.getDimensionPixelSize(R.dimen.workspace_top_padding_land);
int paddingBottom = res.getDimensionPixelSize(R.dimen.workspace_bottom_padding_land);
int width = smallestSize.x - paddingLeft - paddingRight;
int height = largestSize.y - paddingTop - paddingBottom;
Rect padding = grid.getWorkspacePadding(CellLayout.PORTRAIT);
int width = smallestSize.x - padding.left - padding.right;
int height = largestSize.y - padding.top - padding.bottom;
mPortraitCellLayoutMetrics = new Rect();
CellLayout.getMetrics(mPortraitCellLayoutMetrics, res,
width, height, LauncherModel.getCellCountX(), LauncherModel.getCellCountY(),
@ -4129,7 +4087,7 @@ public class Workspace extends SmoothPagedView
@Override
protected int getPageIndicatorMarker(int pageIndex) {
if (getScreenIdForPageIndex(pageIndex) == CUSTOM_CONTENT_SCREEN_ID) {
return R.layout.now_page_indicator_marker;
return R.layout.custom_content_page_indicator_marker;
}
return super.getPageIndicatorMarker(pageIndex);
}
@ -4151,13 +4109,4 @@ public class Workspace extends SmoothPagedView
public void getLocationInDragLayer(int[] loc) {
mLauncher.getDragLayer().getLocationInDragLayer(this, loc);
}
void setFadeForOverScroll(float fade) {
mOverscrollFade = fade;
float reducedFade = 0.5f + 0.5f * (1 - fade);
final ViewGroup parent = (ViewGroup) getParent();
final ImageView qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));
if (qsbDivider != null) qsbDivider.setAlpha(reducedFade);
}
}