Merge "Fix default wallpaper dimensions" into jb-ub-now-indigo-rose
diff --git a/res/drawable-hdpi/active_page.png b/res/drawable-hdpi/active_page.png
deleted file mode 100644
index 58aa7f9..0000000
--- a/res/drawable-hdpi/active_page.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps.png b/res/drawable-hdpi/ic_allapps.png
index 40d5827..f066d16 100644
--- a/res/drawable-hdpi/ic_allapps.png
+++ b/res/drawable-hdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps_pressed.png b/res/drawable-hdpi/ic_allapps_pressed.png
index 6d87bbb..1675992 100644
--- a/res/drawable-hdpi/ic_allapps_pressed.png
+++ b/res/drawable-hdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_gel_setting_icn.png b/res/drawable-hdpi/ic_gel_setting_icn.png
new file mode 100644
index 0000000..f805947
--- /dev/null
+++ b/res/drawable-hdpi/ic_gel_setting_icn.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_gel_wallpaper_icn.png b/res/drawable-hdpi/ic_gel_wallpaper_icn.png
new file mode 100644
index 0000000..ad13c85
--- /dev/null
+++ b/res/drawable-hdpi/ic_gel_wallpaper_icn.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_gel_widget_icn.png b/res/drawable-hdpi/ic_gel_widget_icn.png
new file mode 100644
index 0000000..2bfd2c1
--- /dev/null
+++ b/res/drawable-hdpi/ic_gel_widget_icn.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pageindicator_add.png b/res/drawable-hdpi/ic_pageindicator_add.png
new file mode 100644
index 0000000..c77a4f9
--- /dev/null
+++ b/res/drawable-hdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pageindicator_current.png b/res/drawable-hdpi/ic_pageindicator_current.png
new file mode 100644
index 0000000..aac8d40
--- /dev/null
+++ b/res/drawable-hdpi/ic_pageindicator_current.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pageindicator_default.png b/res/drawable-hdpi/ic_pageindicator_default.png
new file mode 100644
index 0000000..bafd94b
--- /dev/null
+++ b/res/drawable-hdpi/ic_pageindicator_default.png
Binary files differ
diff --git a/res/drawable-hdpi/inactive_page.png b/res/drawable-hdpi/inactive_page.png
deleted file mode 100644
index b70d9f4..0000000
--- a/res/drawable-hdpi/inactive_page.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/overscroll_glow_left.9.png b/res/drawable-hdpi/overscroll_glow_left.9.png
index a37592d..782ecf1 100644
--- a/res/drawable-hdpi/overscroll_glow_left.9.png
+++ b/res/drawable-hdpi/overscroll_glow_left.9.png
Binary files differ
diff --git a/res/drawable-hdpi/overscroll_glow_right.9.png b/res/drawable-hdpi/overscroll_glow_right.9.png
index f0f7084..d034864 100644
--- a/res/drawable-hdpi/overscroll_glow_right.9.png
+++ b/res/drawable-hdpi/overscroll_glow_right.9.png
Binary files differ
diff --git a/res/drawable-mdpi/active_page.png b/res/drawable-mdpi/active_page.png
deleted file mode 100644
index 296a9a6..0000000
--- a/res/drawable-mdpi/active_page.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps.png b/res/drawable-mdpi/ic_allapps.png
index a3cce14..6994b7b 100644
--- a/res/drawable-mdpi/ic_allapps.png
+++ b/res/drawable-mdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps_pressed.png b/res/drawable-mdpi/ic_allapps_pressed.png
index 5c2076f..96581a5 100644
--- a/res/drawable-mdpi/ic_allapps_pressed.png
+++ b/res/drawable-mdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_gel_setting_icn.png b/res/drawable-mdpi/ic_gel_setting_icn.png
new file mode 100644
index 0000000..096e6bc
--- /dev/null
+++ b/res/drawable-mdpi/ic_gel_setting_icn.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_gel_wallpaper_icn.png b/res/drawable-mdpi/ic_gel_wallpaper_icn.png
new file mode 100644
index 0000000..61a7b7e
--- /dev/null
+++ b/res/drawable-mdpi/ic_gel_wallpaper_icn.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_gel_widget_icn.png b/res/drawable-mdpi/ic_gel_widget_icn.png
new file mode 100644
index 0000000..8a2cb7a
--- /dev/null
+++ b/res/drawable-mdpi/ic_gel_widget_icn.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pageindicator_add.png b/res/drawable-mdpi/ic_pageindicator_add.png
new file mode 100644
index 0000000..22420bd
--- /dev/null
+++ b/res/drawable-mdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pageindicator_current.png b/res/drawable-mdpi/ic_pageindicator_current.png
new file mode 100644
index 0000000..ab5f4c8
--- /dev/null
+++ b/res/drawable-mdpi/ic_pageindicator_current.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pageindicator_default.png b/res/drawable-mdpi/ic_pageindicator_default.png
new file mode 100644
index 0000000..c919ee8
--- /dev/null
+++ b/res/drawable-mdpi/ic_pageindicator_default.png
Binary files differ
diff --git a/res/drawable-mdpi/inactive_page.png b/res/drawable-mdpi/inactive_page.png
deleted file mode 100644
index 2225d25..0000000
--- a/res/drawable-mdpi/inactive_page.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/overscroll_glow_left.9.png b/res/drawable-mdpi/overscroll_glow_left.9.png
index 897e63d..147e6a6 100644
--- a/res/drawable-mdpi/overscroll_glow_left.9.png
+++ b/res/drawable-mdpi/overscroll_glow_left.9.png
Binary files differ
diff --git a/res/drawable-mdpi/overscroll_glow_right.9.png b/res/drawable-mdpi/overscroll_glow_right.9.png
index dc6ecac..1321303 100644
--- a/res/drawable-mdpi/overscroll_glow_right.9.png
+++ b/res/drawable-mdpi/overscroll_glow_right.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/active_page.png b/res/drawable-xhdpi/active_page.png
deleted file mode 100644
index a1cfc35..0000000
--- a/res/drawable-xhdpi/active_page.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps.png b/res/drawable-xhdpi/ic_allapps.png
index 961e3f0..549e30f 100644
--- a/res/drawable-xhdpi/ic_allapps.png
+++ b/res/drawable-xhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps_pressed.png b/res/drawable-xhdpi/ic_allapps_pressed.png
index 72ff3b9..a703b40 100644
--- a/res/drawable-xhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_gel_setting_icn.png b/res/drawable-xhdpi/ic_gel_setting_icn.png
new file mode 100644
index 0000000..fe17163
--- /dev/null
+++ b/res/drawable-xhdpi/ic_gel_setting_icn.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_gel_wallpaper_icn.png b/res/drawable-xhdpi/ic_gel_wallpaper_icn.png
new file mode 100644
index 0000000..d9472d9
--- /dev/null
+++ b/res/drawable-xhdpi/ic_gel_wallpaper_icn.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_gel_widget_icn.png b/res/drawable-xhdpi/ic_gel_widget_icn.png
new file mode 100644
index 0000000..da6e3e9
--- /dev/null
+++ b/res/drawable-xhdpi/ic_gel_widget_icn.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pageindicator_add.png b/res/drawable-xhdpi/ic_pageindicator_add.png
new file mode 100644
index 0000000..9647b8f
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pageindicator_current.png b/res/drawable-xhdpi/ic_pageindicator_current.png
new file mode 100644
index 0000000..aed3d71
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pageindicator_current.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pageindicator_default.png b/res/drawable-xhdpi/ic_pageindicator_default.png
new file mode 100644
index 0000000..0887416
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pageindicator_default.png
Binary files differ
diff --git a/res/drawable-xhdpi/inactive_page.png b/res/drawable-xhdpi/inactive_page.png
deleted file mode 100644
index 177b253..0000000
--- a/res/drawable-xhdpi/inactive_page.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/overscroll_glow_left.9.png b/res/drawable-xhdpi/overscroll_glow_left.9.png
index fbfa190..8ece7f2 100644
--- a/res/drawable-xhdpi/overscroll_glow_left.9.png
+++ b/res/drawable-xhdpi/overscroll_glow_left.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/overscroll_glow_right.9.png b/res/drawable-xhdpi/overscroll_glow_right.9.png
index 9c66c33..818a70d 100644
--- a/res/drawable-xhdpi/overscroll_glow_right.9.png
+++ b/res/drawable-xhdpi/overscroll_glow_right.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps.png b/res/drawable-xxhdpi/ic_allapps.png
index 0cd0f14..500f618 100644
--- a/res/drawable-xxhdpi/ic_allapps.png
+++ b/res/drawable-xxhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps_pressed.png b/res/drawable-xxhdpi/ic_allapps_pressed.png
index 99494d8..54eb057 100644
--- a/res/drawable-xxhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xxhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_gel_setting_icn.png b/res/drawable-xxhdpi/ic_gel_setting_icn.png
new file mode 100644
index 0000000..813716d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_gel_setting_icn.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_gel_wallpaper_icn.png b/res/drawable-xxhdpi/ic_gel_wallpaper_icn.png
new file mode 100644
index 0000000..3525446
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_gel_wallpaper_icn.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_gel_widget_icn.png b/res/drawable-xxhdpi/ic_gel_widget_icn.png
new file mode 100644
index 0000000..9342437
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_gel_widget_icn.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_add.png b/res/drawable-xxhdpi/ic_pageindicator_add.png
new file mode 100644
index 0000000..591b189
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_current.png b/res/drawable-xxhdpi/ic_pageindicator_current.png
new file mode 100644
index 0000000..08615f3
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_pageindicator_current.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_default.png b/res/drawable-xxhdpi/ic_pageindicator_default.png
new file mode 100644
index 0000000..9d4fbf8
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_pageindicator_default.png
Binary files differ
diff --git a/res/drawable-xxhdpi/overscroll_glow_left.9.png b/res/drawable-xxhdpi/overscroll_glow_left.9.png
index ae20624..e188ce8 100644
--- a/res/drawable-xxhdpi/overscroll_glow_left.9.png
+++ b/res/drawable-xxhdpi/overscroll_glow_left.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/overscroll_glow_right.9.png b/res/drawable-xxhdpi/overscroll_glow_right.9.png
index b083720..5766761 100644
--- a/res/drawable-xxhdpi/overscroll_glow_right.9.png
+++ b/res/drawable-xxhdpi/overscroll_glow_right.9.png
Binary files differ
diff --git a/res/layout/custom_content_page_indicator_marker.xml b/res/layout/custom_content_page_indicator_marker.xml
index 1685992..8fe3f8f 100644
--- a/res/layout/custom_content_page_indicator_marker.xml
+++ b/res/layout/custom_content_page_indicator_marker.xml
@@ -16,20 +16,24 @@
 <com.android.launcher3.PageIndicatorMarker
     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_width="16dp"
+    android:layout_height="16dp"
     android:layout_gravity="center_vertical">
     <ImageView
         android:id="@+id/inactive"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="centerInside"
         android:src="@drawable/custom_content_page"
         />
     <ImageView
         android:id="@+id/active"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="centerInside"
         android:src="@drawable/custom_content_page"
         android:alpha="0"
+        android:scaleX="0.5"
+        android:scaleY="0.5"
         />
 </com.android.launcher3.PageIndicatorMarker>
diff --git a/res/layout/live_wallpaper_picker_item.xml b/res/layout/live_wallpaper_picker_item.xml
new file mode 100644
index 0000000..29aa12c
--- /dev/null
+++ b/res/layout/live_wallpaper_picker_item.xml
@@ -0,0 +1,47 @@
+<?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.CheckableFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/wallpaperThumbnailWidth"
+    android:layout_height="@dimen/wallpaperThumbnailHeight"
+    android:focusable="true"
+    android:clickable="true"
+    android:background="@drawable/wallpaper_tile_fg"
+    android:foreground="@drawable/wallpaper_tile_fg">
+    <ImageView
+        android:id="@+id/wallpaper_image"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_gravity="center"
+        android:background="@android:color/black"
+        android:scaleType="centerCrop" />
+    <ImageView
+        android:id="@+id/wallpaper_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:visibility="gone" />
+    <TextView
+        android:id="@+id/wallpaper_item_label"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:padding="4dp"
+        android:layout_gravity="bottom"
+        android:background="@color/wallpaper_picker_translucent_gray"
+        android:textColor="@android:color/white"/>
+</com.android.launcher3.CheckableFrameLayout>
diff --git a/res/layout/overview_panel.xml b/res/layout/overview_panel.xml
index e05adf2..e4f4c89 100644
--- a/res/layout/overview_panel.xml
+++ b/res/layout/overview_panel.xml
@@ -26,6 +26,8 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/widget_button_text"
+        android:drawablePadding="4dp"
+        android:drawableTop="@drawable/ic_gel_widget_icn"
         android:textSize="18dp"/>
     <Space
         android:layout_width="@dimen/overview_panel_buttonSpacing"
@@ -35,6 +37,8 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/wallpaper_button_text"
+        android:drawablePadding="4dp"
+        android:drawableTop="@drawable/ic_gel_wallpaper_icn"
         android:textSize="18dp" />
     <Space
         android:layout_width="@dimen/overview_panel_buttonSpacing"
@@ -44,5 +48,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/settings_button_text"
+        android:drawablePadding="4dp"
+        android:drawableTop="@drawable/ic_gel_setting_icn"
         android:textSize="18dp" />
 </LinearLayout>
diff --git a/res/layout/page_indicator_marker.xml b/res/layout/page_indicator_marker.xml
index 496f3bd..7c0c389 100644
--- a/res/layout/page_indicator_marker.xml
+++ b/res/layout/page_indicator_marker.xml
@@ -16,20 +16,24 @@
 <com.android.launcher3.PageIndicatorMarker
     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_width="16dp"
+    android:layout_height="16dp"
     android:layout_gravity="center_vertical">
     <ImageView
         android:id="@+id/inactive"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="@drawable/inactive_page"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="centerInside"
+        android:src="@drawable/ic_pageindicator_default"
         />
     <ImageView
         android:id="@+id/active"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="@drawable/active_page"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="centerInside"
+        android:src="@drawable/ic_pageindicator_current"
         android:alpha="0"
+        android:scaleX="0.5"
+        android:scaleY="0.5"
         />
 </com.android.launcher3.PageIndicatorMarker>
diff --git a/res/layout/third_party_wallpaper_picker_item.xml b/res/layout/third_party_wallpaper_picker_item.xml
new file mode 100644
index 0000000..c2aeade
--- /dev/null
+++ b/res/layout/third_party_wallpaper_picker_item.xml
@@ -0,0 +1,38 @@
+<?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.CheckableFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/wallpaperThumbnailWidth"
+    android:layout_height="@dimen/wallpaperThumbnailHeight"
+    android:focusable="true"
+    android:clickable="true"
+    android:background="@drawable/wallpaper_tile_fg"
+    android:foreground="@drawable/wallpaper_tile_fg">
+    <ImageView
+        android:id="@+id/wallpaper_image"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/wallpaper_picker_translucent_gray"
+        android:scaleType="centerCrop" />
+    <TextView
+        android:id="@+id/wallpaper_item_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:drawablePadding="4dp"
+        android:textColor="@android:color/white"/>
+</com.android.launcher3.CheckableFrameLayout>
diff --git a/res/layout/wallpaper_picker.xml b/res/layout/wallpaper_picker.xml
index a0672f6..53c529c 100644
--- a/res/layout/wallpaper_picker.xml
+++ b/res/layout/wallpaper_picker.xml
@@ -50,10 +50,23 @@
         <HorizontalScrollView
             android:layout_width="match_parent"
             android:layout_height="wrap_content" >
-            <LinearLayout android:id="@+id/wallpaper_list"
-                android:layout_width="match_parent"
+            <LinearLayout android:id="@+id/master_wallpaper_list"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:orientation="horizontal" />
+                android:orientation="horizontal" >
+                <LinearLayout android:id="@+id/third_party_wallpaper_list"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal" />
+                <LinearLayout android:id="@+id/wallpaper_list"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal" />
+                <LinearLayout android:id="@+id/live_wallpaper_list"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal" />
+            </LinearLayout>
         </HorizontalScrollView>
         <View
             android:layout_width="match_parent"
diff --git a/res/layout/wallpaper_picker_gallery_item.xml b/res/layout/wallpaper_picker_gallery_item.xml
index 976d3fa..d14ab3e 100644
--- a/res/layout/wallpaper_picker_gallery_item.xml
+++ b/res/layout/wallpaper_picker_gallery_item.xml
@@ -26,7 +26,7 @@
         android:id="@+id/wallpaper_image"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="#66000000"
+        android:background="@color/wallpaper_picker_translucent_gray"
         android:scaleType="centerCrop" />
     <TextView
         android:id="@+id/wallpaper_item_label"
@@ -36,5 +36,5 @@
         android:text="@string/pick_image"
         android:drawableTop="@drawable/ic_images"
         android:drawablePadding="4dp"
-        android:textColor="#FFFFFFFF"/>
+        android:textColor="@android:color/white"/>
 </com.android.launcher3.CheckableFrameLayout>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index bd561ed..01fd64c 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -32,4 +32,5 @@
     <color name="workspace_icon_text_color">#FFF</color>
 
     <color name="apps_customize_icon_text_color">#FFF</color>
+    <color name="wallpaper_picker_translucent_gray">#66000000</color>
 </resources>
diff --git a/src/com/android/launcher3/DragController.java b/src/com/android/launcher3/DragController.java
index f51366f..4c4f399 100644
--- a/src/com/android/launcher3/DragController.java
+++ b/src/com/android/launcher3/DragController.java
@@ -687,10 +687,6 @@
             }
         }
         mDragObject.dragSource.onDropCompleted((View) dropTarget, mDragObject, false, accepted);
-
-        // Write all the logs to disk
-        Launcher.addDumpLog(TAG, "10249126 - DragController.drop() - dumping logs to disk", true);
-        mLauncher.dumpLogsToLocalData(false);
     }
 
     private DropTarget findDropTarget(int x, int y, int[] dropCoordinates) {
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 9777ea9..7e91ffe 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -130,6 +130,7 @@
     static final boolean DEBUG_WIDGETS = false;
     static final boolean DEBUG_STRICT_MODE = false;
     static final boolean DEBUG_RESUME_TIME = false;
+    static final boolean DEBUG_DUMP_LOG = false;
 
     private static final int REQUEST_CREATE_SHORTCUT = 1;
     private static final int REQUEST_CREATE_APPWIDGET = 5;
@@ -889,10 +890,6 @@
         if (DEBUG_RESUME_TIME) {
             Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime));
         }
-
-        // Write all the logs to disk
-        Launcher.addDumpLog(TAG, "10249126 - onResume() - dumping logs to disk", true);
-        dumpLogsToLocalData(false);
     }
 
     @Override
@@ -909,10 +906,6 @@
         mPaused = true;
         mDragController.cancelDrag();
         mDragController.resetLastGestureUpTime();
-
-        // Write all the logs to disk
-        Launcher.addDumpLog(TAG, "10249126 - onPause() - dumping logs to disk", true);
-        dumpLogsToLocalData(false);
     }
 
     protected void onFinishBindingItems() {
@@ -3587,7 +3580,6 @@
     public void bindAddScreens(ArrayList<Long> orderedScreenIds) {
         int count = orderedScreenIds.size();
         for (int i = 0; i < count; i++) {
-            Launcher.addDumpLog(TAG, "10249126 - bindAddScreens(" + orderedScreenIds.get(i) + ")", true);
             mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(orderedScreenIds.get(i));
         }
     }
@@ -3645,8 +3637,6 @@
             return;
         }
 
-        Launcher.addDumpLog(TAG, "10249126 - bindAppsAdded(" + newScreens.size() + ")", true);
-
         // Add the new screens
         bindAddScreens(newScreens);
 
@@ -3869,10 +3859,6 @@
                 onFinishBindingItems();
             }
         });
-
-        // Write all the logs to disk
-        Launcher.addDumpLog(TAG, "10249126 - finishBindingItems() - dumping logs to disk", true);
-        dumpLogsToLocalData(false);
     }
 
     private boolean canRunNewAppsAnimation() {
@@ -4273,15 +4259,17 @@
     }
 
     public static void dumpDebugLogsToConsole() {
-        synchronized (sDumpLogs) {
-            Log.d(TAG, "");
-            Log.d(TAG, "*********************");
-            Log.d(TAG, "Launcher debug logs: ");
-            for (int i = 0; i < sDumpLogs.size(); i++) {
-                Log.d(TAG, "  " + sDumpLogs.get(i));
+        if (DEBUG_DUMP_LOG) {
+            synchronized (sDumpLogs) {
+                Log.d(TAG, "");
+                Log.d(TAG, "*********************");
+                Log.d(TAG, "Launcher debug logs: ");
+                for (int i = 0; i < sDumpLogs.size(); i++) {
+                    Log.d(TAG, "  " + sDumpLogs.get(i));
+                }
+                Log.d(TAG, "*********************");
+                Log.d(TAG, "");
             }
-            Log.d(TAG, "*********************");
-            Log.d(TAG, "");
         }
     }
 
@@ -4289,105 +4277,59 @@
         if (debugLog) {
             Log.d(tag, log);
         }
-        sDateStamp.setTime(System.currentTimeMillis());
-        synchronized (sDumpLogs) {
-            sDumpLogs.add(sDateFormat.format(sDateStamp) + ": " + tag + ", " + log);
-        }
-    }
-
-    public void dumpLogsToLocalData(final boolean email) {
-        new Thread("DumpLogsToLocalData") {
-            @Override
-            public void run() {
-                boolean success = false;
-                sDateStamp.setTime(sRunStart);
-                String FILENAME = sDateStamp.getMonth() + "-"
-                        + sDateStamp.getDay() + "_"
-                        + sDateStamp.getHours() + "-"
-                        + sDateStamp.getMinutes() + "_"
-                        + sDateStamp.getSeconds() + ".txt";
-
-                FileOutputStream fos = null;
-                File outFile = null;
-                try {
-                    outFile = new File(getFilesDir(), FILENAME);
-                    outFile.createNewFile();
-                    fos = new FileOutputStream(outFile);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-                if (fos != null) {
-                    PrintWriter writer = new PrintWriter(fos);
-
-                    writer.println(" ");
-                    writer.println("Debug logs: ");
-                    synchronized (sDumpLogs) {
-                        for (int i = 0; i < sDumpLogs.size(); i++) {
-                            writer.println("  " + sDumpLogs.get(i));
-                        }
-                    }
-                    writer.close();
-                }
-                try {
-                    if (fos != null) {
-                        fos.close();
-                        success = true;
-                    }
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-
-                if (success && email) {
-                    if (!emailSent()) {
-                        emailFile(outFile);
-                    }
-                }
+        if (DEBUG_DUMP_LOG) {
+            sDateStamp.setTime(System.currentTimeMillis());
+            synchronized (sDumpLogs) {
+                sDumpLogs.add(sDateFormat.format(sDateStamp) + ": " + tag + ", " + log);
             }
-        }.start();
+        }
     }
 
-    private void emailFile(File file) {
-        File publicCopy = new File(Environment.getExternalStorageDirectory(), file.getName());
-        try {
-            copyFile(file, publicCopy);
-        } catch (IOException e) {
-            e.printStackTrace();
-            return;
+    public void dumpLogsToLocalData() {
+        if (DEBUG_DUMP_LOG) {
+            new Thread("DumpLogsToLocalData") {
+                @Override
+                public void run() {
+                    boolean success = false;
+                    sDateStamp.setTime(sRunStart);
+                    String FILENAME = sDateStamp.getMonth() + "-"
+                            + sDateStamp.getDay() + "_"
+                            + sDateStamp.getHours() + "-"
+                            + sDateStamp.getMinutes() + "_"
+                            + sDateStamp.getSeconds() + ".txt";
+
+                    FileOutputStream fos = null;
+                    File outFile = null;
+                    try {
+                        outFile = new File(getFilesDir(), FILENAME);
+                        outFile.createNewFile();
+                        fos = new FileOutputStream(outFile);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    if (fos != null) {
+                        PrintWriter writer = new PrintWriter(fos);
+
+                        writer.println(" ");
+                        writer.println("Debug logs: ");
+                        synchronized (sDumpLogs) {
+                            for (int i = 0; i < sDumpLogs.size(); i++) {
+                                writer.println("  " + sDumpLogs.get(i));
+                            }
+                        }
+                        writer.close();
+                    }
+                    try {
+                        if (fos != null) {
+                            fos.close();
+                            success = true;
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }.start();
         }
-
-        Intent intent = new Intent(Intent.ACTION_SEND);
-        intent.setType("text/plain");
-        intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"adamcohen@google.com, winsonc@google.com," +
-			"mikejurka@google"});
-        intent.putExtra(Intent.EXTRA_SUBJECT, "Data corruption " + file.getName());
-        intent.putExtra(Intent.EXTRA_TEXT, "Data corruption has occurred, logs attached");
-
-        if (!file.exists() || !file.canRead()) {
-            Toast.makeText(this, "Attachment Error", Toast.LENGTH_SHORT).show();
-            finish();
-            return;
-        }
-
-        Toast.makeText(this, "Data corruption has occurred, please send e-mail", Toast.LENGTH_LONG);
-        Uri uri = Uri.fromFile(publicCopy);
-        intent.putExtra(Intent.EXTRA_STREAM, uri);
-        startActivity(Intent.createChooser(intent, "Please send logs, consider clearing data"));
-
-        setEmailSent(true);
-    }
-
-    public void copyFile(File src, File dst) throws IOException {
-        InputStream in = new FileInputStream(src);
-        OutputStream out = new FileOutputStream(dst);
-
-        // Transfer bytes from in to out
-        byte[] buf = new byte[1024];
-        int len;
-        while ((len = in.read(buf)) > 0) {
-            out.write(buf, 0, len);
-        }
-        in.close();
-        out.close();
     }
 }
 
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index aaa901a..bc0d1bc 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -170,7 +170,7 @@
         public void bindPackagesUpdated(ArrayList<Object> widgetsAndShortcuts);
         public void bindSearchablesChanged();
         public void onPageBoundSynchronously(int page);
-        public void dumpLogsToLocalData(boolean email);
+        public void dumpLogsToLocalData();
     }
 
     public interface ItemInfoFilter {
@@ -286,7 +286,6 @@
     }
     public void addAndBindAddedApps(final Context context, final ArrayList<ItemInfo> added,
                                     final Callbacks callbacks, final ArrayList<AppInfo> addedApps) {
-        Launcher.addDumpLog(TAG, "10249126 - addAndBindAddedApps()", true);
         if (added.isEmpty()) {
             return;
         }
@@ -333,7 +332,6 @@
                                     workspaceScreens.size());
                             while (numPagesToAdd > 0) {
                                 long screenId = lp.generateNewScreenId();
-                                Launcher.addDumpLog(TAG, "10249126 - addAndBindAddedApps(" + screenId + ")", true);
                                 // Save the screen id for binding in the workspace
                                 workspaceScreens.add(screenId);
                                 addedWorkspaceScreensFinal.add(screenId);
@@ -365,8 +363,6 @@
                     }
                 }
 
-                Launcher.addDumpLog(TAG, "10249126 - addAndBindAddedApps - updateWorkspaceScreenOrder(" + workspaceScreens.size() + ")", true);
-
                 // Update the workspace screens
                 updateWorkspaceScreenOrder(context, workspaceScreens);
 
@@ -571,7 +567,6 @@
                     String msg = "item: " + item + " container being set to: " +
                             item.container + ", not in the list of folders";
                     Log.e(TAG, msg);
-                    Launcher.dumpDebugLogsToConsole();
                 }
             }
 
@@ -632,11 +627,6 @@
      */
     static void moveItemInDatabase(Context context, final ItemInfo item, final long container,
             final long screenId, final int cellX, final int cellY) {
-        String transaction = "DbDebug    Modify item (" + item.title + ") in db, id: " + item.id +
-                " (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY +
-                ") --> " + "(" + container + ", " + screenId + ", " + cellX + ", " + cellY + ")";
-        Launcher.addDumpLog(TAG, transaction, true);
-
         item.container = container;
         item.cellX = cellX;
         item.cellY = cellY;
@@ -671,11 +661,6 @@
 
         for (int i = 0; i < count; i++) {
             ItemInfo item = items.get(i);
-            String transaction = "DbDebug    Modify item (" + item.title + ") in db, id: "
-                    + item.id + " (" + item.container + ", " + item.screenId + ", " + item.cellX
-                    + ", " + item.cellY + ") --> " + "(" + container + ", " + screen + ", "
-                    + item.cellX + ", " + item.cellY + ")";
-            Launcher.addDumpLog(TAG, transaction, true);
             item.container = container;
 
             // We store hotseat items in canonical form which is this orientation invariant position
@@ -704,11 +689,6 @@
      */
     static void modifyItemInDatabase(Context context, final ItemInfo item, final long container,
             final long screenId, final int cellX, final int cellY, final int spanX, final int spanY) {
-        String transaction = "DbDebug    Modify item (" + item.title + ") in db, id: " + item.id +
-                " (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY +
-                ") --> " + "(" + container + ", " + screenId + ", " + cellX + ", " + cellY + ")";
-        Launcher.addDumpLog(TAG, transaction, true);
-
         item.cellX = cellX;
         item.cellY = cellY;
         item.spanX = spanX;
@@ -874,11 +854,6 @@
 
         Runnable r = new Runnable() {
             public void run() {
-                String transaction = "DbDebug    Add item (" + item.title + ") to db, id: "
-                        + item.id + " (" + container + ", " + screenId + ", " + cellX + ", "
-                        + cellY + ")";
-                Launcher.addDumpLog(TAG, transaction, true);
-
                 cr.insert(notify ? LauncherSettings.Favorites.CONTENT_URI :
                         LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION, values);
 
@@ -901,7 +876,6 @@
                                     String msg = "adding item: " + item + " to a folder that " +
                                             " doesn't exist";
                                     Log.e(TAG, msg);
-                                    Launcher.dumpDebugLogsToConsole();
                                 }
                             }
                             break;
@@ -935,11 +909,6 @@
 
         Runnable r = new Runnable() {
             public void run() {
-                String transaction = "DbDebug    Delete item (" + item.title + ") from db, id: "
-                        + item.id + " (" + item.container + ", " + item.screenId + ", " + item.cellX +
-                        ", " + item.cellY + ")";
-                Launcher.addDumpLog(TAG, transaction, true);
-
                 cr.delete(uriToDelete, null, null);
 
                 // Lock on mBgLock *after* the db operation
@@ -954,7 +923,6 @@
                                     String msg = "deleting a folder (" + item + ") which still " +
                                             "contains items (" + info + ")";
                                     Log.e(TAG, msg);
-                                    Launcher.dumpDebugLogsToConsole();
                                 }
                             }
                             sBgWorkspaceItems.remove(item);
@@ -980,7 +948,6 @@
      * a list of screen ids in the order that they should appear.
      */
     void updateWorkspaceScreenOrder(Context context, final ArrayList<Long> screens) {
-        Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder()", true);
         final ArrayList<Long> screensCopy = new ArrayList<Long>(screens);
         final ContentResolver cr = context.getContentResolver();
         final Uri uri = LauncherSettings.WorkspaceScreens.CONTENT_URI;
@@ -990,17 +957,10 @@
         while (iter.hasNext()) {
             long id = iter.next();
             if (id < 0) {
-                Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - remove: " + id + ")", true);
                 iter.remove();
             }
         }
 
-        // Dump the screens copy
-        Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - screensCopy", true);
-        for (Long l : screensCopy) {
-            Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-        }
-
         Runnable r = new Runnable() {
             @Override
             public void run() {
@@ -1013,26 +973,13 @@
                     long screenId = screensCopy.get(i);
                     v.put(LauncherSettings.WorkspaceScreens._ID, screenId);
                     v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i);
-                    Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder(" + screenId + ", " + i + ")", true);
                     values[i] = v;
                 }
                 cr.bulkInsert(uri, values);
 
                 synchronized (sBgLock) {
-                    // Dump the sBgWorkspaceScreens
-                    Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - pre clear", true);
-                    for (Long l : sBgWorkspaceScreens) {
-                        Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-                    }
-
                     sBgWorkspaceScreens.clear();
                     sBgWorkspaceScreens.addAll(screensCopy);
-
-                    // Dump the sBgWorkspaceScreens
-                    Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - post clear", true);
-                    for (Long l : sBgWorkspaceScreens) {
-                        Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-                    }
                 }
             }
         };
@@ -1273,9 +1220,6 @@
                 try {
                     long screenId = sc.getLong(idIndex);
                     int rank = sc.getInt(rankIndex);
-
-                    Launcher.addDumpLog(TAG, "10249126 - loadWorkspaceScreensDb(" + screenId + ", " + rank + ")", true);
-
                     orderedScreens.put(rank, screenId);
                 } catch (Exception e) {
                     Launcher.addDumpLog(TAG, "Desktop items loading interrupted - invalid screens: " + e, true);
@@ -1343,7 +1287,6 @@
                 isUpgradePath = loadWorkspace();
                 synchronized (LoaderTask.this) {
                     if (mStopped) {
-                        Launcher.addDumpLog(TAG, "10249126 - loadAndBindWorkspace() stopped", true);
                         return isUpgradePath;
                     }
                     mWorkspaceLoaded = true;
@@ -1484,10 +1427,7 @@
             if (AppsCustomizePagedView.DISABLE_ALL_APPS) {
                 // Ensure that all the applications that are in the system are
                 // represented on the home screen.
-                Launcher.addDumpLog(TAG, "10249126 - verifyApplications - useMoreApps="
-                        + UPGRADE_USE_MORE_APPS_FOLDER + " isUpgrade=" + isUpgrade, true);
                 if (!UPGRADE_USE_MORE_APPS_FOLDER || !isUpgrade) {
-                    Launcher.addDumpLog(TAG, "10249126 - verifyApplications(" + isUpgrade + ")", true);
                     verifyApplications();
                 }
             }
@@ -1507,7 +1447,6 @@
 
         public void stopLocked() {
             synchronized (LoaderTask.this) {
-                Launcher.addDumpLog(TAG, "10249126 - STOPPED", true);
                 mStopped = true;
                 this.notify();
             }
@@ -1552,7 +1491,6 @@
             synchronized (sBgLock) {
                 for (AppInfo app : mBgAllAppsList.data) {
                     tmpInfos = getItemInfoForComponentName(app.componentName);
-                    Launcher.addDumpLog(TAG, "10249126 - \t" + app.componentName.getPackageName() + ", " + tmpInfos.isEmpty(), true);
                     if (tmpInfos.isEmpty()) {
                         // We are missing an application icon, so add this to the workspace
                         added.add(app);
@@ -1667,7 +1605,6 @@
 
             synchronized (sBgLock) {
                 clearSBgDataStructures();
-                Launcher.addDumpLog(TAG, "10249126 - loadWorkspace()", true);
 
                 final ArrayList<Long> itemsToRemove = new ArrayList<Long>();
                 final Uri contentUri = LauncherSettings.Favorites.CONTENT_URI;
@@ -1720,7 +1657,6 @@
                     long id;
                     Intent intent;
 
-                    Launcher.addDumpLog(TAG, "10249126 - Num rows: " + c.getCount(), true);
                     while (!mStopped && c.moveToNext()) {
                         try {
                             int itemType = c.getInt(itemTypeIndex);
@@ -1739,7 +1675,6 @@
                                             Uri uri = LauncherSettings.Favorites.getContentUri(id,
                                                     false);
                                             contentResolver.delete(uri, null, null);
-                                            Launcher.addDumpLog(TAG, "Invalid package removed: " + cn, true);
                                         } else {
                                             // If apps can be on external storage, then we just
                                             // leave them for the user to remove (maybe add
@@ -1932,7 +1867,6 @@
 
                 // Break early if we've stopped loading
                 if (mStopped) {
-                    Launcher.addDumpLog(TAG, "10249126 - loadWorkspace() - Stopped", true);
                     clearSBgDataStructures();
                     return false;
                 }
@@ -1956,14 +1890,12 @@
                 }
 
                 if (loadedOldDb) {
-                    Launcher.addDumpLog(TAG, "10249126 - loadWorkspace - loadedOldDb", true);
                     long maxScreenId = 0;
                     // If we're importing we use the old screen order.
                     for (ItemInfo item: sBgItemsIdMap.values()) {
                         long screenId = item.screenId;
                         if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
                                 !sBgWorkspaceScreens.contains(screenId)) {
-                            Launcher.addDumpLog(TAG, "10249126 - loadWorkspace-loadedOldDb(" + screenId + ")", true);
                             sBgWorkspaceScreens.add(screenId);
                             if (screenId > maxScreenId) {
                                 maxScreenId = screenId;
@@ -1972,12 +1904,6 @@
                     }
                     Collections.sort(sBgWorkspaceScreens);
 
-                    // Dump the sBgWorkspaceScreens
-                    Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens", true);
-                    for (Long l : sBgWorkspaceScreens) {
-                        Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-                    }
-
                     LauncherAppState.getLauncherProvider().updateMaxScreenId(maxScreenId);
                     updateWorkspaceScreenOrder(context, sBgWorkspaceScreens);
 
@@ -1989,50 +1915,24 @@
                     }
                     LauncherAppState.getLauncherProvider().updateMaxItemId(maxItemId);
                 } else {
-                    Launcher.addDumpLog(TAG, "10249126 - loadWorkspace - !loadedOldDb [" + sWorkerThread.getThreadId() + ", " + Process.myTid() + "]", true);
                     TreeMap<Integer, Long> orderedScreens = loadWorkspaceScreensDb(mContext);
                     for (Integer i : orderedScreens.keySet()) {
-                        Launcher.addDumpLog(TAG, "10249126 - adding to sBgWorkspaceScreens: " + orderedScreens.get(i), true);
                         sBgWorkspaceScreens.add(orderedScreens.get(i));
                     }
 
                     // Remove any empty screens
                     ArrayList<Long> unusedScreens = new ArrayList<Long>(sBgWorkspaceScreens);
-                    for (Long l : unusedScreens) {
-                        Launcher.addDumpLog(TAG, "10249126 - unused screens: " + l, true);
-                    }
-
-                    Launcher.addDumpLog(TAG, "10249126 - sBgItemsIdMap [" + sWorkerThread.getThreadId() + ", " + Process.myTid() + "]", true);
                     for (ItemInfo item: sBgItemsIdMap.values()) {
                         long screenId = item.screenId;
-                        Launcher.addDumpLog(TAG, "10249126 - \t" + item.container + ", " + screenId + " - " + unusedScreens.contains(screenId) + " | " + item, true);
-
                         if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
                                 unusedScreens.contains(screenId)) {
                             unusedScreens.remove(screenId);
-                            Launcher.addDumpLog(TAG, "10249126 - \t\tRemoving " + screenId, true);
-                            for (Long l : unusedScreens) {
-                                Launcher.addDumpLog(TAG, "10249126 - \t\t\t unused screens: " + l, true);
-                            }
                         }
                     }
 
                     // If there are any empty screens remove them, and update.
                     if (unusedScreens.size() != 0) {
-                        // Dump the sBgWorkspaceScreens
-                        Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - pre removeAll", true);
-                        for (Long l : sBgWorkspaceScreens) {
-                            Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-                        }
-
                         sBgWorkspaceScreens.removeAll(unusedScreens);
-
-                        // Dump the sBgWorkspaceScreens
-                        Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - post removeAll", true);
-                        for (Long l : sBgWorkspaceScreens) {
-                            Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-                        }
-
                         updateWorkspaceScreenOrder(context, sBgWorkspaceScreens);
                     }
                 }
@@ -2185,16 +2085,6 @@
 
         private void bindWorkspaceScreens(final Callbacks oldCallbacks,
                 final ArrayList<Long> orderedScreens) {
-            Launcher.addDumpLog(TAG, "10249126 - bindWorkspaceScreens()", true);
-
-            // Dump the orderedScreens
-            synchronized (sBgLock) {
-                Launcher.addDumpLog(TAG, "10249126 - orderedScreens", true);
-                for (Long l : sBgWorkspaceScreens) {
-                    Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-                }
-            }
-
             final Runnable r = new Runnable() {
                 @Override
                 public void run() {
@@ -2278,7 +2168,6 @@
          * Binds all loaded data to actual views on the main thread.
          */
         private void bindWorkspace(int synchronizeBindPage, final boolean isUpgradePath) {
-            Launcher.addDumpLog(TAG, "10249126 - bindWorkspace(" + synchronizeBindPage + ", " + isUpgradePath + ")", true);
             final long t = SystemClock.uptimeMillis();
             Runnable r;
 
@@ -2679,12 +2568,11 @@
             });
 
             // Write all the logs to disk
-            Launcher.addDumpLog(TAG, "10249126 - PackageUpdatedTask - dumping logs to disk", true);
             mHandler.post(new Runnable() {
                 public void run() {
                     Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                     if (callbacks == cb && cb != null) {
-                        callbacks.dumpLogsToLocalData(false);
+                        callbacks.dumpLogsToLocalData();
                     }
                 }
             });
diff --git a/src/com/android/launcher3/LiveWallpaperListAdapter.java b/src/com/android/launcher3/LiveWallpaperListAdapter.java
new file mode 100644
index 0000000..a6facaa
--- /dev/null
+++ b/src/com/android/launcher3/LiveWallpaperListAdapter.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2010 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.app.WallpaperInfo;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.service.wallpaper.WallpaperService;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.TextView;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class LiveWallpaperListAdapter extends BaseAdapter implements ListAdapter {
+    private static final String LOG_TAG = "LiveWallpaperListAdapter";
+
+    private final LayoutInflater mInflater;
+    private final PackageManager mPackageManager;
+
+    private List<LiveWallpaperInfo> mWallpapers;
+
+    @SuppressWarnings("unchecked")
+    public LiveWallpaperListAdapter(Context context) {
+        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mPackageManager = context.getPackageManager();
+
+        List<ResolveInfo> list = mPackageManager.queryIntentServices(
+                new Intent(WallpaperService.SERVICE_INTERFACE),
+                PackageManager.GET_META_DATA);
+
+        mWallpapers = generatePlaceholderViews(list.size());
+
+        new LiveWallpaperEnumerator(context).execute(list);
+    }
+
+    private List<LiveWallpaperInfo> generatePlaceholderViews(int amount) {
+        ArrayList<LiveWallpaperInfo> list = new ArrayList<LiveWallpaperInfo>(amount);
+        for (int i = 0; i < amount; i++) {
+            LiveWallpaperInfo info = new LiveWallpaperInfo();
+            list.add(info);
+        }
+        return list;
+    }
+
+    public int getCount() {
+        if (mWallpapers == null) {
+            return 0;
+        }
+        return mWallpapers.size();
+    }
+
+    public Object getItem(int position) {
+        return mWallpapers.get(position);
+    }
+
+    public long getItemId(int position) {
+        return position;
+    }
+
+    public View getView(int position, View convertView, ViewGroup parent) {
+        View view;
+
+        if (convertView == null) {
+            view = mInflater.inflate(R.layout.live_wallpaper_picker_item, parent, false);
+        } else {
+            view = convertView;
+        }
+
+        WallpaperPickerActivity.setWallpaperItemPaddingToZero((FrameLayout) view);
+
+        LiveWallpaperInfo wallpaperInfo = mWallpapers.get(position);
+        ImageView image = (ImageView) view.findViewById(R.id.wallpaper_image);
+        ImageView icon = (ImageView) view.findViewById(R.id.wallpaper_icon);
+        if (wallpaperInfo.thumbnail != null) {
+            image.setImageDrawable(wallpaperInfo.thumbnail);
+            icon.setVisibility(View.GONE);
+        } else {
+            icon.setImageDrawable(wallpaperInfo.info.loadIcon(mPackageManager));
+            icon.setVisibility(View.VISIBLE);
+        }
+
+        TextView label = (TextView) view.findViewById(R.id.wallpaper_item_label);
+        label.setText(wallpaperInfo.info.loadLabel(mPackageManager));
+
+        return view;
+    }
+
+    public class LiveWallpaperInfo {
+        public Drawable thumbnail;
+        public WallpaperInfo info;
+        public Intent intent;
+    }
+
+    private class LiveWallpaperEnumerator extends
+            AsyncTask<List<ResolveInfo>, LiveWallpaperInfo, Void> {
+        private Context mContext;
+        private int mWallpaperPosition;
+
+        public LiveWallpaperEnumerator(Context context) {
+            super();
+            mContext = context;
+            mWallpaperPosition = 0;
+        }
+
+        @Override
+        protected Void doInBackground(List<ResolveInfo>... params) {
+            final PackageManager packageManager = mContext.getPackageManager();
+
+            List<ResolveInfo> list = params[0];
+
+            Collections.sort(list, new Comparator<ResolveInfo>() {
+                final Collator mCollator;
+
+                {
+                    mCollator = Collator.getInstance();
+                }
+
+                public int compare(ResolveInfo info1, ResolveInfo info2) {
+                    return mCollator.compare(info1.loadLabel(packageManager),
+                            info2.loadLabel(packageManager));
+                }
+            });
+
+            for (ResolveInfo resolveInfo : list) {
+                WallpaperInfo info = null;
+                try {
+                    info = new WallpaperInfo(mContext, resolveInfo);
+                } catch (XmlPullParserException e) {
+                    Log.w(LOG_TAG, "Skipping wallpaper " + resolveInfo.serviceInfo, e);
+                    continue;
+                } catch (IOException e) {
+                    Log.w(LOG_TAG, "Skipping wallpaper " + resolveInfo.serviceInfo, e);
+                    continue;
+                }
+
+                LiveWallpaperInfo wallpaper = new LiveWallpaperInfo();
+                wallpaper.intent = new Intent(WallpaperService.SERVICE_INTERFACE);
+                wallpaper.intent.setClassName(info.getPackageName(), info.getServiceName());
+                wallpaper.info = info;
+
+                Drawable thumb = info.loadThumbnail(packageManager);
+                // TODO: generate a default thumb
+                /*
+                final Resources res = mContext.getResources();
+                Canvas canvas = new Canvas();
+                Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
+                paint.setTextAlign(Paint.Align.CENTER);
+                BitmapDrawable galleryIcon = (BitmapDrawable) res.getDrawable(
+                        R.drawable.livewallpaper_placeholder);
+                if (thumb == null) {
+                    int thumbWidth = res.getDimensionPixelSize(
+                            R.dimen.live_wallpaper_thumbnail_width);
+                    int thumbHeight = res.getDimensionPixelSize(
+                            R.dimen.live_wallpaper_thumbnail_height);
+
+                    Bitmap thumbnail = Bitmap.createBitmap(thumbWidth, thumbHeight,
+                            Bitmap.Config.ARGB_8888);
+
+                    paint.setColor(res.getColor(R.color.live_wallpaper_thumbnail_background));
+                    canvas.setBitmap(thumbnail);
+                    canvas.drawPaint(paint);
+
+                    galleryIcon.setBounds(0, 0, thumbWidth, thumbHeight);
+                    galleryIcon.setGravity(Gravity.CENTER);
+                    galleryIcon.draw(canvas);
+
+                    String title = info.loadLabel(packageManager).toString();
+
+                    paint.setColor(res.getColor(R.color.live_wallpaper_thumbnail_text_color));
+                    paint.setTextSize(
+                            res.getDimensionPixelSize(R.dimen.live_wallpaper_thumbnail_text_size));
+
+                    canvas.drawText(title, (int) (thumbWidth * 0.5),
+                            thumbHeight - res.getDimensionPixelSize(
+                                    R.dimen.live_wallpaper_thumbnail_text_offset), paint);
+
+                    thumb = new BitmapDrawable(res, thumbnail);
+                }*/
+                wallpaper.thumbnail = thumb;
+                publishProgress(wallpaper);
+            }
+
+            return null;
+        }
+
+        @Override
+        protected void onProgressUpdate(LiveWallpaperInfo...infos) {
+            for (LiveWallpaperInfo info : infos) {
+                info.thumbnail.setDither(true);
+                if (mWallpaperPosition < mWallpapers.size()) {
+                    mWallpapers.set(mWallpaperPosition, info);
+                } else {
+                    mWallpapers.add(info);
+                }
+                mWallpaperPosition++;
+                if (mWallpaperPosition == getCount()) {
+                    LiveWallpaperListAdapter.this.notifyDataSetChanged();
+                }
+            }
+        }
+    }
+}
diff --git a/src/com/android/launcher3/PageIndicatorMarker.java b/src/com/android/launcher3/PageIndicatorMarker.java
index f64c14f..1ad0abb 100644
--- a/src/com/android/launcher3/PageIndicatorMarker.java
+++ b/src/com/android/launcher3/PageIndicatorMarker.java
@@ -57,26 +57,38 @@
         if (immediate) {
             mActiveMarker.animate().cancel();
             mActiveMarker.setAlpha(1f);
+            mActiveMarker.setScaleX(1f);
+            mActiveMarker.setScaleY(1f);
             mInactiveMarker.animate().cancel();
             mInactiveMarker.setAlpha(0f);
         } else {
-            mActiveMarker.animate().alpha(1f)
+            mActiveMarker.animate()
+                    .alpha(1f)
+                    .scaleX(1f)
+                    .scaleY(1f)
                     .setDuration(MARKER_FADE_DURATION).start();
-            mInactiveMarker.animate().alpha(0f)
+            mInactiveMarker.animate()
+                    .alpha(0f)
                     .setDuration(MARKER_FADE_DURATION).start();
         }
         mIsActive = true;
     }
+
     void inactivate(boolean immediate) {
         if (immediate) {
             mInactiveMarker.animate().cancel();
             mInactiveMarker.setAlpha(1f);
             mActiveMarker.animate().cancel();
             mActiveMarker.setAlpha(0f);
+            mActiveMarker.setScaleX(0.5f);
+            mActiveMarker.setScaleY(0.5f);
         } else {
             mInactiveMarker.animate().alpha(1f)
                     .setDuration(MARKER_FADE_DURATION).start();
-            mActiveMarker.animate().alpha(0f)
+            mActiveMarker.animate()
+                    .alpha(0f)
+                    .scaleX(0.5f)
+                    .scaleY(0.5f)
                     .setDuration(MARKER_FADE_DURATION).start();
         }
         mIsActive = false;
diff --git a/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java b/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
new file mode 100644
index 0000000..9fd0d0a
--- /dev/null
+++ b/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2010 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.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
+import android.widget.ListAdapter;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ThirdPartyWallpaperPickerListAdapter extends BaseAdapter implements ListAdapter {
+    private static final String LOG_TAG = "LiveWallpaperListAdapter";
+
+    private final LayoutInflater mInflater;
+    private final PackageManager mPackageManager;
+
+    private List<ResolveInfo> mThirdPartyWallpaperPickers = new ArrayList<ResolveInfo>();
+
+    public ThirdPartyWallpaperPickerListAdapter(Context context) {
+        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mPackageManager = context.getPackageManager();
+        final PackageManager pm = mPackageManager;
+
+        final Intent pickWallpaperIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
+        final List<ResolveInfo> apps =
+                pm.queryIntentActivities(pickWallpaperIntent, 0);
+
+        // Get list of image picker intents
+        Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT);
+        pickImageIntent.setType("image/*");
+        final List<ResolveInfo> imagePickerActivities =
+                pm.queryIntentActivities(pickImageIntent, 0);
+        final ComponentName[] imageActivities = new ComponentName[imagePickerActivities.size()];
+        for (int i = 0; i < imagePickerActivities.size(); i++) {
+            ActivityInfo activityInfo = imagePickerActivities.get(i).activityInfo;
+            imageActivities[i] = new ComponentName(activityInfo.packageName, activityInfo.name);
+        }
+
+        outerLoop:
+        for (ResolveInfo info : apps) {
+            final ComponentName itemComponentName =
+                    new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
+            final String itemPackageName = itemComponentName.getPackageName();
+            // Exclude anything from our own package, and the old Launcher,
+            // and live wallpaper picker
+            if (itemPackageName.equals(context.getPackageName()) ||
+                    itemPackageName.equals("com.android.launcher") ||
+                    itemPackageName.equals("com.android.wallpaper.livepicker")) {
+                continue;
+            }
+            // Exclude any package that already responds to the image picker intent
+            for (ResolveInfo imagePickerActivityInfo : imagePickerActivities) {
+                if (itemPackageName.equals(
+                        imagePickerActivityInfo.activityInfo.packageName)) {
+                    continue outerLoop;
+                }
+            }
+            mThirdPartyWallpaperPickers.add(info);
+        }
+    }
+
+    public int getCount() {
+        return mThirdPartyWallpaperPickers.size();
+    }
+
+    public Object getItem(int position) {
+        return mThirdPartyWallpaperPickers.get(position);
+    }
+
+    public long getItemId(int position) {
+        return position;
+    }
+
+    public View getView(int position, View convertView, ViewGroup parent) {
+        View view;
+
+        if (convertView == null) {
+            view = mInflater.inflate(R.layout.third_party_wallpaper_picker_item, parent, false);
+        } else {
+            view = convertView;
+        }
+
+        WallpaperPickerActivity.setWallpaperItemPaddingToZero((FrameLayout) view);
+
+        ResolveInfo info = mThirdPartyWallpaperPickers.get(position);
+        TextView label = (TextView) view.findViewById(R.id.wallpaper_item_label);
+        label.setText(info.loadLabel(mPackageManager));
+        label.setCompoundDrawablesWithIntrinsicBounds(
+                null, info.loadIcon(mPackageManager), null, null);
+        return view;
+    }
+}
diff --git a/src/com/android/launcher3/WallpaperPickerActivity.java b/src/com/android/launcher3/WallpaperPickerActivity.java
index 824dea6..7774609 100644
--- a/src/com/android/launcher3/WallpaperPickerActivity.java
+++ b/src/com/android/launcher3/WallpaperPickerActivity.java
@@ -19,6 +19,8 @@
 import android.animation.LayoutTransition;
 import android.app.ActionBar;
 import android.app.Activity;
+import android.app.WallpaperInfo;
+import android.app.WallpaperManager;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -27,8 +29,10 @@
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.database.Cursor;
+import android.database.DataSetObserver;
 import android.graphics.Bitmap;
 import android.graphics.Point;
+import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.drawable.Drawable;
@@ -66,6 +70,7 @@
 
     private static final int IMAGE_PICK = 5;
     private static final int PICK_WALLPAPER_THIRD_PARTY_ACTIVITY = 6;
+    private static final int PICK_LIVE_WALLPAPER = 7;
     private static final String TEMP_WALLPAPER_TILES = "TEMP_WALLPAPER_TILES";
 
     private ArrayList<Drawable> mBundledWallpaperThumbs;
@@ -85,12 +90,15 @@
 
     ArrayList<Uri> mTempWallpaperTiles = new ArrayList<Uri>();
     private SavedWallpaperImages mSavedImages;
+    private WallpaperInfo mLiveWallpaperInfoOnPickerLaunch;
 
     private static class ThumbnailMetaData {
-        public boolean mLaunchesGallery;
+        public TileType mTileType;
         public Uri mWallpaperUri;
         public int mSavedWallpaperDbId;
         public int mWallpaperResId;
+        public LiveWallpaperListAdapter.LiveWallpaperInfo mLiveWallpaperInfo;
+        public ResolveInfo mThirdPartyWallpaperPickerInfo;
     }
 
     // called by onCreate; this is subclassed to overwrite WallpaperCropActivity
@@ -142,29 +150,38 @@
                 }
 
                 ThumbnailMetaData meta = (ThumbnailMetaData) v.getTag();
-
-                if (!meta.mLaunchesGallery) {
+                if (meta.mTileType == TileType.WALLPAPER_RESOURCE ||
+                        meta.mTileType == TileType.SAVED_WALLPAPER ||
+                        meta.mTileType == TileType.WALLPAPER_URI) {
                     mSelectedThumb = v;
                     v.setSelected(true);
                 }
-
-                if (meta.mLaunchesGallery) {
+                if (meta.mTileType == TileType.PICK_IMAGE) {
                     Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                     intent.setType("image/*");
                     Utilities.startActivityForResultSafely(
                             WallpaperPickerActivity.this, intent, IMAGE_PICK);
-                } else if (meta.mWallpaperUri != null) {
+                } else if (meta.mTileType == TileType.WALLPAPER_URI) {
                     mCropView.setTileSource(new BitmapRegionTileSource(WallpaperPickerActivity.this,
                             meta.mWallpaperUri, 1024, 0), null);
                     mCropView.setTouchEnabled(true);
-                } else if (meta.mSavedWallpaperDbId != 0) {
+                } else if (meta.mTileType == TileType.SAVED_WALLPAPER) {
                     String imageFilename = mSavedImages.getImageFilename(meta.mSavedWallpaperDbId);
                     File file = new File(getFilesDir(), imageFilename);
                     mCropView.setTileSource(new BitmapRegionTileSource(WallpaperPickerActivity.this,
                             file.getAbsolutePath(), 1024, 0), null);
                     mCropView.moveToLeft();
                     mCropView.setTouchEnabled(false);
-                } else if (meta.mWallpaperResId != 0) {
+                } else if (meta.mTileType == TileType.LIVE_WALLPAPER) {
+                    Intent preview = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
+                    preview.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
+                            meta.mLiveWallpaperInfo.info.getComponent());
+                    WallpaperManager wm =
+                            WallpaperManager.getInstance(WallpaperPickerActivity.this);
+                    mLiveWallpaperInfoOnPickerLaunch = wm.getWallpaperInfo();
+                    Utilities.startActivityForResultSafely(WallpaperPickerActivity.this,
+                            preview, PICK_LIVE_WALLPAPER);
+                } else if (meta.mTileType == TileType.WALLPAPER_RESOURCE) {
                     BitmapRegionTileSource source = new BitmapRegionTileSource(mWallpaperResources,
                             WallpaperPickerActivity.this, meta.mWallpaperResId, 1024, 0);
                     mCropView.setTileSource(source, null);
@@ -175,6 +192,15 @@
                             wallpaperSize.x, wallpaperSize.y, false);
                     mCropView.setScale(wallpaperSize.x / crop.width());
                     mCropView.setTouchEnabled(false);
+                } else if (meta.mTileType == TileType.THIRD_PARTY_WALLPAPER_PICKER) {
+                    ResolveInfo info = meta.mThirdPartyWallpaperPickerInfo;
+
+                    final ComponentName itemComponentName = new ComponentName(
+                            info.activityInfo.packageName, info.activityInfo.name);
+                    Intent launchIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
+                    launchIntent.setComponent(itemComponentName);
+                    Utilities.startActivityForResultSafely(WallpaperPickerActivity.this,
+                            launchIntent, PICK_WALLPAPER_THIRD_PARTY_ACTIVITY);
                 }
             }
         };
@@ -202,7 +228,8 @@
         findBundledWallpapers();
         mWallpapersView = (LinearLayout) findViewById(R.id.wallpaper_list);
         ImageAdapter ia = new ImageAdapter(this, mBundledWallpaperThumbs);
-        populateWallpapersFromAdapter(mWallpapersView, ia, mBundledWallpaperResIds, true, false);
+        populateWallpapersFromAdapter(
+                mWallpapersView, ia, mBundledWallpaperResIds, TileType.WALLPAPER_RESOURCE, false, true);
 
         // Populate the saved wallpapers
         mSavedImages = new SavedWallpaperImages(this);
@@ -210,13 +237,34 @@
         ArrayList<Drawable> savedWallpaperThumbs = mSavedImages.getThumbnails();
         ArrayList<Integer > savedWallpaperIds = mSavedImages.getImageIds();
         ia = new ImageAdapter(this, savedWallpaperThumbs);
-        populateWallpapersFromAdapter(mWallpapersView, ia, savedWallpaperIds, false, true);
+        populateWallpapersFromAdapter(
+                mWallpapersView, ia, savedWallpaperIds, TileType.SAVED_WALLPAPER, true, true);
+
+        // Populate the live wallpapers
+        final LinearLayout liveWallpapersView = (LinearLayout) findViewById(R.id.live_wallpaper_list);
+        final LiveWallpaperListAdapter a = new LiveWallpaperListAdapter(this);
+        a.registerDataSetObserver(new DataSetObserver() {
+            public void onChanged() {
+                liveWallpapersView.removeAllViews();
+                populateWallpapersFromAdapter(
+                        liveWallpapersView, a, null, TileType.LIVE_WALLPAPER, false, false);
+            }
+        });
+
+        // Populate the third-party wallpaper pickers
+        final LinearLayout thirdPartyWallpapersView =
+                (LinearLayout) findViewById(R.id.third_party_wallpaper_list);
+        final ThirdPartyWallpaperPickerListAdapter ta =
+                new ThirdPartyWallpaperPickerListAdapter(this);
+        populateWallpapersFromAdapter(thirdPartyWallpapersView, ta, null,
+                TileType.THIRD_PARTY_WALLPAPER_PICKER, false, false);
 
         // Add a tile for the Gallery
+        LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
         FrameLayout galleryThumbnail = (FrameLayout) getLayoutInflater().
-                inflate(R.layout.wallpaper_picker_gallery_item, mWallpapersView, false);
+                inflate(R.layout.wallpaper_picker_gallery_item, masterWallpaperList, false);
         setWallpaperItemPaddingToZero(galleryThumbnail);
-        mWallpapersView.addView(galleryThumbnail, 0);
+        masterWallpaperList.addView(galleryThumbnail, 0);
 
         // Make its background the last photo taken on external storage
         Bitmap lastPhoto = getThumbnailOfLastPhoto();
@@ -224,10 +272,12 @@
             ImageView galleryThumbnailBg =
                     (ImageView) galleryThumbnail.findViewById(R.id.wallpaper_image);
             galleryThumbnailBg.setImageBitmap(getThumbnailOfLastPhoto());
+            int colorOverlay = getResources().getColor(R.color.wallpaper_picker_translucent_gray);
+            galleryThumbnailBg.setColorFilter(colorOverlay, PorterDuff.Mode.SRC_ATOP);
         }
 
         ThumbnailMetaData meta = new ThumbnailMetaData();
-        meta.mLaunchesGallery = true;
+        meta.mTileType = TileType.PICK_IMAGE;
         galleryThumbnail.setTag(meta);
         galleryThumbnail.setOnClickListener(mThumbnailOnClickListener);
 
@@ -247,7 +297,7 @@
                     @Override
                     public void onClick(View v) {
                         ThumbnailMetaData meta = (ThumbnailMetaData) mSelectedThumb.getTag();
-                        if (meta.mLaunchesGallery) {
+                        if (meta.mTileType == TileType.PICK_IMAGE) {
                             // shouldn't be selected, but do nothing
                         } else if (meta.mWallpaperUri != null) {
                             boolean finishActivityWhenDone = true;
@@ -385,24 +435,39 @@
         }
     }
 
-    private void populateWallpapersFromAdapter(ViewGroup parent, ImageAdapter ia,
-            ArrayList<Integer> imageIds, boolean imagesAreResources, boolean addLongPressHandler) {
-        for (int i = 0; i < ia.getCount(); i++) {
-            FrameLayout thumbnail = (FrameLayout) ia.getView(i, null, parent);
+    private enum TileType {
+        PICK_IMAGE,
+        WALLPAPER_RESOURCE,
+        WALLPAPER_URI,
+        SAVED_WALLPAPER,
+        LIVE_WALLPAPER,
+        THIRD_PARTY_WALLPAPER_PICKER
+        };
+
+    private void populateWallpapersFromAdapter(ViewGroup parent, BaseAdapter adapter,
+            ArrayList<Integer> imageIds, TileType tileType, boolean addLongPressHandler, boolean selectFirstTile) {
+        for (int i = 0; i < adapter.getCount(); i++) {
+            FrameLayout thumbnail = (FrameLayout) adapter.getView(i, null, parent);
             parent.addView(thumbnail, i);
 
             ThumbnailMetaData meta = new ThumbnailMetaData();
-            if (imagesAreResources) {
+            meta.mTileType = tileType;
+            if (tileType == TileType.WALLPAPER_RESOURCE) {
                 meta.mWallpaperResId = imageIds.get(i);
-            } else {
+            } else if (tileType == TileType.SAVED_WALLPAPER) {
                 meta.mSavedWallpaperDbId = imageIds.get(i);
+            } else if (tileType == TileType.LIVE_WALLPAPER) {
+                meta.mLiveWallpaperInfo =
+                        (LiveWallpaperListAdapter.LiveWallpaperInfo) adapter.getItem(i);
+            } else if (tileType == TileType.THIRD_PARTY_WALLPAPER_PICKER) {
+                meta.mThirdPartyWallpaperPickerInfo = (ResolveInfo) adapter.getItem(i);
             }
             thumbnail.setTag(meta);
             if (addLongPressHandler) {
                 addLongPressHandler(thumbnail);
             }
             thumbnail.setOnClickListener(mThumbnailOnClickListener);
-            if (i == 0) {
+            if (i == 0 && selectFirstTile) {
                 mThumbnailOnClickListener.onClick(thumbnail);
             }
         }
@@ -452,9 +517,10 @@
         } else {
             Log.e(TAG, "Error loading thumbnail for uri=" + uri);
         }
-        mWallpapersView.addView(pickedImageThumbnail, 1);
+        mWallpapersView.addView(pickedImageThumbnail, 0);
 
         ThumbnailMetaData meta = new ThumbnailMetaData();
+        meta.mTileType = TileType.WALLPAPER_URI;
         meta.mWallpaperUri = uri;
         pickedImageThumbnail.setTag(meta);
         pickedImageThumbnail.setOnClickListener(mThumbnailOnClickListener);
@@ -466,13 +532,24 @@
             Uri uri = data.getData();
             addTemporaryWallpaperTile(uri);
         } else if (requestCode == PICK_WALLPAPER_THIRD_PARTY_ACTIVITY) {
-            // No result code is returned; just return
             setResult(RESULT_OK);
             finish();
+        } else if (requestCode == PICK_LIVE_WALLPAPER) {
+            WallpaperManager wm = WallpaperManager.getInstance(this);
+            final WallpaperInfo oldLiveWallpaper = mLiveWallpaperInfoOnPickerLaunch;
+            WallpaperInfo newLiveWallpaper = wm.getWallpaperInfo();
+            // Try to figure out if a live wallpaper was set;
+            if (newLiveWallpaper != null &&
+                    (oldLiveWallpaper == null ||
+                    !oldLiveWallpaper.getComponent().equals(newLiveWallpaper.getComponent()))) {
+                // Return if a live wallpaper was set
+                setResult(RESULT_OK);
+                finish();
+            }
         }
     }
 
-    private static void setWallpaperItemPaddingToZero(FrameLayout frameLayout) {
+    static void setWallpaperItemPaddingToZero(FrameLayout frameLayout) {
         frameLayout.setPadding(0, 0, 0, 0);
         frameLayout.setForeground(new ZeroPaddingDrawable(frameLayout.getForeground()));
     }
@@ -481,68 +558,6 @@
         v.setOnLongClickListener(mLongClickListener);
     }
 
-
-    public boolean onMenuItemSelected(int featureId, MenuItem item) {
-        if (item.getIntent() == null) {
-            return super.onMenuItemSelected(featureId, item);
-        } else {
-            Utilities.startActivityForResultSafely(
-                    this, item.getIntent(), PICK_WALLPAPER_THIRD_PARTY_ACTIVITY);
-            return true;
-        }
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        final Intent pickWallpaperIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
-        final PackageManager pm = getPackageManager();
-        final List<ResolveInfo> apps =
-                pm.queryIntentActivities(pickWallpaperIntent, 0);
-
-        SubMenu sub = menu.addSubMenu("Other\u2026"); // TODO: what's the better way to do this?
-        sub.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
-
-
-        // Get list of image picker intents
-        Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT);
-        pickImageIntent.setType("image/*");
-        final List<ResolveInfo> imagePickerActivities =
-                pm.queryIntentActivities(pickImageIntent, 0);
-        final ComponentName[] imageActivities = new ComponentName[imagePickerActivities.size()];
-        for (int i = 0; i < imagePickerActivities.size(); i++) {
-            ActivityInfo activityInfo = imagePickerActivities.get(i).activityInfo;
-            imageActivities[i] = new ComponentName(activityInfo.packageName, activityInfo.name);
-        }
-
-        outerLoop:
-        for (ResolveInfo info : apps) {
-            final ComponentName itemComponentName =
-                    new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
-            final String itemPackageName = itemComponentName.getPackageName();
-            // Exclude anything from our own package, and the old Launcher
-            if (itemPackageName.equals(getPackageName()) ||
-                    itemPackageName.equals("com.android.launcher")) {
-                continue;
-            }
-            // Exclude any package that already responds to the image picker intent
-            for (ResolveInfo imagePickerActivityInfo : imagePickerActivities) {
-                if (itemPackageName.equals(
-                        imagePickerActivityInfo.activityInfo.packageName)) {
-                    continue outerLoop;
-                }
-            }
-            MenuItem mi = sub.add(info.loadLabel(pm));
-            Intent launchIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
-            launchIntent.setComponent(itemComponentName);
-            mi.setIntent(launchIntent);
-            Drawable icon = info.loadIcon(pm);
-            if (icon != null) {
-                mi.setIcon(icon);
-            }
-        }
-        return super.onCreateOptionsMenu(menu);
-    }
-
     private void findBundledWallpapers() {
         mBundledWallpaperThumbs = new ArrayList<Drawable>(24);
         mBundledWallpaperResIds = new ArrayList<Integer>(24);
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 596ac11..41cea6a 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -479,7 +479,6 @@
     }
 
     public void removeAllWorkspaceScreens() {
-        Launcher.addDumpLog(TAG, "10249126 - removeAllWorkspaceScreens()", true);
         // Remove the pages and clear the screen models
         removeAllViews();
         mScreenOrder.clear();
@@ -490,7 +489,6 @@
         // Find the index to insert this view into.  If the empty screen exists, then
         // insert it before that.
         int insertIndex = mScreenOrder.indexOf(EXTRA_EMPTY_SCREEN_ID);
-        Launcher.addDumpLog(TAG, "10249126 - insertNewWorkspaceScreenBeforeEmptyScreen(" + insertIndex + ")", true);
         if (insertIndex < 0) {
             insertIndex = mScreenOrder.size();
         }
@@ -502,9 +500,6 @@
     }
 
     public long insertNewWorkspaceScreen(long screenId, int insertIndex) {
-        String log = "10249126 - insertNewWorkspaceScreen(" + screenId + ", " + insertIndex + ")";
-        Launcher.addDumpLog(TAG, log, true);
-
         if (mWorkspaceScreens.containsKey(screenId)) {
             throw new RuntimeException("Screen id " + screenId + " already exists!");
         }
@@ -522,7 +517,6 @@
     }
 
     public void createCustomContentPage() {
-        Launcher.addDumpLog(TAG, "10249126 - createCustomContentPage()", true);
         CellLayout customScreen = (CellLayout)
                 mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null);
 
@@ -540,8 +534,6 @@
     }
 
     public void removeCustomContentPage() {
-        Launcher.addDumpLog(TAG, "10249126 - removeCustomContentPage()", true);
-
         CellLayout customScreen = getScreenWithId(CUSTOM_CONTENT_SCREEN_ID);
         if (customScreen == null) {
             throw new RuntimeException("Expected custom content screen to exist");
@@ -609,10 +601,7 @@
     }
 
     public void removeExtraEmptyScreen() {
-        int nScreens = getChildCount();
-        nScreens = hasCustomContent() ? nScreens - 1 : nScreens;
-
-        if (mWorkspaceScreens.containsKey(EXTRA_EMPTY_SCREEN_ID) && nScreens > 1) {
+        if (hasExtraEmptyScreen()) {
             CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID);
             mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID);
             mScreenOrder.remove(EXTRA_EMPTY_SCREEN_ID);
@@ -620,13 +609,13 @@
         }
     }
 
+    public boolean hasExtraEmptyScreen() {
+        int nScreens = getChildCount();
+        nScreens = hasCustomContent() ? nScreens - 1 : nScreens;
+        return mWorkspaceScreens.containsKey(EXTRA_EMPTY_SCREEN_ID) && nScreens > 1;
+    }
+
     public long commitExtraEmptyScreen() {
-        Launcher.addDumpLog(TAG, "10249126 - commitExtraEmptyScreen()", true);
-
-        // Write all the logs to disk
-        Launcher.addDumpLog(TAG, "10249126 - commitExtraEmptyScreen() - dumping logs to disk", true);
-        mLauncher.dumpLogsToLocalData(false);
-
         CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID);
         mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID);
         mScreenOrder.remove(EXTRA_EMPTY_SCREEN_ID);
@@ -643,13 +632,11 @@
 
 
     public CellLayout getScreenWithId(long screenId) {
-        Launcher.addDumpLog(TAG, "10249126 - getScreenWithId(" + screenId + ")", true);
         CellLayout layout = mWorkspaceScreens.get(screenId);
         return layout;
     }
 
     public long getIdForScreen(CellLayout layout) {
-        Launcher.addDumpLog(TAG, "10249126 - getIdForScreen()", true);
         Iterator<Long> iter = mWorkspaceScreens.keySet().iterator();
         while (iter.hasNext()) {
             long id = iter.next();
@@ -661,7 +648,6 @@
     }
 
     public int getPageIndexForScreenId(long screenId) {
-        Launcher.addDumpLog(TAG, "10249126 - getPageIndexForScreenId(" + screenId + ")", true);
         return indexOfChild(mWorkspaceScreens.get(screenId));
     }
 
@@ -682,8 +668,6 @@
             return;
         }
 
-        Launcher.addDumpLog(TAG, "10249126 - stripEmptyScreens()", true);
-
         int currentPage = getNextPage();
         ArrayList<Long> removeScreens = new ArrayList<Long>();
         for (Long id: mWorkspaceScreens.keySet()) {
@@ -699,7 +683,6 @@
 
         int pageShift = 0;
         for (Long id: removeScreens) {
-            Launcher.addDumpLog(TAG, "10249126 - \tremove(" + id + ")", true);
             CellLayout cl = mWorkspaceScreens.get(id);
             mWorkspaceScreens.remove(id);
             mScreenOrder.remove(id);
@@ -1058,9 +1041,6 @@
                 sp, mLauncher.getWindowManager(), mWallpaperManager);
     }
 
-
-
-
     protected void snapToPage(int whichPage, Runnable r) {
         if (mDelayedSnapToPageRunnable != null) {
             mDelayedSnapToPageRunnable.run();
@@ -1083,7 +1063,9 @@
         boolean mAnimating;
         long mAnimationStartTime;
         float mAnimationStartOffset;
-        final int ANIMATION_DURATION = 250;
+        private final int ANIMATION_DURATION = 250;
+        // Don't use all the wallpaper for parallax until you have at least this many pages
+        private final int MIN_PARALLAX_PAGE_SPAN = 4;
         int mNumScreens;
 
         public WallpaperOffsetInterpolator() {
@@ -1096,7 +1078,6 @@
             updateOffset(false);
         }
 
-
         private void updateOffset(boolean force) {
             if (mWaitingForUpdate || force) {
                 mWaitingForUpdate = false;
@@ -1138,19 +1119,43 @@
             if (getChildCount() <= 1) {
                 return 0;
             }
-            final int lastIndex = isLayoutRtl() ? 0 : getChildCount() - 1;
+
+            // Exclude the leftmost page
             final int firstIndex = isLayoutRtl() ? getChildCount() - 2 : 1;
+            // Exclude the last extra empty screen (if we have > MIN_PARALLAX_PAGE_SPAN pages)
+            int extra = numExtraScreensToIgnore();
+            final int lastIndex = isLayoutRtl() ? 0 + extra : getChildCount() - 1 - extra;
+
             int firstPageScrollX = getScrollForPage(firstIndex);
             int scrollRange = getScrollForPage(lastIndex) - firstPageScrollX;
             if (scrollRange == 0) {
                 return 0;
             } else {
-                // do different behavior if it's  a live wallpaper?
-                float offset = (getScrollX() - firstPageScrollX) / (float) scrollRange;
-                return offset;
+                // TODO: do different behavior if it's  a live wallpaper?
+                float offset = Math.min(1, (getScrollX() - firstPageScrollX) / (float) scrollRange);
+                offset = Math.max(0, offset);
+                // Don't use up all the wallpaper parallax until you have at least
+                // MIN_PARALLAX_PAGE_SPAN pages
+                int numScrollingPages = getNumScreensExcludingExtraEmptyScreenAndLeftmost();
+                int parallaxPageSpan = Math.max(MIN_PARALLAX_PAGE_SPAN, numScrollingPages) - 1;
+                return offset * (numScrollingPages - 1) / parallaxPageSpan;
             }
         }
 
+        private int numExtraScreensToIgnore() {
+            int numScrollingPages = getChildCount() - 1;
+            if (numScrollingPages > MIN_PARALLAX_PAGE_SPAN && hasExtraEmptyScreen()) {
+                return 1;
+            } else {
+                return 0;
+            }
+        }
+
+        private int getNumScreensExcludingExtraEmptyScreenAndLeftmost() {
+            int numScrollingPages = getChildCount() - 1 - numExtraScreensToIgnore();
+            return numScrollingPages;
+        }
+
         public void syncWithScroll() {
             float offset = wallpaperOffsetForCurrentScroll();
             mWallpaperOffset.setFinalX(offset);
@@ -1179,12 +1184,12 @@
         public void setFinalX(float x) {
             scheduleUpdate();
             mFinalOffset = Math.max(0f, Math.min(x, 1.0f));
-            if (getChildCount() != mNumScreens) {
+            if (getNumScreensExcludingExtraEmptyScreenAndLeftmost() != mNumScreens) {
                 if (mNumScreens > 0) {
                     // Don't animate if we're going from 0 screens
                     animateToFinal();
                 }
-                mNumScreens = getChildCount();
+                mNumScreens = getNumScreensExcludingExtraEmptyScreenAndLeftmost();
             }
         }
 
@@ -1746,7 +1751,6 @@
             mScreenOrder.add(getIdForScreen(cl));
         }
 
-        Launcher.addDumpLog(TAG, "10249126 - onEndReordering()", true);
         mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder);
 
         // Re-enable auto layout transitions for page deletion.
@@ -1950,7 +1954,8 @@
                 AlphaUpdateListener.updateVisibility(getPageIndicator());
             }
             searchBar.setAlpha(finalSearchBarAlpha);
-            AlphaUpdateListener.updateVisibility(mLauncher.getSearchBar());
+            AlphaUpdateListener.updateVisibility(searchBar);
+            updateCustomContentVisibility();
         }
         if (finalSearchBarAlpha == 0) {
             mLauncher.setVoiceButtonProxyVisible(false);
@@ -2017,10 +2022,27 @@
     private void onTransitionPrepare() {
         mIsSwitchingState = true;
         updateChildrenLayersEnabled(false);
-        if (mState != Workspace.State.NORMAL) {
-            if (hasCustomContent()) {
-                mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID).setVisibility(INVISIBLE);
-            }
+        hideCustomContentIfNecessary();
+    }
+
+    void updateCustomContentVisibility() {
+        int visibility = mState == Workspace.State.NORMAL ? VISIBLE : INVISIBLE;
+        if (hasCustomContent()) {
+            mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID).setVisibility(visibility);
+        }
+    }
+
+    void showCustomContentIfNecessary() {
+        boolean show  = mState == Workspace.State.NORMAL;
+        if (show && hasCustomContent()) {
+            mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID).setVisibility(VISIBLE);
+        }
+    }
+
+    void hideCustomContentIfNecessary() {
+        boolean hide  = mState != Workspace.State.NORMAL;
+        if (hide && hasCustomContent()) {
+            mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID).setVisibility(INVISIBLE);
         }
     }
 
@@ -2037,11 +2059,7 @@
                 cl.setShortcutAndWidgetAlpha(1f);
             }
         }
-        if (mState == Workspace.State.NORMAL) {
-            if (hasCustomContent()) {
-                mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID).setVisibility(VISIBLE);
-            }
-        }
+        showCustomContentIfNecessary();
     }
 
     @Override