Merge "Preset type; contact shortcuts are now launched w/o provider invocation" into jb-dev
diff --git a/res/drawable-hdpi/search_frame.9.png b/res/drawable-hdpi/search_frame.9.png
index d0c78c4..7fbf24f 100644
--- a/res/drawable-hdpi/search_frame.9.png
+++ b/res/drawable-hdpi/search_frame.9.png
Binary files differ
diff --git a/res/drawable-mdpi/search_frame.9.png b/res/drawable-mdpi/search_frame.9.png
index 7a0e46c..e6e048a 100644
--- a/res/drawable-mdpi/search_frame.9.png
+++ b/res/drawable-mdpi/search_frame.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/search_frame.9.png b/res/drawable-xhdpi/search_frame.9.png
index cb6f294..706b1d8 100644
--- a/res/drawable-xhdpi/search_frame.9.png
+++ b/res/drawable-xhdpi/search_frame.9.png
Binary files differ
diff --git a/res/layout-land/workspace_cling.xml b/res/layout-land/workspace_cling.xml
index dca3937..b66f1bd 100644
--- a/res/layout-land/workspace_cling.xml
+++ b/res/layout-land/workspace_cling.xml
@@ -28,11 +28,9 @@
             android:orientation="vertical">
             <TextView
                 style="@style/ClingTitleText"
-                android:id="@+id/workspace_cling_title"
                 android:text="@string/workspace_cling_title" />
             <TextView
                 style="@style/ClingText"
-                android:id="@+id/workspace_cling_move_item"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/workspace_cling_move_item" />
@@ -40,7 +38,6 @@
     </FrameLayout>
     <TextView
         style="@style/ClingText"
-        android:id="@+id/workspace_cling_open_all_apps"
         android:layout_width="180dp"
         android:layout_height="wrap_content"
         android:layout_marginRight="130dp"
@@ -49,9 +46,8 @@
         android:text="@string/workspace_cling_open_all_apps" />
     <Button
         style="@style/ClingButton"
-        android:id="@+id/cling_dismiss"
         android:layout_marginBottom="15dp"
         android:layout_marginRight="10dp"
         android:layout_gravity="bottom|right"
         android:onClick="dismissWorkspaceCling" />
-</com.android.launcher2.Cling>
\ No newline at end of file
+</com.android.launcher2.Cling>
diff --git a/res/layout-port/workspace_cling.xml b/res/layout-port/workspace_cling.xml
index 6b05c27..10e6976 100644
--- a/res/layout-port/workspace_cling.xml
+++ b/res/layout-port/workspace_cling.xml
@@ -29,11 +29,9 @@
             android:orientation="vertical">
             <TextView
                 style="@style/ClingTitleText"
-                android:id="@+id/workspace_cling_title"
                 android:text="@string/workspace_cling_title" />
             <TextView
                 style="@style/ClingText"
-                android:id="@+id/workspace_cling_move_item"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/workspace_cling_move_item" />
@@ -41,7 +39,6 @@
     </FrameLayout>
     <TextView
         style="@style/ClingText"
-        android:id="@+id/workspace_cling_open_all_apps"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginLeft="20dp"
@@ -52,9 +49,8 @@
         android:text="@string/workspace_cling_open_all_apps" />
     <Button
         style="@style/ClingButton"
-        android:id="@+id/cling_dismiss"
         android:layout_marginBottom="15dp"
         android:layout_marginRight="10dp"
         android:layout_gravity="bottom|right"
         android:onClick="dismissWorkspaceCling" />
-</com.android.launcher2.Cling>
\ No newline at end of file
+</com.android.launcher2.Cling>
diff --git a/res/layout-sw720dp-port/workspace_cling.xml b/res/layout-sw720dp-port/workspace_cling.xml
index 2eae0fc..29bea81 100644
--- a/res/layout-sw720dp-port/workspace_cling.xml
+++ b/res/layout-sw720dp-port/workspace_cling.xml
@@ -28,24 +28,20 @@
             android:orientation="vertical">
             <TextView
                 style="@style/ClingTitleText"
-                android:id="@+id/workspace_cling_title"
                 android:text="@string/workspace_cling_title" />
             <TextView
                 style="@style/ClingText"
-                android:id="@+id/workspace_cling_move_item"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/workspace_cling_move_item" />
             <Button
                 style="@style/ClingButton"
-                android:id="@+id/cling_dismiss"
                 android:layout_marginTop="15dp"
                 android:onClick="dismissWorkspaceCling" />
         </LinearLayout>
     </FrameLayout>
     <TextView
         style="@style/ClingText"
-        android:id="@+id/workspace_cling_open_all_apps"
         android:layout_width="180dp"
         android:layout_height="wrap_content"
         android:layout_marginTop="15dp"
@@ -53,4 +49,4 @@
         android:layout_gravity="right"
         android:gravity="right"
         android:text="@string/workspace_cling_open_all_apps" />
-</com.android.launcher2.Cling>
\ No newline at end of file
+</com.android.launcher2.Cling>
diff --git a/res/layout-sw720dp/workspace_cling.xml b/res/layout-sw720dp/workspace_cling.xml
index 264b1e0..fd7d4f8 100644
--- a/res/layout-sw720dp/workspace_cling.xml
+++ b/res/layout-sw720dp/workspace_cling.xml
@@ -28,24 +28,20 @@
             android:orientation="vertical">
             <TextView
                 style="@style/ClingTitleText"
-                android:id="@+id/workspace_cling_title"
                 android:text="@string/workspace_cling_title" />
             <TextView
                 style="@style/ClingText"
-                android:id="@+id/workspace_cling_move_item"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/workspace_cling_move_item" />
             <Button
                 style="@style/ClingButton"
-                android:id="@+id/cling_dismiss"
                 android:layout_marginTop="15dp"
                 android:onClick="dismissWorkspaceCling" />
         </LinearLayout>
     </FrameLayout>
     <TextView
         style="@style/ClingText"
-        android:id="@+id/workspace_cling_open_all_apps"
         android:layout_width="180dp"
         android:layout_height="wrap_content"
         android:layout_marginTop="90dp"
@@ -53,4 +49,4 @@
         android:layout_gravity="right"
         android:gravity="right"
         android:text="@string/workspace_cling_open_all_apps" />
-</com.android.launcher2.Cling>
\ No newline at end of file
+</com.android.launcher2.Cling>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 41af338..64972ba 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -96,7 +96,7 @@
     <string name="workspace_cling_move_item" msgid="791013895761065070">"Dodaj tu swoje ulubione aplikacje."</string>
     <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"Aby zobaczyć wszystkie aplikacje, dotknij okręgu."</string>
     <string name="all_apps_cling_title" msgid="2559734712581447107">"Wybierz kilka aplikacji"</string>
-    <string name="all_apps_cling_add_item" msgid="5665035103260318891">"Aby dodać aplikację na ekran główny, dotknij jej i przytrzymaj."</string>
+    <string name="all_apps_cling_add_item" msgid="5665035103260318891">"By dodać aplikację na ekran główny, dotknij i przytrzymaj jej ikonę."</string>
     <string name="folder_cling_title" msgid="4308949882377840953">"Uporządkuj swoje aplikacje za pomocą folderów"</string>
     <string name="folder_cling_move_item" msgid="270598675060435169">"Dotknij i przytrzymaj, aby przenieść aplikację."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Aby utworzyć nowy folder na ekranie głównym, ułóż aplikacje jedna na drugiej."</string>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 1ab495f..fbd743b 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -16,6 +16,7 @@
 
 <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>
 
@@ -23,8 +24,9 @@
          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">12dp</dimen>
-    <dimen name="qsb_padding_right">12dp</dimen>
+    <dimen name="qsb_padding_left">16dp</dimen>
+    <dimen name="qsb_padding_right">16dp</dimen>
+
     <dimen name="search_bar_height">48dp</dimen>
 
 <!-- Hotseat -->
@@ -35,8 +37,8 @@
     <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">33dp</dimen>
-    <dimen name="button_bar_width_right_padding">33dp</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 -->
@@ -45,6 +47,11 @@
     <dimen name="folder_cell_width">86dp</dimen>
     <dimen name="folder_cell_height">90dp</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>
     <dimen name="apps_customize_cell_height">98dp</dimen>
@@ -57,12 +64,11 @@
 
 <!-- Workspace cell size -->
     <dimen name="workspace_cell_width_land">88dp</dimen>
-    <dimen name="workspace_cell_width_port">88dp</dimen>
+    <dimen name="workspace_cell_width_port">96dp</dimen>
     <dimen name="workspace_cell_height_land">88dp</dimen>
-    <dimen name="workspace_cell_height_port">88dp</dimen>
+    <dimen name="workspace_cell_height_port">96dp</dimen>
     <dimen name="workspace_width_gap_land">32dp</dimen>
-    <dimen name="workspace_width_gap_port">6dp</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>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
new file mode 100644
index 0000000..200c0a0
--- /dev/null
+++ b/res/values-sw600dp/styles.xml
@@ -0,0 +1,50 @@
+<?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>
+    <style name="ClingButton">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:paddingTop">10dp</item>
+        <item name="android:paddingBottom">15dp</item>
+        <item name="android:paddingLeft">35dp</item>
+        <item name="android:paddingRight">35dp</item>
+        <item name="android:text">@string/cling_dismiss</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:background">@drawable/cling_button_bg</item>
+    </style>
+    <style name="ClingTitleText">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginBottom">5dp</item>
+        <item name="android:textSize">30sp</item>
+        <item name="android:textColor">#33B5E5</item>
+        <item name="android:shadowColor">#000000</item>
+        <item name="android:shadowDy">2</item>
+        <item name="android:shadowRadius">2.0</item>
+    </style>
+    <style name="ClingText">
+        <item name="android:textSize">22sp</item>
+        <item name="android:textColor">#FFFFFF</item>
+        <item name="android:shadowColor">#000000</item>
+        <item name="android:shadowDy">2</item>
+        <item name="android:shadowRadius">2.0</item>
+        <item name="android:lineSpacingMultiplier">1.1</item>
+    </style>
+</resources>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index 48c729d..d06f0aa 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -16,6 +16,7 @@
 
 <resources>
     <dimen name="app_icon_size">72dp</dimen>
+    <dimen name="reveal_radius">72dp</dimen>
 <!-- QSB -->
     <dimen name="toolbar_button_vertical_padding">12dip</dimen>
     <dimen name="toolbar_button_horizontal_padding">12dip</dimen>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d468762..fa85a1b 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -21,6 +21,9 @@
     <!-- 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>
+    <!-- A list of custom punch through x,y coordinates. x and y alternate. default to empty. -->
+    <array name="punch_through_coords"></array>
 
 <!-- Workspace -->
     <!-- qsb_bar_height_inset represents qsb_bar_height minus the padding
@@ -46,6 +49,7 @@
     <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="app_icon_drawable_padding">6dp</dimen>
     <dimen name="app_icon_drawable_padding_land">2dp</dimen>
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index f2c50a4..3580545 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -279,6 +279,11 @@
         mWidgetPreviewIconPaddedDimension =
             (int) (mAppIconSize * (1 + (2 * sWidgetPreviewIconPaddingPercentage)));
         mFadeInAdjacentScreens = false;
+
+        // Unless otherwise specified this view is important for accessibility.
+        if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+            setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+        }
     }
 
     @Override
@@ -702,6 +707,8 @@
                     mWidgetPreviewIconPaddedDimension, Bitmap.Config.ARGB_8888);
             Drawable d = image.getDrawable();
             mCanvas.setBitmap(preview);
+            mCanvas.translate((mWidgetPreviewIconPaddedDimension - d.getIntrinsicWidth()) / 2,
+                    (mWidgetPreviewIconPaddedDimension - d.getIntrinsicHeight()) / 2);
             d.draw(mCanvas);
             mCanvas.setBitmap(null);
             createItemInfo.spanX = createItemInfo.spanY = 1;
diff --git a/src/com/android/launcher2/Cling.java b/src/com/android/launcher2/Cling.java
index f9a0681..6f2d021 100644
--- a/src/com/android/launcher2/Cling.java
+++ b/src/com/android/launcher2/Cling.java
@@ -40,13 +40,16 @@
 
     private static String WORKSPACE_PORTRAIT = "workspace_portrait";
     private static String WORKSPACE_LANDSCAPE = "workspace_landscape";
+    private static String WORKSPACE_LARGE = "workspace_large";
+    private static String WORKSPACE_CUSTOM = "workspace_custom";
+
     private static String ALLAPPS_PORTRAIT = "all_apps_portrait";
     private static String ALLAPPS_LANDSCAPE = "all_apps_landscape";
+    private static String ALLAPPS_LARGE = "all_apps_large";
+
     private static String FOLDER_PORTRAIT = "folder_portrait";
     private static String FOLDER_LANDSCAPE = "folder_landscape";
-    private static String WORKSPACE_LARGE = "workspace_large";
     private static String FOLDER_LARGE = "folder_large";
-    private static String ALLAPPS_LARGE = "all_apps_large";
 
     private Launcher mLauncher;
     private boolean mIsInitialized;
@@ -59,6 +62,7 @@
     private int mButtonBarHeight;
     private float mRevealRadius;
     private int[] mPositionData;
+    private int[] mCustomPositionData;
 
     private Paint mErasePaint;
 
@@ -84,11 +88,23 @@
             mPositionData = positionData;
 
             Resources r = getContext().getResources();
+
+            // If we have custom punch through data from resources
+            TypedArray punchThroughCoords = r.obtainTypedArray(R.array.punch_through_coords);
+
+            if (punchThroughCoords != null) {
+                int len = punchThroughCoords.length();
+                mCustomPositionData = new int[len];
+                for (int i = 0; i < len; i++) {
+                    mCustomPositionData[i] = punchThroughCoords.getDimensionPixelSize(i, 0);
+                }
+            }
+
             mPunchThroughGraphic = r.getDrawable(R.drawable.cling);
             mPunchThroughGraphicCenterRadius =
                 r.getDimensionPixelSize(R.dimen.clingPunchThroughGraphicCenterRadius);
             mAppIconSize = r.getDimensionPixelSize(R.dimen.app_icon_size);
-            mRevealRadius = mAppIconSize * 1f;
+            mRevealRadius = r.getDimensionPixelSize(R.dimen.reveal_radius) * 1f;
             mButtonBarHeight = r.getDimensionPixelSize(R.dimen.button_bar_height);
 
             mErasePaint = new Paint();
@@ -107,7 +123,7 @@
         mIsInitialized = false;
     }
 
-    private int[] getPunchThroughPosition() {
+    private int[] getPunchThroughPositions() {
         if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT)) {
             return new int[]{getMeasuredWidth() / 2, getMeasuredHeight() - (mButtonBarHeight / 2)};
         } else if (mDrawIdentifier.equals(WORKSPACE_LANDSCAPE)) {
@@ -117,6 +133,8 @@
             final int cornerXOffset = (int) (scale * 15);
             final int cornerYOffset = (int) (scale * 10);
             return new int[]{getMeasuredWidth() - cornerXOffset, cornerYOffset};
+        } else if (mDrawIdentifier.equals(WORKSPACE_CUSTOM)) {
+            return mCustomPositionData;
         } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) ||
                    mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) ||
                    mDrawIdentifier.equals(ALLAPPS_LARGE)) {
@@ -130,14 +148,18 @@
         if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) ||
             mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
             mDrawIdentifier.equals(WORKSPACE_LARGE) ||
+            mDrawIdentifier.equals(WORKSPACE_CUSTOM) ||
             mDrawIdentifier.equals(ALLAPPS_PORTRAIT) ||
             mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) ||
             mDrawIdentifier.equals(ALLAPPS_LARGE)) {
-            int[] pos = getPunchThroughPosition();
-            double diff = Math.sqrt(Math.pow(event.getX() - pos[0], 2) +
-                    Math.pow(event.getY() - pos[1], 2));
-            if (diff < mRevealRadius) {
-                return false;
+
+            int[] positions = getPunchThroughPositions();
+            for (int i = 0; i < positions.length; i += 2) {
+                double diff = Math.sqrt(Math.pow(event.getX() - positions[i], 2) +
+                        Math.pow(event.getY() - positions[i + 1], 2));
+                if (diff < mRevealRadius) {
+                    return false;
+                }
             }
         } else if (mDrawIdentifier.equals(FOLDER_PORTRAIT) ||
                    mDrawIdentifier.equals(FOLDER_LANDSCAPE) ||
@@ -168,8 +190,9 @@
             // Draw the background
             if (mBackground == null) {
                 if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) ||
-                    mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
-                    mDrawIdentifier.equals(WORKSPACE_LARGE)) {
+                        mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
+                        mDrawIdentifier.equals(WORKSPACE_LARGE) ||
+                        mDrawIdentifier.equals(WORKSPACE_CUSTOM)) {
                     mBackground = getResources().getDrawable(R.drawable.bg_cling1);
                 } else if (mDrawIdentifier.equals(ALLAPPS_PORTRAIT) ||
                         mDrawIdentifier.equals(ALLAPPS_LANDSCAPE) ||
@@ -196,13 +219,15 @@
             int dh = (int) (scale * mPunchThroughGraphic.getIntrinsicHeight());
 
             // Determine where to draw the punch through graphic
-            int[] pos = getPunchThroughPosition();
-            cx = pos[0];
-            cy = pos[1];
-            if (cx > -1 && cy > -1) {
-                c.drawCircle(cx, cy, mRevealRadius, mErasePaint);
-                mPunchThroughGraphic.setBounds(cx - dw/2, cy - dh/2, cx + dw/2, cy + dh/2);
-                mPunchThroughGraphic.draw(c);
+            int[] positions = getPunchThroughPositions();
+            for (int i = 0; i < positions.length; i += 2) {
+                cx = positions[i];
+                cy = positions[i + 1];
+                if (cx > -1 && cy > -1) {
+                    c.drawCircle(cx, cy, mRevealRadius, mErasePaint);
+                    mPunchThroughGraphic.setBounds(cx - dw/2, cy - dh/2, cx + dw/2, cy + dh/2);
+                    mPunchThroughGraphic.draw(c);
+                }
             }
 
             // Draw the hand graphic in All Apps
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index bc88a98..fc1a26d 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -1089,7 +1089,9 @@
 
                                 // App shortcuts that used to be automatically added to Launcher
                                 // didn't always have the correct intent flags set, so do that here
-                                if (intent.getAction().equals(Intent.ACTION_MAIN) &&
+                                if (intent.getAction() != null &&
+                                        intent.getCategories() != null &&
+                                        intent.getAction().equals(Intent.ACTION_MAIN) &&
                                         intent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) {
                                     intent.addFlags(
                                         Intent.FLAG_ACTIVITY_NEW_TASK |
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index a3080a8..02f1c22 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -24,6 +24,7 @@
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Rect;
+import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.util.AttributeSet;
@@ -75,6 +76,8 @@
     private static final int MIN_SNAP_VELOCITY = 1500;
     private static final int MIN_FLING_VELOCITY = 250;
 
+    static final int AUTOMATIC_PAGE_SPACING = -1;
+
     protected int mFlingThresholdVelocity;
     protected int mMinFlingVelocity;
     protected int mMinSnapVelocity;
@@ -450,17 +453,23 @@
 
         final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
         final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
         if (widthMode != MeasureSpec.EXACTLY) {
             throw new IllegalStateException("Workspace can only be used in EXACTLY mode.");
         }
 
+        // Return early if we aren't given a proper dimension
+        if (widthSize <= 0 || heightSize <= 0) {
+            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+            return;
+        }
+
         /* Allow the height to be set as WRAP_CONTENT. This allows the particular case
          * of the All apps view on XLarge displays to not take up more space then it needs. Width
          * is still not allowed to be set as WRAP_CONTENT since many parts of the code expect
          * each page to have the same width.
          */
-        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
         int maxChildHeight = 0;
 
         final int verticalPadding = getPaddingTop() + getPaddingBottom();
@@ -507,12 +516,17 @@
 
         setMeasuredDimension(widthSize, heightSize);
 
+        // We can't call getChildOffset/getRelativeChildOffset until we set the measured dimensions.
+        // We also wait until we set the measured dimensions before flushing the cache as well, to
+        // ensure that the cache is filled with good values.
+        invalidateCachedOffsets();
+
         if (childCount > 0) {
             if (DEBUG) Log.d(TAG, "getRelativeChildOffset(): " + getMeasuredWidth() + ", "
                     + getChildWidth(0));
 
             // Calculate the variable page spacing if necessary
-            if (mPageSpacing < 0) {
+            if (mPageSpacing == AUTOMATIC_PAGE_SPACING) {
                 // The gap between pages in the PagedView should be equal to the gap from the page
                 // to the edge of the screen (so it is not visible in the current screen).  To
                 // account for unequal padding on each side of the paged view, we take the maximum
@@ -524,10 +538,6 @@
             }
         }
 
-        // We can't call getChildOffset/getRelativeChildOffset until we set the measured dimensions.
-        // We also wait until we set the measured dimensions before flushing the cache as well, to
-        // ensure that the cache is filled with good values.
-        invalidateCachedOffsets();
         updateScrollingIndicatorPosition();
 
         if (childCount > 0) {
@@ -747,6 +757,10 @@
         }
     }
 
+    protected boolean shouldDrawChild(View child) {
+        return child.getAlpha() > 0;
+    }
+
     @Override
     protected void dispatchDraw(Canvas canvas) {
         int halfScreenSize = getMeasuredWidth() / 2;
@@ -783,7 +797,7 @@
                 // View.INVISIBLE, preventing re-drawing of their hardware layer
                 for (int i = getChildCount() - 1; i >= 0; i--) {
                     final View v = getPageAt(i);
-                    if (leftScreen <= i && i <= rightScreen && v.getAlpha() > 0) {
+                    if (leftScreen <= i && i <= rightScreen && shouldDrawChild(v)) {
                         v.setVisibility(VISIBLE);
                         drawChild(canvas, v, drawingTime);
                     } else {
@@ -1841,7 +1855,13 @@
     @Override
     public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
         super.onInitializeAccessibilityNodeInfo(info);
-        info.setScrollable(true);
+        info.setScrollable(getPageCount() > 1);
+        if (getCurrentPage() < getPageCount() - 1) {
+            info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+        }
+        if (getCurrentPage() > 0) {
+            info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+        }
     }
 
     @Override
@@ -1855,6 +1875,28 @@
         }
     }
 
+    @Override
+    public boolean performAccessibilityAction(int action, Bundle arguments) {
+        if (super.performAccessibilityAction(action, arguments)) {
+            return true;
+        }
+        switch (action) {
+            case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
+                if (getCurrentPage() < getPageCount() - 1) {
+                    scrollRight();
+                    return true;
+                }
+            } break;
+            case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
+                if (getCurrentPage() > 0) {
+                    scrollLeft();
+                    return true;
+                }
+            } break;
+        }
+        return false;
+    }
+
     protected String getCurrentPageDescription() {
         return String.format(getContext().getString(R.string.default_scroll_format),
                  getNextPage() + 1, getChildCount());
diff --git a/src/com/android/launcher2/SearchDropTargetBar.java b/src/com/android/launcher2/SearchDropTargetBar.java
index 5a1ba69..03512b2 100644
--- a/src/com/android/launcher2/SearchDropTargetBar.java
+++ b/src/com/android/launcher2/SearchDropTargetBar.java
@@ -54,6 +54,7 @@
     private boolean mDeferOnDragEnd = false;
 
     private Drawable mPreviousBackground;
+    private boolean mEnableDropDownDropTargets;
 
     public SearchDropTargetBar(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
@@ -108,11 +109,11 @@
         mInfoDropTarget.setSearchDropTargetBar(this);
         mDeleteDropTarget.setSearchDropTargetBar(this);
 
-        boolean enableDropDownDropTargets =
+        mEnableDropDownDropTargets =
             getResources().getBoolean(R.bool.config_useDropTargetDownTransition);
 
         // Create the various fade animations
-        if (enableDropDownDropTargets) {
+        if (mEnableDropDownDropTargets) {
             mDropTargetBar.setTranslationY(-mBarHeight);
             mDropTargetBarFadeInAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY", 0f);
             mDropTargetBarFadeOutAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY",
@@ -154,7 +155,11 @@
             mQSBSearchBarFadeInAnim.start();
         } else {
             mQSBSearchBar.setVisibility(View.VISIBLE);
-            mQSBSearchBar.setAlpha(1f);
+            if (mEnableDropDownDropTargets) {
+                mQSBSearchBar.setTranslationY(0);
+            } else {
+                mQSBSearchBar.setAlpha(1f);
+            }
         }
         mIsSearchBarHidden = false;
     }
@@ -164,7 +169,11 @@
             mQSBSearchBarFadeOutAnim.start();
         } else {
             mQSBSearchBar.setVisibility(View.INVISIBLE);
-            mQSBSearchBar.setAlpha(0f);
+            if (mEnableDropDownDropTargets) {
+                mQSBSearchBar.setTranslationY(0);
+            } else {
+                mQSBSearchBar.setAlpha(0f);
+            }
         }
         mIsSearchBarHidden = true;
     }
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 3910c45..00684bd 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -199,6 +199,7 @@
     private Point mDisplaySize = new Point();
     private boolean mIsStaticWallpaper;
     private int mWallpaperTravelWidth;
+    private int mSpringLoadedPageSpacing;
 
     // Variables relating to the creation of user folders by hovering shortcuts over shortcuts
     private static final int FOLDER_CREATION_TIMEOUT = 0;
@@ -322,6 +323,8 @@
 
         mSpringLoadedShrinkFactor =
             res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f;
+        mSpringLoadedPageSpacing =
+                res.getDimensionPixelSize(R.dimen.workspace_spring_loaded_page_spacing);
 
         // if the value is manually specified, use that instead
         cellCountX = a.getInt(R.styleable.Workspace_cellCountX, cellCountX);
@@ -339,6 +342,11 @@
 
         // Disable multitouch across the workspace/all apps/customize tray
         setMotionEventSplittingEnabled(true);
+
+        // Unless otherwise specified this view is important for accessibility.
+        if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+            setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
+        }
     }
 
     // estimate the size of a widget with spans hSpan, vSpan. return MAX_VALUE for each
@@ -450,6 +458,13 @@
     public void onChildViewRemoved(View parent, View child) {
     }
 
+    protected boolean shouldDrawChild(View child) {
+        final CellLayout cl = (CellLayout) child;
+        return super.shouldDrawChild(child) &&
+            (cl.getShortcutsAndWidgets().getAlpha() > 0 ||
+             cl.getBackgroundAlpha() > 0);
+    }
+
     /**
      * @return The open folder on the current screen, or null if there is none
      */
@@ -1536,6 +1551,7 @@
 
         if (state != State.NORMAL) {
             finalScaleFactor = mSpringLoadedShrinkFactor - (stateIsSmall ? 0.1f : 0);
+            setPageSpacing(mSpringLoadedPageSpacing);
             if (oldStateIsNormal && stateIsSmall) {
                 zoomIn = false;
                 setLayoutScale(finalScaleFactor);
@@ -1545,6 +1561,7 @@
                 setLayoutScale(finalScaleFactor);
             }
         } else {
+            setPageSpacing(PagedView.AUTOMATIC_PAGE_SPACING);
             setLayoutScale(1.0f);
         }