diff --git a/res/anim/all_apps_2d_fade_in.xml b/res/anim/all_apps_2d_fade_in.xml
new file mode 100644
index 0000000..0f1e4f4
--- /dev/null
+++ b/res/anim/all_apps_2d_fade_in.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/decelerate_interpolator"
+
+    android:fromAlpha="0.0"
+    android:toAlpha="1.0"
+
+    android:duration="@integer/config_allAppsFadeInTime" />
diff --git a/res/anim/all_apps_2d_fade_out.xml b/res/anim/all_apps_2d_fade_out.xml
new file mode 100644
index 0000000..cc47691
--- /dev/null
+++ b/res/anim/all_apps_2d_fade_out.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_interpolator"
+
+    android:fromAlpha="1.0"
+    android:toAlpha="0.0"
+
+    android:duration="@integer/config_allAppsFadeOutTime" />
diff --git a/res/anim/fade_in_fast.xml b/res/anim/fade_in_fast.xml
index 5faef96..4fa9847 100644
--- a/res/anim/fade_in_fast.xml
+++ b/res/anim/fade_in_fast.xml
@@ -20,4 +20,4 @@
     android:fromAlpha="0.0"
     android:toAlpha="1.0"
 
-    android:duration="@android:integer/config_shortAnimTime" />
+    android:duration="@android:integer/config_mediumAnimTime" />
diff --git a/res/anim/fade_in_slow.xml b/res/anim/fade_in_slow.xml
new file mode 100644
index 0000000..0f1e4f4
--- /dev/null
+++ b/res/anim/fade_in_slow.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/decelerate_interpolator"
+
+    android:fromAlpha="0.0"
+    android:toAlpha="1.0"
+
+    android:duration="@integer/config_allAppsFadeInTime" />
diff --git a/res/anim/fade_out_fast.xml b/res/anim/fade_out_fast.xml
index 310e007..a061a6c 100644
--- a/res/anim/fade_out_fast.xml
+++ b/res/anim/fade_out_fast.xml
@@ -20,4 +20,4 @@
     android:fromAlpha="1.0"
     android:toAlpha="0.0"
 
-    android:duration="@android:integer/config_shortAnimTime" />
+    android:duration="@android:integer/config_mediumAnimTime" />
diff --git a/res/anim/fade_out_slow.xml b/res/anim/fade_out_slow.xml
new file mode 100644
index 0000000..cc47691
--- /dev/null
+++ b/res/anim/fade_out_slow.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_interpolator"
+
+    android:fromAlpha="1.0"
+    android:toAlpha="0.0"
+
+    android:duration="@integer/config_allAppsFadeOutTime" />
diff --git a/res/drawable-mdpi/all_apps_button_focused.png b/res/drawable-mdpi/all_apps_button_focused.png
new file mode 100644
index 0000000..94f7b08
--- /dev/null
+++ b/res/drawable-mdpi/all_apps_button_focused.png
Binary files differ
diff --git a/res/drawable-mdpi/all_apps_button_normal.png b/res/drawable-mdpi/all_apps_button_normal.png
new file mode 100644
index 0000000..188d528
--- /dev/null
+++ b/res/drawable-mdpi/all_apps_button_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/all_apps_button_pressed.png b/res/drawable-mdpi/all_apps_button_pressed.png
new file mode 100644
index 0000000..600dea9
--- /dev/null
+++ b/res/drawable-mdpi/all_apps_button_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/bg_appwidget_error.9.png b/res/drawable-mdpi/bg_appwidget_error.9.png
new file mode 100644
index 0000000..5077424
--- /dev/null
+++ b/res/drawable-mdpi/bg_appwidget_error.9.png
Binary files differ
diff --git a/res/drawable-mdpi/box_launcher_bottom.9.png b/res/drawable-mdpi/box_launcher_bottom.9.png
new file mode 100644
index 0000000..1c99c50
--- /dev/null
+++ b/res/drawable-mdpi/box_launcher_bottom.9.png
Binary files differ
diff --git a/res/drawable-mdpi/box_launcher_top_normal.9.png b/res/drawable-mdpi/box_launcher_top_normal.9.png
new file mode 100644
index 0000000..30b17b2
--- /dev/null
+++ b/res/drawable-mdpi/box_launcher_top_normal.9.png
Binary files differ
diff --git a/res/drawable-mdpi/box_launcher_top_pressed.9.png b/res/drawable-mdpi/box_launcher_top_pressed.9.png
new file mode 100644
index 0000000..033cd48
--- /dev/null
+++ b/res/drawable-mdpi/box_launcher_top_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/box_launcher_top_selected.9.png b/res/drawable-mdpi/box_launcher_top_selected.9.png
new file mode 100644
index 0000000..3ef394c
--- /dev/null
+++ b/res/drawable-mdpi/box_launcher_top_selected.9.png
Binary files differ
diff --git a/res/drawable-mdpi/focused_application_background.9.png b/res/drawable-mdpi/focused_application_background.9.png
new file mode 100644
index 0000000..9d09b41
--- /dev/null
+++ b/res/drawable-mdpi/focused_application_background.9.png
Binary files differ
diff --git a/res/drawable-mdpi/home_button_focused.png b/res/drawable-mdpi/home_button_focused.png
new file mode 100644
index 0000000..08b1fcb
--- /dev/null
+++ b/res/drawable-mdpi/home_button_focused.png
Binary files differ
diff --git a/res/drawable-mdpi/home_button_normal.png b/res/drawable-mdpi/home_button_normal.png
new file mode 100644
index 0000000..4afcce8
--- /dev/null
+++ b/res/drawable-mdpi/home_button_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/home_button_pressed.png b/res/drawable-mdpi/home_button_pressed.png
new file mode 100644
index 0000000..aa91732
--- /dev/null
+++ b/res/drawable-mdpi/home_button_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_1_focus.png b/res/drawable-mdpi/ic_home_arrows_1_focus.png
new file mode 100644
index 0000000..fd95862
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_1_focus.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_1_focus_right.png b/res/drawable-mdpi/ic_home_arrows_1_focus_right.png
new file mode 100644
index 0000000..2a7059f
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_1_focus_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_1_normal.png b/res/drawable-mdpi/ic_home_arrows_1_normal.png
new file mode 100644
index 0000000..c72a4bf
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_1_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_1_normal_right.png b/res/drawable-mdpi/ic_home_arrows_1_normal_right.png
new file mode 100644
index 0000000..90819e6
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_1_normal_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_1_press.png b/res/drawable-mdpi/ic_home_arrows_1_press.png
new file mode 100644
index 0000000..70011d7
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_1_press.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_1_press_right.png b/res/drawable-mdpi/ic_home_arrows_1_press_right.png
new file mode 100644
index 0000000..45ea6f8
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_1_press_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_2_focus.png b/res/drawable-mdpi/ic_home_arrows_2_focus.png
new file mode 100644
index 0000000..1f1164a
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_2_focus.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_2_focus_right.png b/res/drawable-mdpi/ic_home_arrows_2_focus_right.png
new file mode 100644
index 0000000..330ee39
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_2_focus_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_2_normal.png b/res/drawable-mdpi/ic_home_arrows_2_normal.png
new file mode 100644
index 0000000..dc01737
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_2_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_2_normal_right.png b/res/drawable-mdpi/ic_home_arrows_2_normal_right.png
new file mode 100644
index 0000000..dc843c6
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_2_normal_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_2_press.png b/res/drawable-mdpi/ic_home_arrows_2_press.png
new file mode 100644
index 0000000..294b331
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_2_press.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_2_press_right.png b/res/drawable-mdpi/ic_home_arrows_2_press_right.png
new file mode 100644
index 0000000..4fc9d0f
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_2_press_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_3_focus.png b/res/drawable-mdpi/ic_home_arrows_3_focus.png
new file mode 100644
index 0000000..7ada5ca
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_3_focus.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_3_focus_right.png b/res/drawable-mdpi/ic_home_arrows_3_focus_right.png
new file mode 100644
index 0000000..98d76ef
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_3_focus_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_3_normal.png b/res/drawable-mdpi/ic_home_arrows_3_normal.png
new file mode 100644
index 0000000..1ee2372
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_3_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_3_normal_right.png b/res/drawable-mdpi/ic_home_arrows_3_normal_right.png
new file mode 100644
index 0000000..90a93fa
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_3_normal_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_3_press.png b/res/drawable-mdpi/ic_home_arrows_3_press.png
new file mode 100644
index 0000000..7c98a29
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_3_press.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_3_press_right.png b/res/drawable-mdpi/ic_home_arrows_3_press_right.png
new file mode 100644
index 0000000..5cfd28c
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_3_press_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_4_focus.png b/res/drawable-mdpi/ic_home_arrows_4_focus.png
new file mode 100644
index 0000000..84f3a7b
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_4_focus.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_4_focus_right.png b/res/drawable-mdpi/ic_home_arrows_4_focus_right.png
new file mode 100644
index 0000000..813f863
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_4_focus_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_4_normal.png b/res/drawable-mdpi/ic_home_arrows_4_normal.png
new file mode 100644
index 0000000..477f725
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_4_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_4_normal_right.png b/res/drawable-mdpi/ic_home_arrows_4_normal_right.png
new file mode 100644
index 0000000..f8a8612
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_4_normal_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_4_press.png b/res/drawable-mdpi/ic_home_arrows_4_press.png
new file mode 100644
index 0000000..7b8f207
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_4_press.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_arrows_4_press_right.png b/res/drawable-mdpi/ic_home_arrows_4_press_right.png
new file mode 100644
index 0000000..4d9c2ca
--- /dev/null
+++ b/res/drawable-mdpi/ic_home_arrows_4_press_right.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_application.png b/res/drawable-mdpi/ic_launcher_application.png
new file mode 100644
index 0000000..9777d11
--- /dev/null
+++ b/res/drawable-mdpi/ic_launcher_application.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_appwidget.png b/res/drawable-mdpi/ic_launcher_appwidget.png
new file mode 100644
index 0000000..e9371d2
--- /dev/null
+++ b/res/drawable-mdpi/ic_launcher_appwidget.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_folder.png b/res/drawable-mdpi/ic_launcher_folder.png
new file mode 100644
index 0000000..14e0839
--- /dev/null
+++ b/res/drawable-mdpi/ic_launcher_folder.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_folder_open.png b/res/drawable-mdpi/ic_launcher_folder_open.png
new file mode 100644
index 0000000..6a61ca6
--- /dev/null
+++ b/res/drawable-mdpi/ic_launcher_folder_open.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_home.png b/res/drawable-mdpi/ic_launcher_home.png
new file mode 100644
index 0000000..95a50e6
--- /dev/null
+++ b/res/drawable-mdpi/ic_launcher_home.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_shortcut.png b/res/drawable-mdpi/ic_launcher_shortcut.png
new file mode 100644
index 0000000..05bc055
--- /dev/null
+++ b/res/drawable-mdpi/ic_launcher_shortcut.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_launcher_wallpaper.png b/res/drawable-mdpi/ic_launcher_wallpaper.png
new file mode 100644
index 0000000..982fd88
--- /dev/null
+++ b/res/drawable-mdpi/ic_launcher_wallpaper.png
Binary files differ
diff --git a/res/drawable-mdpi/pattern_carbon_fiber_dark.png b/res/drawable-mdpi/pattern_carbon_fiber_dark.png
new file mode 100644
index 0000000..44e050f
--- /dev/null
+++ b/res/drawable-mdpi/pattern_carbon_fiber_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/placeholder_google.png b/res/drawable-mdpi/placeholder_google.png
new file mode 100644
index 0000000..4af30aa
--- /dev/null
+++ b/res/drawable-mdpi/placeholder_google.png
Binary files differ
diff --git a/res/drawable-mdpi/preview_bg.9.png b/res/drawable-mdpi/preview_bg.9.png
new file mode 100644
index 0000000..5647144
--- /dev/null
+++ b/res/drawable-mdpi/preview_bg.9.png
Binary files differ
diff --git a/res/drawable-mdpi/preview_bg_focus.9.png b/res/drawable-mdpi/preview_bg_focus.9.png
new file mode 100644
index 0000000..31200fd
--- /dev/null
+++ b/res/drawable-mdpi/preview_bg_focus.9.png
Binary files differ
diff --git a/res/drawable-mdpi/preview_bg_press.9.png b/res/drawable-mdpi/preview_bg_press.9.png
new file mode 100644
index 0000000..9cb1266
--- /dev/null
+++ b/res/drawable-mdpi/preview_bg_press.9.png
Binary files differ
diff --git a/res/drawable-mdpi/trashcan.png b/res/drawable-mdpi/trashcan.png
new file mode 100644
index 0000000..d356f45
--- /dev/null
+++ b/res/drawable-mdpi/trashcan.png
Binary files differ
diff --git a/res/drawable-mdpi/trashcan_hover.png b/res/drawable-mdpi/trashcan_hover.png
new file mode 100644
index 0000000..7dda19e
--- /dev/null
+++ b/res/drawable-mdpi/trashcan_hover.png
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_bluedotgrid.jpg b/res/drawable-mdpi/wallpaper_bluedotgrid.jpg
new file mode 100644
index 0000000..468edfe
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_bluedotgrid.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_bluedotgrid_small.jpg b/res/drawable-mdpi/wallpaper_bluedotgrid_small.jpg
new file mode 100644
index 0000000..1ff9568
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_bluedotgrid_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_brown.jpg b/res/drawable-mdpi/wallpaper_brown.jpg
new file mode 100644
index 0000000..9b7ef20
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_brown.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_brown_small.jpg b/res/drawable-mdpi/wallpaper_brown_small.jpg
new file mode 100644
index 0000000..e5b417e
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_brown_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_canyon.jpg b/res/drawable-mdpi/wallpaper_canyon.jpg
new file mode 100644
index 0000000..1b129fd
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_canyon.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_canyon_small.jpg b/res/drawable-mdpi/wallpaper_canyon_small.jpg
new file mode 100644
index 0000000..fd4d72f
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_canyon_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_cloud.jpg b/res/drawable-mdpi/wallpaper_cloud.jpg
new file mode 100644
index 0000000..f3b5545
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_cloud.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_cloud_small.jpg b/res/drawable-mdpi/wallpaper_cloud_small.jpg
new file mode 100644
index 0000000..0e4c14c
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_cloud_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_desert.jpg b/res/drawable-mdpi/wallpaper_desert.jpg
new file mode 100644
index 0000000..47daa79
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_desert.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_desert_small.jpg b/res/drawable-mdpi/wallpaper_desert_small.jpg
new file mode 100644
index 0000000..9252d36
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_desert_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_despair.jpg b/res/drawable-mdpi/wallpaper_despair.jpg
new file mode 100644
index 0000000..57e8235
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_despair.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_despair_small.jpg b/res/drawable-mdpi/wallpaper_despair_small.jpg
new file mode 100644
index 0000000..fc8e3c6
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_despair_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_electric.jpg b/res/drawable-mdpi/wallpaper_electric.jpg
new file mode 100644
index 0000000..f7800af
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_electric.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_electric_small.jpg b/res/drawable-mdpi/wallpaper_electric_small.jpg
new file mode 100644
index 0000000..66dd573
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_electric_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_field.jpg b/res/drawable-mdpi/wallpaper_field.jpg
new file mode 100644
index 0000000..5bab9b5
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_field.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_field_small.jpg b/res/drawable-mdpi/wallpaper_field_small.jpg
new file mode 100644
index 0000000..20d9a48
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_field_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_galaxy.jpg b/res/drawable-mdpi/wallpaper_galaxy.jpg
new file mode 100644
index 0000000..de0f3ff
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_galaxy.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_galaxy_small.jpg b/res/drawable-mdpi/wallpaper_galaxy_small.jpg
new file mode 100644
index 0000000..69d48a2
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_galaxy_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_goldengate.jpg b/res/drawable-mdpi/wallpaper_goldengate.jpg
new file mode 100644
index 0000000..2271091
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_goldengate.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_goldengate_small.jpg b/res/drawable-mdpi/wallpaper_goldengate_small.jpg
new file mode 100644
index 0000000..e9aca1e
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_goldengate_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_grass.jpg b/res/drawable-mdpi/wallpaper_grass.jpg
new file mode 100644
index 0000000..e9dc541
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_grass.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_grass_night.jpg b/res/drawable-mdpi/wallpaper_grass_night.jpg
new file mode 100644
index 0000000..b9c74c9
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_grass_night.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_grass_night_small.jpg b/res/drawable-mdpi/wallpaper_grass_night_small.jpg
new file mode 100644
index 0000000..353eb18
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_grass_night_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_grass_small.jpg b/res/drawable-mdpi/wallpaper_grass_small.jpg
new file mode 100644
index 0000000..dc45738
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_grass_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_gray.jpg b/res/drawable-mdpi/wallpaper_gray.jpg
new file mode 100644
index 0000000..913f053
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_gray.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_gray_small.jpg b/res/drawable-mdpi/wallpaper_gray_small.jpg
new file mode 100644
index 0000000..d083a74
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_gray_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_greengray.jpg b/res/drawable-mdpi/wallpaper_greengray.jpg
new file mode 100644
index 0000000..1f3c86c
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_greengray.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_greengray_small.jpg b/res/drawable-mdpi/wallpaper_greengray_small.jpg
new file mode 100644
index 0000000..ebf7066
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_greengray_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_hazybluedots.jpg b/res/drawable-mdpi/wallpaper_hazybluedots.jpg
new file mode 100644
index 0000000..fe6aeb4
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_hazybluedots.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_hazybluedots_small.jpg b/res/drawable-mdpi/wallpaper_hazybluedots_small.jpg
new file mode 100644
index 0000000..c645dea
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_hazybluedots_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_lightgrad.jpg b/res/drawable-mdpi/wallpaper_lightgrad.jpg
new file mode 100644
index 0000000..35a45fa
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_lightgrad.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_lightgrad_small.jpg b/res/drawable-mdpi/wallpaper_lightgrad_small.jpg
new file mode 100644
index 0000000..f909da7
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_lightgrad_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_monumentvalley.jpg b/res/drawable-mdpi/wallpaper_monumentvalley.jpg
new file mode 100644
index 0000000..1bb5f2c
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_monumentvalley.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_monumentvalley_small.jpg b/res/drawable-mdpi/wallpaper_monumentvalley_small.jpg
new file mode 100644
index 0000000..9ea3309
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_monumentvalley_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_nexuspattern.jpg b/res/drawable-mdpi/wallpaper_nexuspattern.jpg
new file mode 100644
index 0000000..212a7b1
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_nexuspattern.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_nexuspattern_small.jpg b/res/drawable-mdpi/wallpaper_nexuspattern_small.jpg
new file mode 100644
index 0000000..8e474a5
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_nexuspattern_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_nexusrain.jpg b/res/drawable-mdpi/wallpaper_nexusrain.jpg
new file mode 100644
index 0000000..46c2971
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_nexusrain.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_nexusrain_small.jpg b/res/drawable-mdpi/wallpaper_nexusrain_small.jpg
new file mode 100644
index 0000000..a239339
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_nexusrain_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_nexuswallpaper1.png b/res/drawable-mdpi/wallpaper_nexuswallpaper1.png
new file mode 100644
index 0000000..2856da0
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_nexuswallpaper1.png
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_nexuswallpaper1_small.jpg b/res/drawable-mdpi/wallpaper_nexuswallpaper1_small.jpg
new file mode 100644
index 0000000..70882bb
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_nexuswallpaper1_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_pcut.jpg b/res/drawable-mdpi/wallpaper_pcut.jpg
new file mode 100644
index 0000000..bb9914d
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_pcut.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_pcut_small.jpg b/res/drawable-mdpi/wallpaper_pcut_small.jpg
new file mode 100644
index 0000000..bd19775
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_pcut_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_ropelights.jpg b/res/drawable-mdpi/wallpaper_ropelights.jpg
new file mode 100644
index 0000000..ca7862f
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_ropelights.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_ropelights_small.jpg b/res/drawable-mdpi/wallpaper_ropelights_small.jpg
new file mode 100644
index 0000000..ac6fb29
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_ropelights_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_tree.jpg b/res/drawable-mdpi/wallpaper_tree.jpg
new file mode 100644
index 0000000..f998bea
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_tree.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_tree_small.jpg b/res/drawable-mdpi/wallpaper_tree_small.jpg
new file mode 100644
index 0000000..425305a
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_tree_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_x67.jpg b/res/drawable-mdpi/wallpaper_x67.jpg
new file mode 100644
index 0000000..400aa27
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_x67.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_x67_small.jpg b/res/drawable-mdpi/wallpaper_x67_small.jpg
new file mode 100644
index 0000000..10e0faa
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_x67_small.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_zanzibar.jpg b/res/drawable-mdpi/wallpaper_zanzibar.jpg
new file mode 100644
index 0000000..9218895
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_zanzibar.jpg
Binary files differ
diff --git a/res/drawable-mdpi/wallpaper_zanzibar_small.jpg b/res/drawable-mdpi/wallpaper_zanzibar_small.jpg
new file mode 100644
index 0000000..affdc8c
--- /dev/null
+++ b/res/drawable-mdpi/wallpaper_zanzibar_small.jpg
Binary files differ
diff --git a/res/drawable/home_button.xml b/res/drawable/home_button.xml
new file mode 100644
index 0000000..032989d
--- /dev/null
+++ b/res/drawable/home_button.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true" android:drawable="@drawable/home_button_pressed" />
+    <item android:state_focused="true" android:state_window_focused="true" android:drawable="@drawable/home_button_focused" />
+    <item android:state_focused="true" android:state_window_focused="false" android:drawable="@drawable/home_button_normal" />
+    <item android:drawable="@drawable/home_button_normal" />
+</selector>
+
diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml
index 2688dd0..bfb54aa 100644
--- a/res/layout-land/launcher.xml
+++ b/res/layout-land/launcher.xml
@@ -22,17 +22,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <com.android.launcher2.AllAppsView
-        android:id="@+id/all_apps_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-
-        android:scrollbarStyle="outsideInset"
-        android:drawSelectorOnTop="false"
-        android:listSelector="@drawable/grid_selector"
-
-        android:verticalSpacing="10dip"
-        android:numColumns="4" />
+    <include layout="@layout/all_apps" />
 
     <!-- The workspace contains 3 screens of cells -->
     <com.android.launcher2.Workspace
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index f73e91c..a758a0d 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -22,18 +22,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <com.android.launcher2.AllAppsView
-        android:id="@+id/all_apps_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-
-        android:scrollbarStyle="outsideInset"
-        android:drawSelectorOnTop="false"
-        android:listSelector="@drawable/grid_selector"
-
-        android:verticalSpacing="10dip"
-        android:numColumns="4"
-        />
+    <include layout="@layout/all_apps" />
 
     <!-- The workspace contains 3 screens of cells -->
     <com.android.launcher2.Workspace
diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml
new file mode 100644
index 0000000..7975df4
--- /dev/null
+++ b/res/layout/all_apps.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!-- Replace with AllAppsView to use 2D version -->
+<com.android.launcher2.AllApps3D
+    xmlns:android="http://schemas.android.com/apk/res/android"
+
+    android:id="@+id/all_apps_view"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+
+    android:scrollbarStyle="outsideInset"
+    android:drawSelectorOnTop="false"
+    android:listSelector="@drawable/grid_selector"
+    android:verticalSpacing="10dip"
+    android:numColumns="4"
+    android:fadingEdgeLength="20dip"
+    android:padding="2dip"
+    android:cacheColorHint="#FF000000"
+    />
diff --git a/res/values/config.xml b/res/values/config.xml
new file mode 100644
index 0000000..56717e9
--- /dev/null
+++ b/res/values/config.xml
@@ -0,0 +1,4 @@
+<resources>
+    <integer name="config_allAppsFadeInTime">1000</integer>
+    <integer name="config_allAppsFadeOutTime">250</integer>
+</resources>
diff --git a/src/com/android/launcher2/AllApps2D.java b/src/com/android/launcher2/AllApps2D.java
new file mode 100644
index 0000000..55eb217
--- /dev/null
+++ b/src/com/android/launcher2/AllApps2D.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher2;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.os.SystemClock;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.ViewGroup;
+import android.view.MotionEvent;
+import android.view.LayoutInflater;
+import android.view.SoundEffectConstants;
+import android.view.SurfaceHolder;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.ViewConfiguration;
+import android.view.accessibility.AccessibilityEvent;
+import android.widget.AdapterView;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.ArrayAdapter;
+import android.widget.GridView;
+import android.widget.RelativeLayout;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+
+
+public class AllApps2D
+        extends RelativeLayout
+        implements AllAppsView,
+                   AdapterView.OnItemClickListener,
+                   AdapterView.OnItemLongClickListener,
+                   View.OnKeyListener,
+                   DragSource {
+
+    private static final String TAG = "Launcher.AllApps2D";
+
+    private Launcher mLauncher;
+    private DragController mDragController;
+
+    private GridView mGrid;
+
+    private ArrayList<ApplicationInfo> mAllAppsList = new ArrayList<ApplicationInfo>();
+
+    /**
+     * True when we are using arrow keys or trackball to drive navigation
+     */
+    private boolean mArrowNavigation = false;
+    private boolean mStartedScrolling;
+
+    /**
+     * Used to keep track of the selection when AllApps2D loses window focus.
+     * One of the SELECTION_ constants.
+     */
+    private int mLastSelection;
+
+    /**
+     * Used to keep track of the selection when AllApps2D loses window focus
+     */
+    private int mLastSelectedIcon;
+
+    private float mZoom;
+
+    private AppsAdapter mAppsAdapter;
+
+    // ------------------------------------------------------------
+
+    public class AppsAdapter extends ArrayAdapter<ApplicationInfo> {
+        private final LayoutInflater mInflater;
+
+        public AppsAdapter(Context context, ArrayList<ApplicationInfo> apps) {
+            super(context, 0, apps);
+            mInflater = LayoutInflater.from(context);
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            final ApplicationInfo info = getItem(position);
+
+            if (convertView == null) {
+                convertView = mInflater.inflate(R.layout.application_boxed, parent, false);
+            }
+
+//            if (!info.filtered) {
+//                info.icon = Utilities.createIconThumbnail(info.icon, getContext());
+//                info.filtered = true;
+//            }
+
+            final TextView textView = (TextView) convertView;
+            textView.setCompoundDrawablesWithIntrinsicBounds(null, new BitmapDrawable(info.iconBitmap), null, null);
+            textView.setText(info.title);
+
+            return convertView;
+        }
+    }
+
+    public AllApps2D(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setVisibility(View.GONE);
+        setSoundEffectsEnabled(false);
+
+        mAppsAdapter = new AppsAdapter(getContext(), mAllAppsList);
+        mAppsAdapter.setNotifyOnChange(false);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        setBackgroundColor(0xFF000000);
+
+        try {
+            mGrid = (GridView)findViewWithTag("all_apps_2d_grid");
+            if (mGrid == null) throw new Resources.NotFoundException();
+            mGrid.setOnItemClickListener(this);
+            mGrid.setOnItemLongClickListener(this);
+            
+            ImageButton homeButton = (ImageButton) findViewWithTag("all_apps_2d_home");
+            if (homeButton == null) throw new Resources.NotFoundException();
+            homeButton.setOnClickListener(
+                new View.OnClickListener() {
+                    public void onClick(View v) {
+                        mLauncher.closeAllApps(true);
+                    }
+                });
+        } catch (Resources.NotFoundException e) {
+            Log.e(TAG, "Can't find necessary layout elements for AllApps2D");
+        }
+
+        setOnKeyListener(this);
+    }
+
+    public AllApps2D(Context context, AttributeSet attrs, int defStyle) {
+        this(context, attrs);
+    }
+
+    public void setLauncher(Launcher launcher) {
+        mLauncher = launcher;
+    }
+
+    public boolean onKey(View v, int keyCode, KeyEvent event) {
+        if (!isVisible()) return false;
+
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_BACK:
+                mLauncher.closeAllApps(true);
+                break;
+            default:
+                return false;
+        }
+
+        return true;
+    }
+
+    public void onItemClick(AdapterView parent, View v, int position, long id) {
+        ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);
+        mLauncher.startActivitySafely(app.intent);
+    }
+
+    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
+        if (!view.isInTouchMode()) {
+            return false;
+        }
+
+        ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);
+        app = new ApplicationInfo(app);
+
+        mDragController.startDrag(view, this, app, DragController.DRAG_ACTION_COPY);
+        mLauncher.closeAllApps(true);
+
+        return true;
+    }
+
+
+    public void setDragController(DragController dragger) {
+        mDragController = dragger;
+    }
+
+    public void onDropCompleted(View target, boolean success) {
+    }
+
+    /**
+     * Zoom to the specifed level.
+     *
+     * @param zoom [0..1] 0 is hidden, 1 is open
+     */
+    public void zoom(float zoom, boolean animate) {
+//        Log.d(TAG, "zooming " + ((zoom == 1.0) ? "open" : "closed"));
+        cancelLongPress();
+
+        mZoom = zoom;
+
+        if (isVisible()) {
+            getParent().bringChildToFront(this);
+            setVisibility(View.VISIBLE);
+            mGrid.setAdapter(mAppsAdapter);
+            if (animate) {
+                startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.all_apps_2d_fade_in));
+            } else {
+                onAnimationEnd();
+            }
+        } else {
+            if (animate) {
+                startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.all_apps_2d_fade_out));
+            } else {
+                onAnimationEnd();
+            }
+        }
+    }
+
+    protected void onAnimationEnd() {
+        if (!isVisible()) {
+            setVisibility(View.GONE);
+            mGrid.setAdapter(null);
+            mZoom = 0.0f;
+        } else {
+            mZoom = 1.0f;
+        }
+
+        mLauncher.zoomed(mZoom);
+    }
+
+    public boolean isVisible() {
+        return mZoom > 0.001f;
+    }
+
+    @Override
+    public boolean isOpaque() {
+        return mZoom > 0.999f;
+    }
+
+    public void setApps(ArrayList<ApplicationInfo> list) {
+        mAllAppsList.clear();
+        addApps(list);
+    }
+
+    public void addApps(ArrayList<ApplicationInfo> list) {
+//        Log.d(TAG, "addApps: " + list.size() + " apps: " + list.toString());
+
+        final int N = list.size();
+
+        for (int i=0; i<N; i++) {
+            final ApplicationInfo item = list.get(i);
+            int index = Collections.binarySearch(mAllAppsList, item,
+                    LauncherModel.APP_NAME_COMPARATOR);
+            if (index < 0) {
+                index = -(index+1);
+            }
+            mAllAppsList.add(index, item);
+        }
+        mAppsAdapter.notifyDataSetChanged();
+    }
+
+    public void removeApps(ArrayList<ApplicationInfo> list) {
+        final int N = list.size();
+        for (int i=0; i<N; i++) {
+            final ApplicationInfo item = list.get(i);
+            int index = findAppByComponent(mAllAppsList, item);
+            if (index >= 0) {
+                mAllAppsList.remove(index);
+            } else {
+                Log.w(TAG, "couldn't find a match for item \"" + item + "\"");
+                // Try to recover.  This should keep us from crashing for now.
+            }
+        }
+        mAppsAdapter.notifyDataSetChanged();
+    }
+
+    public void updateApps(String packageName, ArrayList<ApplicationInfo> list) {
+        // Just remove and add, because they may need to be re-sorted.
+        removeApps(list);
+        addApps(list);
+    }
+
+    private static int findAppByComponent(ArrayList<ApplicationInfo> list, ApplicationInfo item) {
+        ComponentName component = item.intent.getComponent();
+        final int N = list.size();
+        for (int i=0; i<N; i++) {
+            ApplicationInfo x = list.get(i);
+            if (x.intent.getComponent().equals(component)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    public void dumpState() {
+        ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList", mAllAppsList);
+    }
+}
+
+
diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java
new file mode 100644
index 0000000..acf75e1
--- /dev/null
+++ b/src/com/android/launcher2/AllApps3D.java
@@ -0,0 +1,1500 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher2;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.os.SystemClock;
+import android.renderscript.Allocation;
+import android.renderscript.Dimension;
+import android.renderscript.Element;
+import android.renderscript.ProgramFragment;
+import android.renderscript.ProgramStore;
+import android.renderscript.ProgramVertex;
+import android.renderscript.RSSurfaceView;
+import android.renderscript.RenderScriptGL;
+import android.renderscript.RenderScript;
+import android.renderscript.Sampler;
+import android.renderscript.Script;
+import android.renderscript.ScriptC;
+import android.renderscript.SimpleMesh;
+import android.renderscript.Type;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
+import android.view.SurfaceHolder;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.accessibility.AccessibilityEvent;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+
+
+public class AllApps3D extends RSSurfaceView
+        implements AllAppsView, View.OnClickListener, View.OnLongClickListener, DragSource {
+    private static final String TAG = "Launcher.AllApps3D";
+
+    /** Bit for mLocks for when there are icons being loaded. */
+    private static final int LOCK_ICONS_PENDING = 1;
+
+    private static final int TRACKING_NONE = 0;
+    private static final int TRACKING_FLING = 1;
+    private static final int TRACKING_HOME = 2;
+
+    private static final int SELECTED_NONE = 0;
+    private static final int SELECTED_FOCUSED = 1;
+    private static final int SELECTED_PRESSED = 2;
+
+    private static final int SELECTION_NONE = 0;
+    private static final int SELECTION_ICONS = 1;
+    private static final int SELECTION_HOME = 2;
+
+    private Launcher mLauncher;
+    private DragController mDragController;
+
+    /** When this is 0, modifications are allowed, when it's not, they're not.
+     * TODO: What about scrolling? */
+    private int mLocks = LOCK_ICONS_PENDING;
+
+    private int mSlop;
+    private int mMaxFlingVelocity;
+
+    private Defines mDefines = new Defines();
+    private RenderScriptGL mRS;
+    private RolloRS mRollo;
+    private ArrayList<ApplicationInfo> mAllAppsList;
+
+    /**
+     * True when we are using arrow keys or trackball to drive navigation
+     */
+    private boolean mArrowNavigation = false;
+    private boolean mStartedScrolling;
+
+    /**
+     * Used to keep track of the selection when AllAppsView loses window focus.
+     * One of the SELECTION_ constants.
+     */
+    private int mLastSelection;
+
+    /**
+     * Used to keep track of the selection when AllAppsView loses window focus
+     */
+    private int mLastSelectedIcon;
+
+    private VelocityTracker mVelocityTracker;
+    private int mTouchTracking;
+    private int mMotionDownRawX;
+    private int mMotionDownRawY;
+    private int mDownIconIndex = -1;
+    private int mCurrentIconIndex = -1;
+
+    private boolean mShouldGainFocus;
+
+    private boolean mHaveSurface = false;
+    private boolean mZoomDirty = false;
+    private boolean mAnimateNextZoom;
+    private float mNextZoom;
+    private float mZoom;
+    private float mPosX;
+    private float mVelocity;
+    private AAMessage mMessageProc;
+
+    static class Defines {
+        public static final int ALLOC_PARAMS = 0;
+        public static final int ALLOC_STATE = 1;
+        public static final int ALLOC_ICON_IDS = 3;
+        public static final int ALLOC_LABEL_IDS = 4;
+        public static final int ALLOC_VP_CONSTANTS = 5;
+
+        public static final int COLUMNS_PER_PAGE = 4;
+        public static final int ROWS_PER_PAGE = 4;
+
+        public static final int ICON_WIDTH_PX = 64;
+        public static final int ICON_TEXTURE_WIDTH_PX = 74;
+        public static final int SELECTION_TEXTURE_WIDTH_PX = 74 + 20;
+
+        public static final int ICON_HEIGHT_PX = 64;
+        public static final int ICON_TEXTURE_HEIGHT_PX = 74;
+        public static final int SELECTION_TEXTURE_HEIGHT_PX = 74 + 20;
+    }
+
+    public AllApps3D(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setFocusable(true);
+        setSoundEffectsEnabled(false);
+        getHolder().setFormat(PixelFormat.TRANSLUCENT);
+        final ViewConfiguration config = ViewConfiguration.get(context);
+        mSlop = config.getScaledTouchSlop();
+        mMaxFlingVelocity = config.getScaledMaximumFlingVelocity();
+
+        setOnClickListener(this);
+        setOnLongClickListener(this);
+        setZOrderOnTop(true);
+        getHolder().setFormat(PixelFormat.TRANSLUCENT);
+
+        mRS = createRenderScript(true);
+    }
+
+    /**
+     * Note that this implementation prohibits this view from ever being reattached.
+     */
+    @Override
+    protected void onDetachedFromWindow() {
+        destroyRenderScript();
+        mRS.mMessageCallback = null;
+        mRS = null;
+    }
+
+    /**
+     * If you have an attached click listener, View always plays the click sound!?!?
+     * Deal with sound effects by hand.
+     */
+    public void reallyPlaySoundEffect(int sound) {
+        boolean old = isSoundEffectsEnabled();
+        setSoundEffectsEnabled(true);
+        playSoundEffect(sound);
+        setSoundEffectsEnabled(old);
+    }
+
+    public AllApps3D(Context context, AttributeSet attrs, int defStyle) {
+        this(context, attrs);
+    }
+
+    public void setLauncher(Launcher launcher) {
+        mLauncher = launcher;
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        super.surfaceDestroyed(holder);
+        // Without this, we leak mMessageCallback which leaks the context.
+        mRS.mMessageCallback = null;
+        // We may lose any callbacks that are pending, so make sure that we re-sync that
+        // on the next surfaceChanged.
+        mZoomDirty = true;
+        mHaveSurface = false;
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+        //long startTime = SystemClock.uptimeMillis();
+
+        super.surfaceChanged(holder, format, w, h);
+
+        mHaveSurface = true;
+
+        if (mRollo == null) {
+            mRollo = new RolloRS();
+            mRollo.init(getResources(), w, h);
+            if (mAllAppsList != null) {
+                mRollo.setApps(mAllAppsList);
+            }
+            if (mShouldGainFocus) {
+                gainFocus();
+                mShouldGainFocus = false;
+            }
+        }
+        mRollo.dirtyCheck();
+        mRollo.resize(w, h);
+
+        if (mRS != null) {
+            mRS.mMessageCallback = mMessageProc = new AAMessage();
+        }
+
+        Resources res = getContext().getResources();
+        int barHeight = (int)res.getDimension(R.dimen.button_bar_height);
+
+
+        if (mRollo.mUniformAlloc != null) {
+            float tf[] = new float[] {72.f, 72.f,
+                                      120.f, 120.f, 0.f, 0.f,
+                                      120.f, 680.f,
+                                      (2.f / 480.f), 0, -((float)w / 2) - 0.25f, -380.25f};
+            if (w > h) {
+                tf[6] = 40.f;
+                tf[7] = h - 40.f;
+                tf[9] = 1.f;
+                tf[10] = -((float)w / 2) - 0.25f;
+                tf[11] = -((float)h / 2) - 0.25f;
+            }
+
+            mRollo.mUniformAlloc.data(tf);
+        }
+
+        //long endTime = SystemClock.uptimeMillis();
+        //Log.d(TAG, "surfaceChanged took " + (endTime-startTime) + "ms");
+    }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasWindowFocus) {
+        super.onWindowFocusChanged(hasWindowFocus);
+        if (mArrowNavigation) {
+            if (!hasWindowFocus) {
+                // Clear selection when we lose window focus
+                mLastSelectedIcon = mRollo.mState.selectedIconIndex;
+                mRollo.setHomeSelected(SELECTED_NONE);
+                mRollo.clearSelectedIcon();
+                mRollo.mState.save();
+            } else if (hasWindowFocus) {
+                if (mRollo.mState.iconCount > 0) {
+                    if (mLastSelection == SELECTION_ICONS) {
+                        int selection = mLastSelectedIcon;
+                        final int firstIcon = Math.round(mPosX) *
+                            Defines.COLUMNS_PER_PAGE;
+                        if (selection < 0 || // No selection
+                                selection < firstIcon || // off the top of the screen
+                                selection >= mRollo.mState.iconCount || // past last icon
+                                selection >= firstIcon + // past last icon on screen
+                                    (Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE)) {
+                            selection = firstIcon;
+                        }
+
+                        // Select the first icon when we gain window focus
+                        mRollo.selectIcon(selection, SELECTED_FOCUSED);
+                        mRollo.mState.save();
+                    } else if (mLastSelection == SELECTION_HOME) {
+                        mRollo.setHomeSelected(SELECTED_FOCUSED);
+                        mRollo.mState.save();
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
+        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
+
+        if (!isVisible()) {
+            return;
+        }
+
+        if (gainFocus) {
+            if (mRollo != null) {
+                gainFocus();
+            } else {
+                mShouldGainFocus = true;
+            }
+        } else {
+            if (mRollo != null) {
+                if (mArrowNavigation) {
+                    // Clear selection when we lose focus
+                    mRollo.clearSelectedIcon();
+                    mRollo.setHomeSelected(SELECTED_NONE);
+                    mRollo.mState.save();
+                    mArrowNavigation = false;
+                }
+            } else {
+                mShouldGainFocus = false;
+            }
+        }
+    }
+
+    private void gainFocus() {
+        if (!mArrowNavigation && mRollo.mState.iconCount > 0) {
+            // Select the first icon when we gain keyboard focus
+            mArrowNavigation = true;
+            mRollo.selectIcon(Math.round(mPosX) * Defines.COLUMNS_PER_PAGE,
+                    SELECTED_FOCUSED);
+            mRollo.mState.save();
+        }
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+
+        boolean handled = false;
+
+        if (!isVisible()) {
+            return false;
+        }
+        final int iconCount = mRollo.mState.iconCount;
+
+        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
+            if (mArrowNavigation) {
+                if (mLastSelection == SELECTION_HOME) {
+                    reallyPlaySoundEffect(SoundEffectConstants.CLICK);
+                    mLauncher.closeAllApps(true);
+                } else {
+                    int whichApp = mRollo.mState.selectedIconIndex;
+                    if (whichApp >= 0) {
+                        ApplicationInfo app = mAllAppsList.get(whichApp);
+                        mLauncher.startActivitySafely(app.intent);
+                        handled = true;
+                    }
+                }
+            }
+        }
+
+        if (iconCount > 0) {
+            mArrowNavigation = true;
+
+            int currentSelection = mRollo.mState.selectedIconIndex;
+            int currentTopRow = Math.round(mPosX);
+
+            // The column of the current selection, in the range 0..COLUMNS_PER_PAGE-1
+            final int currentPageCol = currentSelection % Defines.COLUMNS_PER_PAGE;
+
+            // The row of the current selection, in the range 0..ROWS_PER_PAGE-1
+            final int currentPageRow = (currentSelection - (currentTopRow*Defines.COLUMNS_PER_PAGE))
+                    / Defines.ROWS_PER_PAGE;
+
+            int newSelection = currentSelection;
+
+            switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_UP:
+                if (mLastSelection == SELECTION_HOME) {
+                    mRollo.setHomeSelected(SELECTED_NONE);
+                    int lastRowCount = iconCount % Defines.COLUMNS_PER_PAGE;
+                    if (lastRowCount == 0) {
+                        lastRowCount = Defines.COLUMNS_PER_PAGE;
+                    }
+                    newSelection = iconCount - lastRowCount + (Defines.COLUMNS_PER_PAGE / 2);
+                    if (newSelection >= iconCount) {
+                        newSelection = iconCount-1;
+                    }
+                    int target = (newSelection / Defines.COLUMNS_PER_PAGE)
+                            - (Defines.ROWS_PER_PAGE - 1);
+                    if (target < 0) {
+                        target = 0;
+                    }
+                    if (currentTopRow != target) {
+                        mRollo.moveTo(target);
+                    }
+                } else {
+                    if (currentPageRow > 0) {
+                        newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
+                    } else if (currentTopRow > 0) {
+                        newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
+                        mRollo.moveTo(newSelection / Defines.COLUMNS_PER_PAGE);
+                    } else if (currentPageRow != 0) {
+                        newSelection = currentTopRow * Defines.ROWS_PER_PAGE;
+                    }
+                }
+                handled = true;
+                break;
+
+            case KeyEvent.KEYCODE_DPAD_DOWN: {
+                final int rowCount = iconCount / Defines.COLUMNS_PER_PAGE
+                        + (iconCount % Defines.COLUMNS_PER_PAGE == 0 ? 0 : 1);
+                final int currentRow = currentSelection / Defines.COLUMNS_PER_PAGE;
+                if (mLastSelection != SELECTION_HOME) {
+                    if (currentRow < rowCount-1) {
+                        mRollo.setHomeSelected(SELECTED_NONE);
+                        if (currentSelection < 0) {
+                            newSelection = 0;
+                        } else {
+                            newSelection = currentSelection + Defines.COLUMNS_PER_PAGE;
+                        }
+                        if (newSelection >= iconCount) {
+                            // Go from D to G in this arrangement:
+                            //     A B C D
+                            //     E F G
+                            newSelection = iconCount - 1;
+                        }
+                        if (currentPageRow >= Defines.ROWS_PER_PAGE - 1) {
+                            mRollo.moveTo((newSelection / Defines.COLUMNS_PER_PAGE) -
+                                    Defines.ROWS_PER_PAGE + 1);
+                        }
+                    } else {
+                        newSelection = -1;
+                        mRollo.setHomeSelected(SELECTED_FOCUSED);
+                    }
+                }
+                handled = true;
+                break;
+            }
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+                if (mLastSelection != SELECTION_HOME) {
+                    if (currentPageCol > 0) {
+                        newSelection = currentSelection - 1;
+                    }
+                }
+                handled = true;
+                break;
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+                if (mLastSelection != SELECTION_HOME) {
+                    if ((currentPageCol < Defines.COLUMNS_PER_PAGE - 1) &&
+                            (currentSelection < iconCount - 1)) {
+                        newSelection = currentSelection + 1;
+                    }
+                }
+                handled = true;
+                break;
+            }
+            if (newSelection != currentSelection) {
+                mRollo.selectIcon(newSelection, SELECTED_FOCUSED);
+                mRollo.mState.save();
+            }
+        }
+        return handled;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev)
+    {
+        mArrowNavigation = false;
+
+        if (!isVisible()) {
+            return true;
+        }
+
+        if (mLocks != 0) {
+            return true;
+        }
+
+        super.onTouchEvent(ev);
+
+        int x = (int)ev.getX();
+        int y = (int)ev.getY();
+
+        int action = ev.getAction();
+        switch (action) {
+        case MotionEvent.ACTION_DOWN:
+            if (y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]) {
+                mTouchTracking = TRACKING_HOME;
+                mRollo.setHomeSelected(SELECTED_PRESSED);
+                mRollo.mState.save();
+                mCurrentIconIndex = -1;
+            } else {
+                mTouchTracking = TRACKING_FLING;
+
+                mMotionDownRawX = (int)ev.getRawX();
+                mMotionDownRawY = (int)ev.getRawY();
+
+                mRollo.mState.newPositionX = ev.getRawY() / getHeight();
+                mRollo.mState.newTouchDown = 1;
+
+                if (!mRollo.checkClickOK()) {
+                    mRollo.clearSelectedIcon();
+                } else {
+                    mDownIconIndex = mCurrentIconIndex
+                            = mRollo.selectIcon(x, y, mPosX, SELECTED_PRESSED);
+                    if (mDownIconIndex < 0) {
+                        // if nothing was selected, no long press.
+                        cancelLongPress();
+                    }
+                }
+                mRollo.mState.save();
+                mRollo.move();
+                mVelocityTracker = VelocityTracker.obtain();
+                mVelocityTracker.addMovement(ev);
+                mStartedScrolling = false;
+            }
+            break;
+        case MotionEvent.ACTION_MOVE:
+        case MotionEvent.ACTION_OUTSIDE:
+            if (mTouchTracking == TRACKING_HOME) {
+                mRollo.setHomeSelected(y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]
+                        ? SELECTED_PRESSED : SELECTED_NONE);
+                mRollo.mState.save();
+            } else if (mTouchTracking == TRACKING_FLING) {
+                int rawX = (int)ev.getRawX();
+                int rawY = (int)ev.getRawY();
+                int slop;
+                slop = Math.abs(rawY - mMotionDownRawY);
+
+                if (!mStartedScrolling && slop < mSlop) {
+                    // don't update anything so when we do start scrolling
+                    // below, we get the right delta.
+                    mCurrentIconIndex = mRollo.chooseTappedIcon(x, y, mPosX);
+                    if (mDownIconIndex != mCurrentIconIndex) {
+                        // If a different icon is selected, don't allow it to be picked up.
+                        // This handles off-axis dragging.
+                        cancelLongPress();
+                        mCurrentIconIndex = -1;
+                    }
+                } else {
+                    if (!mStartedScrolling) {
+                        cancelLongPress();
+                        mCurrentIconIndex = -1;
+                    }
+                    mRollo.mState.newPositionX = ev.getRawY() / getHeight();
+                    mRollo.mState.newTouchDown = 1;
+                    mRollo.move();
+
+                    mStartedScrolling = true;
+                    mRollo.clearSelectedIcon();
+                    mVelocityTracker.addMovement(ev);
+                    mRollo.mState.save();
+                }
+            }
+            break;
+        case MotionEvent.ACTION_UP:
+        case MotionEvent.ACTION_CANCEL:
+            if (mTouchTracking == TRACKING_HOME) {
+                if (action == MotionEvent.ACTION_UP) {
+                    if (y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]) {
+                        reallyPlaySoundEffect(SoundEffectConstants.CLICK);
+                        mLauncher.closeAllApps(true);
+                    }
+                    mRollo.setHomeSelected(SELECTED_NONE);
+                    mRollo.mState.save();
+                }
+                mCurrentIconIndex = -1;
+            } else if (mTouchTracking == TRACKING_FLING) {
+                mRollo.mState.newTouchDown = 0;
+                mRollo.mState.newPositionX = ev.getRawY() / getHeight();
+
+                mVelocityTracker.computeCurrentVelocity(1000 /* px/sec */, mMaxFlingVelocity);
+                mRollo.mState.flingVelocity = mVelocityTracker.getYVelocity() / getHeight();
+                mRollo.clearSelectedIcon();
+                mRollo.mState.save();
+                mRollo.fling();
+
+                if (mVelocityTracker != null) {
+                    mVelocityTracker.recycle();
+                    mVelocityTracker = null;
+                }
+            }
+            mTouchTracking = TRACKING_NONE;
+            break;
+        }
+
+        return true;
+    }
+
+    public void onClick(View v) {
+        if (mLocks != 0 || !isVisible()) {
+            return;
+        }
+        if (mRollo.checkClickOK() && mCurrentIconIndex == mDownIconIndex
+                && mCurrentIconIndex >= 0 && mCurrentIconIndex < mAllAppsList.size()) {
+            reallyPlaySoundEffect(SoundEffectConstants.CLICK);
+            ApplicationInfo app = mAllAppsList.get(mCurrentIconIndex);
+            mLauncher.startActivitySafely(app.intent);
+        }
+    }
+
+    public boolean onLongClick(View v) {
+        if (mLocks != 0 || !isVisible()) {
+            return true;
+        }
+        if (mRollo.checkClickOK() && mCurrentIconIndex == mDownIconIndex
+                && mCurrentIconIndex >= 0 && mCurrentIconIndex < mAllAppsList.size()) {
+            ApplicationInfo app = mAllAppsList.get(mCurrentIconIndex);
+
+            Bitmap bmp = app.iconBitmap;
+            final int w = bmp.getWidth();
+            final int h = bmp.getHeight();
+
+            // We don't really have an accurate location to use.  This will do.
+            int screenX = mMotionDownRawX - (w / 2);
+            int screenY = mMotionDownRawY - h;
+
+            int left = (mDefines.ICON_TEXTURE_WIDTH_PX - mDefines.ICON_WIDTH_PX) / 2;
+            int top = (mDefines.ICON_TEXTURE_HEIGHT_PX - mDefines.ICON_HEIGHT_PX) / 2;
+            mDragController.startDrag(bmp, screenX, screenY,
+                    0, 0, w, h, this, app, DragController.DRAG_ACTION_COPY);
+
+            mLauncher.closeAllApps(true);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SELECTED) {
+            if (!isVisible()) {
+                return false;
+            }
+            String text = null;
+            int index;
+            int count = mAllAppsList.size() + 1; // +1 is home
+            int pos = -1;
+            switch (mLastSelection) {
+            case SELECTION_ICONS:
+                index = mRollo.mState.selectedIconIndex;
+                if (index >= 0) {
+                    ApplicationInfo info = mAllAppsList.get(index);
+                    if (info.title != null) {
+                        text = info.title.toString();
+                        pos = index;
+                    }
+                }
+                break;
+            case SELECTION_HOME:
+                text = getContext().getString(R.string.all_apps_home_button_label);
+                pos = count;
+                break;
+            }
+            if (text != null) {
+                event.setEnabled(true);
+                event.getText().add(text);
+                //event.setContentDescription(text);
+                event.setItemCount(count);
+                event.setCurrentItemIndex(pos);
+            }
+        }
+        return false;
+    }
+
+    public void setDragController(DragController dragger) {
+        mDragController = dragger;
+    }
+
+    public void onDropCompleted(View target, boolean success) {
+    }
+
+    /**
+     * Zoom to the specifed level.
+     *
+     * @param zoom [0..1] 0 is hidden, 1 is open
+     */
+    public void zoom(float zoom, boolean animate) {
+        cancelLongPress();
+        mNextZoom = zoom;
+        mAnimateNextZoom = animate;
+        // if we do setZoom while we don't have a surface, we won't
+        // get the callbacks that actually set mZoom.
+        if (mRollo == null || !mHaveSurface) {
+            mZoomDirty = true;
+            mZoom = zoom;
+            return;
+        } else {
+            mRollo.setZoom(zoom, animate);
+        }
+    }
+
+    public boolean isVisible() {
+        return mZoom > 0.001f;
+    }
+
+    public boolean isOpaque() {
+        return mZoom > 0.999f;
+    }
+
+    public void setApps(ArrayList<ApplicationInfo> list) {
+        if (mRS == null) {
+            // We've been removed from the window.  Don't bother with all this.
+            return;
+        }
+
+        mAllAppsList = list;
+        if (mRollo != null) {
+            mRollo.setApps(list);
+        }
+        mLocks &= ~LOCK_ICONS_PENDING;
+    }
+
+    public void addApps(ArrayList<ApplicationInfo> list) {
+        if (mAllAppsList == null) {
+            // Not done loading yet.  We'll find out about it later.
+            return;
+        }
+        if (mRS == null) {
+            // We've been removed from the window.  Don't bother with all this.
+            return;
+        }
+
+        final int N = list.size();
+        if (mRollo != null) {
+            mRollo.reallocAppsList(mRollo.mState.iconCount + N);
+        }
+
+        for (int i=0; i<N; i++) {
+            final ApplicationInfo item = list.get(i);
+            int index = Collections.binarySearch(mAllAppsList, item,
+                    LauncherModel.APP_NAME_COMPARATOR);
+            if (index < 0) {
+                index = -(index+1);
+            }
+            mAllAppsList.add(index, item);
+            if (mRollo != null) {
+                mRollo.addApp(index, item);
+            }
+        }
+
+        if (mRollo != null) {
+            mRollo.saveAppsList();
+        }
+    }
+
+    public void removeApps(ArrayList<ApplicationInfo> list) {
+        if (mAllAppsList == null) {
+            // Not done loading yet.  We'll find out about it later.
+            return;
+        }
+
+        final int N = list.size();
+        for (int i=0; i<N; i++) {
+            final ApplicationInfo item = list.get(i);
+            int index = findAppByComponent(mAllAppsList, item);
+            if (index >= 0) {
+                int ic = mRollo != null ? mRollo.mState.iconCount : 666;
+                mAllAppsList.remove(index);
+                if (mRollo != null) {
+                    mRollo.removeApp(index);
+                }
+            } else {
+                Log.w(TAG, "couldn't find a match for item \"" + item + "\"");
+                // Try to recover.  This should keep us from crashing for now.
+            }
+        }
+
+        if (mRollo != null) {
+            mRollo.saveAppsList();
+        }
+    }
+
+    public void updateApps(String packageName, ArrayList<ApplicationInfo> list) {
+        // Just remove and add, because they may need to be re-sorted.
+        removeApps(list);
+        addApps(list);
+    }
+
+    private static int findAppByComponent(ArrayList<ApplicationInfo> list, ApplicationInfo item) {
+        ComponentName component = item.intent.getComponent();
+        final int N = list.size();
+        for (int i=0; i<N; i++) {
+            ApplicationInfo x = list.get(i);
+            if (x.intent.getComponent().equals(component)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    private static int countPages(int iconCount) {
+        int iconsPerPage = Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE;
+        int pages = iconCount / iconsPerPage;
+        if (pages*iconsPerPage != iconCount) {
+            pages++;
+        }
+        return pages;
+    }
+
+    class AAMessage extends RenderScript.RSMessage {
+        public void run() {
+            mPosX = ((float)mData[0]) / (1 << 16);
+            mVelocity = ((float)mData[1]) / (1 << 16);
+            mZoom = ((float)mData[2]) / (1 << 16);
+            mZoomDirty = false;
+        }
+    }
+
+    public class RolloRS {
+
+        // Allocations ======
+        private int mWidth;
+        private int mHeight;
+
+        private Resources mRes;
+        private Script mScript;
+        private Script.Invokable mInvokeMove;
+        private Script.Invokable mInvokeMoveTo;
+        private Script.Invokable mInvokeFling;
+        private Script.Invokable mInvokeResetWAR;
+        private Script.Invokable mInvokeSetZoom;
+
+        private ProgramStore mPSIcons;
+        private ProgramFragment mPFTexMip;
+        private ProgramFragment mPFTexMipAlpha;
+        private ProgramFragment mPFTexNearest;
+        private ProgramVertex mPV;
+        private ProgramVertex mPVCurve;
+        private SimpleMesh mMesh;
+        private ProgramVertex.MatrixAllocation mPVA;
+
+        private Allocation mUniformAlloc;
+
+        private Allocation mHomeButtonNormal;
+        private Allocation mHomeButtonFocused;
+        private Allocation mHomeButtonPressed;
+
+        private Allocation[] mIcons;
+        private int[] mIconIds;
+        private Allocation mAllocIconIds;
+
+        private Allocation[] mLabels;
+        private int[] mLabelIds;
+        private Allocation mAllocLabelIds;
+        private Allocation mSelectedIcon;
+
+        private int[] mTouchYBorders;
+        private int[] mTouchXBorders;
+
+        private Bitmap mSelectionBitmap;
+        private Canvas mSelectionCanvas;
+
+        Params mParams;
+        State mState;
+
+        class BaseAlloc {
+            Allocation mAlloc;
+            Type mType;
+
+            void save() {
+                mAlloc.data(this);
+            }
+        }
+
+        private boolean checkClickOK() {
+            return (Math.abs(mVelocity) < 0.4f) &&
+                   (Math.abs(mPosX - Math.round(mPosX)) < 0.4f);
+        }
+
+        class Params extends BaseAlloc {
+            Params() {
+                mType = Type.createFromClass(mRS, Params.class, 1, "ParamsClass");
+                mAlloc = Allocation.createTyped(mRS, mType);
+                save();
+            }
+            public int bubbleWidth;
+            public int bubbleHeight;
+            public int bubbleBitmapWidth;
+            public int bubbleBitmapHeight;
+
+            public int homeButtonWidth;
+            public int homeButtonHeight;
+            public int homeButtonTextureWidth;
+            public int homeButtonTextureHeight;
+        }
+
+        class State extends BaseAlloc {
+            public float newPositionX;
+            public int newTouchDown;
+            public float flingVelocity;
+            public int iconCount;
+            public int selectedIconIndex = -1;
+            public int selectedIconTexture;
+            public float zoomTarget;
+            public int homeButtonId;
+            public float targetPos;
+
+            State() {
+                mType = Type.createFromClass(mRS, State.class, 1, "StateClass");
+                mAlloc = Allocation.createTyped(mRS, mType);
+                save();
+            }
+        }
+
+        public RolloRS() {
+        }
+
+        public void init(Resources res, int width, int height) {
+            mRes = res;
+            mWidth = width;
+            mHeight = height;
+            initProgramVertex();
+            initProgramFragment();
+            initProgramStore();
+            initGl();
+            initData();
+            initTouchState();
+            initRs();
+        }
+
+        public void initMesh() {
+            SimpleMesh.TriangleMeshBuilder tm = new SimpleMesh.TriangleMeshBuilder(mRS, 2, 0);
+
+            for (int ct=0; ct < 16; ct++) {
+                float pos = (1.f / (16.f - 1)) * ct;
+                tm.addVertex(0.0f, pos);
+                tm.addVertex(1.0f, pos);
+            }
+            for (int ct=0; ct < (16 * 2 - 2); ct+= 2) {
+                tm.addTriangle(ct, ct+1, ct+2);
+                tm.addTriangle(ct+1, ct+3, ct+2);
+            }
+            mMesh = tm.create();
+            mMesh.setName("SMCell");
+        }
+
+        void resize(int w, int h) {
+            mPVA.setupProjectionNormalized(w, h);
+            mWidth = w;
+            mHeight = h;
+        }
+
+        private void initProgramVertex() {
+            mPVA = new ProgramVertex.MatrixAllocation(mRS);
+            resize(mWidth, mHeight);
+
+            ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
+            pvb.setTextureMatrixEnable(true);
+            mPV = pvb.create();
+            mPV.setName("PV");
+            mPV.bindAllocation(mPVA);
+
+            Element.Builder eb = new Element.Builder(mRS);
+            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "ImgSize");
+            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 4), "Position");
+            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "BendPos");
+            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 4), "ScaleOffset");
+            Element e = eb.create();
+
+            mUniformAlloc = Allocation.createSized(mRS, e, 1);
+
+            initMesh();
+            ProgramVertex.ShaderBuilder sb = new ProgramVertex.ShaderBuilder(mRS);
+            String t = new String("void main() {\n" +
+                                  // Animation
+                                  "  float ani = UNI_Position.z;\n" +
+
+                                  "  float bendY1 = UNI_BendPos.x;\n" +
+                                  "  float bendY2 = UNI_BendPos.y;\n" +
+                                  "  float bendAngle = 47.0 * (3.14 / 180.0);\n" +
+                                  "  float bendDistance = bendY1 * 0.4;\n" +
+                                  "  float distanceDimLevel = 0.6;\n" +
+
+                                  "  float bendStep = (bendAngle / bendDistance) * (bendAngle * 0.5);\n" +
+                                  "  float aDy = cos(bendAngle);\n" +
+                                  "  float aDz = sin(bendAngle);\n" +
+
+                                  "  float scale = (2.0 / 480.0);\n" +
+                                  "  float x = UNI_Position.x + UNI_ImgSize.x * (1.0 - ani) * (ATTRIB_position.x - 0.5);\n" +
+                                  "  float ys= UNI_Position.y + UNI_ImgSize.y * (1.0 - ani) * ATTRIB_position.y;\n" +
+                                  "  float y = 0.0;\n" +
+                                  "  float z = 0.0;\n" +
+                                  "  float lum = 1.0;\n" +
+
+                                  "  float cv = min(ys, bendY1 - bendDistance) - (bendY1 - bendDistance);\n" +
+                                  "  y += cv * aDy;\n" +
+                                  "  z += -cv * aDz;\n" +
+                                  "  cv = clamp(ys, bendY1 - bendDistance, bendY1) - bendY1;\n" +  // curve range
+                                  "  lum += cv / bendDistance * distanceDimLevel;\n" +
+                                  "  y += cv * cos(cv * bendStep);\n" +
+                                  "  z += cv * sin(cv * bendStep);\n" +
+
+                                  "  cv = max(ys, bendY2 + bendDistance) - (bendY2 + bendDistance);\n" +
+                                  "  y += cv * aDy;\n" +
+                                  "  z += cv * aDz;\n" +
+                                  "  cv = clamp(ys, bendY2, bendY2 + bendDistance) - bendY2;\n" +
+                                  "  lum -= cv / bendDistance * distanceDimLevel;\n" +
+                                  "  y += cv * cos(cv * bendStep);\n" +
+                                  "  z += cv * sin(cv * bendStep);\n" +
+
+                                  "  y += clamp(ys, bendY1, bendY2);\n" +
+
+                                  "  vec4 pos;\n" +
+                                  "  pos.x = (x + UNI_ScaleOffset.z) * UNI_ScaleOffset.x;\n" +
+                                  "  pos.y = (y + UNI_ScaleOffset.w) * UNI_ScaleOffset.x;\n" +
+                                  "  pos.z = z * UNI_ScaleOffset.x;\n" +
+                                  "  pos.w = 1.0;\n" +
+
+                                  "  pos.x *= 1.0 + ani * 4.0;\n" +
+                                  "  pos.y *= 1.0 + ani * 4.0;\n" +
+                                  "  pos.z -= ani * 1.5;\n" +
+                                  "  lum *= 1.0 - ani;\n" +
+
+                                  "  gl_Position = UNI_MVP * pos;\n" +
+                                  "  varColor.rgba = vec4(lum, lum, lum, 1.0);\n" +
+                                  "  varTex0.xy = ATTRIB_position;\n" +
+                                  "  varTex0.y = 1.0 - varTex0.y;\n" +
+                                  "  varTex0.zw = vec2(0.0, 0.0);\n" +
+                                  "}\n");
+            sb.setShader(t);
+            sb.addConstant(mUniformAlloc.getType());
+            sb.addInput(mMesh.getVertexType(0).getElement());
+            mPVCurve = sb.create();
+            mPVCurve.setName("PVCurve");
+            mPVCurve.bindAllocation(mPVA);
+            mPVCurve.bindConstants(mUniformAlloc, 1);
+
+            mRS.contextBindProgramVertex(mPV);
+        }
+
+        private void initProgramFragment() {
+            Sampler.Builder sb = new Sampler.Builder(mRS);
+            sb.setMin(Sampler.Value.LINEAR_MIP_LINEAR);
+            sb.setMag(Sampler.Value.NEAREST);
+            sb.setWrapS(Sampler.Value.CLAMP);
+            sb.setWrapT(Sampler.Value.CLAMP);
+            Sampler linear = sb.create();
+
+            sb.setMin(Sampler.Value.NEAREST);
+            sb.setMag(Sampler.Value.NEAREST);
+            Sampler nearest = sb.create();
+
+            ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS);
+            bf.setTexture(ProgramFragment.Builder.EnvMode.MODULATE,
+                          ProgramFragment.Builder.Format.RGBA, 0);
+            mPFTexMip = bf.create();
+            mPFTexMip.setName("PFTexMip");
+            mPFTexMip.bindSampler(linear, 0);
+
+            mPFTexNearest = bf.create();
+            mPFTexNearest.setName("PFTexNearest");
+            mPFTexNearest.bindSampler(nearest, 0);
+
+            bf.setTexture(ProgramFragment.Builder.EnvMode.MODULATE,
+                          ProgramFragment.Builder.Format.ALPHA, 0);
+            mPFTexMipAlpha = bf.create();
+            mPFTexMipAlpha.setName("PFTexMipAlpha");
+            mPFTexMipAlpha.bindSampler(linear, 0);
+
+        }
+
+        private void initProgramStore() {
+            ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
+            bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
+            bs.setColorMask(true,true,true,false);
+            bs.setDitherEnable(true);
+            bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
+                            ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
+            mPSIcons = bs.create();
+            mPSIcons.setName("PSIcons");
+        }
+
+        private void initGl() {
+            mTouchXBorders = new int[Defines.COLUMNS_PER_PAGE+1];
+            mTouchYBorders = new int[Defines.ROWS_PER_PAGE+1];
+        }
+
+        private void initData() {
+            mParams = new Params();
+            mState = new State();
+
+            final Utilities.BubbleText bubble = new Utilities.BubbleText(getContext());
+
+            mParams.bubbleWidth = bubble.getBubbleWidth();
+            mParams.bubbleHeight = bubble.getMaxBubbleHeight();
+            mParams.bubbleBitmapWidth = bubble.getBitmapWidth();
+            mParams.bubbleBitmapHeight = bubble.getBitmapHeight();
+
+            mHomeButtonNormal = Allocation.createFromBitmapResource(mRS, mRes,
+                    R.drawable.home_button_normal, Element.RGBA_8888(mRS), false);
+            mHomeButtonNormal.uploadToTexture(0);
+            mHomeButtonFocused = Allocation.createFromBitmapResource(mRS, mRes,
+                    R.drawable.home_button_focused, Element.RGBA_8888(mRS), false);
+            mHomeButtonFocused.uploadToTexture(0);
+            mHomeButtonPressed = Allocation.createFromBitmapResource(mRS, mRes,
+                    R.drawable.home_button_pressed, Element.RGBA_8888(mRS), false);
+            mHomeButtonPressed.uploadToTexture(0);
+            mParams.homeButtonWidth = 76;
+            mParams.homeButtonHeight = 68;
+            mParams.homeButtonTextureWidth = 128;
+            mParams.homeButtonTextureHeight = 128;
+
+            mState.homeButtonId = mHomeButtonNormal.getID();
+
+            mParams.save();
+            mState.save();
+
+            mSelectionBitmap = Bitmap.createBitmap(Defines.SELECTION_TEXTURE_WIDTH_PX,
+                    Defines.SELECTION_TEXTURE_HEIGHT_PX, Bitmap.Config.ARGB_8888);
+            mSelectionCanvas = new Canvas(mSelectionBitmap);
+
+            setApps(null);
+        }
+
+        private void initScript(int id) {
+        }
+
+        private void initRs() {
+            ScriptC.Builder sb = new ScriptC.Builder(mRS);
+            sb.setScript(mRes, R.raw.allapps);
+            sb.setRoot(true);
+            sb.addDefines(mDefines);
+            sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS);
+            sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
+            sb.setType(mUniformAlloc.getType(), "vpConstants", Defines.ALLOC_VP_CONSTANTS);
+            mInvokeMove = sb.addInvokable("move");
+            mInvokeFling = sb.addInvokable("fling");
+            mInvokeMoveTo = sb.addInvokable("moveTo");
+            mInvokeResetWAR = sb.addInvokable("resetHWWar");
+            mInvokeSetZoom = sb.addInvokable("setZoom");
+            mScript = sb.create();
+            mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
+            mScript.bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
+            mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+            mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+            mScript.bindAllocation(mUniformAlloc, Defines.ALLOC_VP_CONSTANTS);
+
+            mRS.contextBindRootScript(mScript);
+        }
+
+        void dirtyCheck() {
+            if (mZoomDirty) {
+                setZoom(mNextZoom, mAnimateNextZoom);
+            }
+        }
+
+        private void setApps(ArrayList<ApplicationInfo> list) {
+            final int count = list != null ? list.size() : 0;
+            int allocCount = count;
+            if (allocCount < 1) {
+                allocCount = 1;
+            }
+
+            mIcons = new Allocation[count];
+            mIconIds = new int[allocCount];
+            mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
+
+            mLabels = new Allocation[count];
+            mLabelIds = new int[allocCount];
+            mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
+
+            Element ie8888 = Element.RGBA_8888(mRS);
+
+            mState.iconCount = count;
+            for (int i=0; i < mState.iconCount; i++) {
+                createAppIconAllocations(i, list.get(i));
+            }
+            for (int i=0; i < mState.iconCount; i++) {
+                uploadAppIcon(i, list.get(i));
+            }
+            saveAppsList();
+        }
+
+        private void setZoom(float zoom, boolean animate) {
+            mRollo.clearSelectedIcon();
+            mRollo.setHomeSelected(SELECTED_NONE);
+            if (zoom > 0.001f) {
+                mRollo.mState.zoomTarget = zoom;
+            } else {
+                mRollo.mState.zoomTarget = 0;
+            }
+            mRollo.mState.save();
+            if (!animate) {
+                mRollo.mInvokeSetZoom.execute();
+            }
+        }
+
+        private void createAppIconAllocations(int index, ApplicationInfo item) {
+            mIcons[index] = Allocation.createFromBitmap(mRS, item.iconBitmap,
+                    Element.RGBA_8888(mRS), true);
+            mLabels[index] = Allocation.createFromBitmap(mRS, item.titleBitmap,
+                    Element.A_8(mRS), true);
+            mIconIds[index] = mIcons[index].getID();
+            mLabelIds[index] = mLabels[index].getID();
+        }
+
+        private void uploadAppIcon(int index, ApplicationInfo item) {
+            if (mIconIds[index] != mIcons[index].getID()) {
+                throw new IllegalStateException("uploadAppIcon index=" + index
+                    + " mIcons[index].getID=" + mIcons[index].getID()
+                    + " mIconsIds[index]=" + mIconIds[index]
+                    + " item=" + item);
+            }
+            mIcons[index].uploadToTexture(0);
+            mLabels[index].uploadToTexture(0);
+        }
+
+        /**
+         * Puts the empty spaces at the end.  Updates mState.iconCount.  You must
+         * fill in the values and call saveAppsList().
+         */
+        private void reallocAppsList(int count) {
+            Allocation[] icons = new Allocation[count];
+            int[] iconIds = new int[count];
+            mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count);
+
+            Allocation[] labels = new Allocation[count];
+            int[] labelIds = new int[count];
+            mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count);
+
+            final int oldCount = mRollo.mState.iconCount;
+
+            System.arraycopy(mIcons, 0, icons, 0, oldCount);
+            System.arraycopy(mIconIds, 0, iconIds, 0, oldCount);
+            System.arraycopy(mLabels, 0, labels, 0, oldCount);
+            System.arraycopy(mLabelIds, 0, labelIds, 0, oldCount);
+
+            mIcons = icons;
+            mIconIds = iconIds;
+            mLabels = labels;
+            mLabelIds = labelIds;
+        }
+
+        /**
+         * Handle the allocations for the new app.  Make sure you call saveAppsList when done.
+         */
+        private void addApp(int index, ApplicationInfo item) {
+            final int count = mState.iconCount - index;
+            final int dest = index + 1;
+
+            System.arraycopy(mIcons, index, mIcons, dest, count);
+            System.arraycopy(mIconIds, index, mIconIds, dest, count);
+            System.arraycopy(mLabels, index, mLabels, dest, count);
+            System.arraycopy(mLabelIds, index, mLabelIds, dest, count);
+
+            createAppIconAllocations(index, item);
+            uploadAppIcon(index, item);
+            mRollo.mState.iconCount++;
+        }
+
+        /**
+         * Handle the allocations for the removed app.  Make sure you call saveAppsList when done.
+         */
+        private void removeApp(int index) {
+            final int count = mState.iconCount - index - 1;
+            final int src = index + 1;
+
+            System.arraycopy(mIcons, src, mIcons, index, count);
+            System.arraycopy(mIconIds, src, mIconIds, index, count);
+            System.arraycopy(mLabels, src, mLabels, index, count);
+            System.arraycopy(mLabelIds, src, mLabelIds, index, count);
+
+            mRollo.mState.iconCount--;
+            final int last = mState.iconCount;
+
+            mIcons[last] = null;
+            mIconIds[last] = 0;
+            mLabels[last] = null;
+            mLabelIds[last] = 0;
+        }
+
+        /**
+         * Send the apps list structures to RS.
+         */
+        private void saveAppsList() {
+            // WTF: how could mScript be not null but mAllocIconIds null b/2460740.
+            if (mScript != null && mAllocIconIds != null) {
+                mRS.contextBindRootScript(null);
+
+                mAllocIconIds.data(mIconIds);
+                mAllocLabelIds.data(mLabelIds);
+
+                mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+                mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+
+                mState.save();
+
+                // Note: mScript may be null if we haven't initialized it yet.
+                // In that case, this is a no-op.
+                if (mInvokeResetWAR != null) {
+                    mInvokeResetWAR.execute();
+                }
+
+                mRS.contextBindRootScript(mScript);
+            }
+        }
+
+        void initTouchState() {
+            int width = getWidth();
+            int height = getHeight();
+            int cellHeight = 145;//iconsSize / Defines.ROWS_PER_PAGE;
+            int cellWidth = width / Defines.COLUMNS_PER_PAGE;
+
+            int centerY = (height / 2);
+            mTouchYBorders[0] = centerY - (cellHeight * 2);
+            mTouchYBorders[1] = centerY - cellHeight;
+            mTouchYBorders[2] = centerY;
+            mTouchYBorders[3] = centerY + cellHeight;
+            mTouchYBorders[4] = centerY + (cellHeight * 2);
+
+            int centerX = (width / 2);
+            mTouchXBorders[0] = 0;
+            mTouchXBorders[1] = centerX - (width / 4);
+            mTouchXBorders[2] = centerX;
+            mTouchXBorders[3] = centerX + (width / 4);
+            mTouchXBorders[4] = width;
+        }
+
+        void fling() {
+            mInvokeFling.execute();
+        }
+
+        void move() {
+            mInvokeMove.execute();
+        }
+
+        void moveTo(float row) {
+            mState.targetPos = row;
+            mState.save();
+            mInvokeMoveTo.execute();
+        }
+
+        int chooseTappedIcon(int x, int y, float pos) {
+            // Adjust for scroll position if not zero.
+            y += (pos - ((int)pos)) * (mTouchYBorders[1] - mTouchYBorders[0]);
+
+            int col = -1;
+            int row = -1;
+            for (int i=0; i<Defines.COLUMNS_PER_PAGE; i++) {
+                if (x >= mTouchXBorders[i] && x < mTouchXBorders[i+1]) {
+                    col = i;
+                    break;
+                }
+            }
+            for (int i=0; i<Defines.ROWS_PER_PAGE; i++) {
+                if (y >= mTouchYBorders[i] && y < mTouchYBorders[i+1]) {
+                    row = i;
+                    break;
+                }
+            }
+
+            if (row < 0 || col < 0) {
+                return -1;
+            }
+
+            int index = (((int)pos) * Defines.COLUMNS_PER_PAGE)
+                    + (row * Defines.ROWS_PER_PAGE) + col;
+
+            if (index >= mState.iconCount) {
+                return -1;
+            } else {
+                return index;
+            }
+        }
+
+        /**
+         * You need to call save() on mState on your own after calling this.
+         *
+         * @return the index of the icon that was selected.
+         */
+        int selectIcon(int x, int y, float pos, int pressed) {
+            final int index = chooseTappedIcon(x, y, pos);
+            selectIcon(index, pressed);
+            return index;
+        }
+
+        /**
+         * Select the icon at the given index.
+         *
+         * @param index The index.
+         * @param pressed one of SELECTED_PRESSED or SELECTED_FOCUSED
+         */
+        void selectIcon(int index, int pressed) {
+            if (mAllAppsList == null || index < 0 || index >= mAllAppsList.size()) {
+                mState.selectedIconIndex = -1;
+                if (mLastSelection == SELECTION_ICONS) {
+                    mLastSelection = SELECTION_NONE;
+                }
+            } else {
+                if (pressed == SELECTED_FOCUSED) {
+                    mLastSelection = SELECTION_ICONS;
+                }
+
+                int prev = mState.selectedIconIndex;
+                mState.selectedIconIndex = index;
+
+                ApplicationInfo info = mAllAppsList.get(index);
+                Bitmap selectionBitmap = mSelectionBitmap;
+
+                Utilities.drawSelectedAllAppsBitmap(mSelectionCanvas,
+                        selectionBitmap.getWidth(), selectionBitmap.getHeight(),
+                        pressed == SELECTED_PRESSED, info.iconBitmap);
+
+                mSelectedIcon = Allocation.createFromBitmap(mRS, selectionBitmap,
+                        Element.RGBA_8888(mRS), false);
+                mSelectedIcon.uploadToTexture(0);
+                mState.selectedIconTexture = mSelectedIcon.getID();
+
+                if (prev != index) {
+                    if (info.title != null && info.title.length() > 0) {
+                        //setContentDescription(info.title);
+                        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+                    }
+                }
+            }
+        }
+
+        /**
+         * You need to call save() on mState on your own after calling this.
+         */
+        void clearSelectedIcon() {
+            mState.selectedIconIndex = -1;
+        }
+
+        void setHomeSelected(int mode) {
+            final int prev = mLastSelection;
+            switch (mode) {
+            case SELECTED_NONE:
+                mState.homeButtonId = mHomeButtonNormal.getID();
+                break;
+            case SELECTED_FOCUSED:
+                mLastSelection = SELECTION_HOME;
+                mState.homeButtonId = mHomeButtonFocused.getID();
+                if (prev != SELECTION_HOME) {
+                    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+                }
+                break;
+            case SELECTED_PRESSED:
+                mState.homeButtonId = mHomeButtonPressed.getID();
+                break;
+            }
+        }
+
+        public void dumpState() {
+            Log.d(TAG, "mRollo.mWidth=" + mWidth);
+            Log.d(TAG, "mRollo.mHeight=" + mHeight);
+            Log.d(TAG, "mRollo.mIcons=" + mIcons);
+            if (mIcons != null) {
+                Log.d(TAG, "mRollo.mIcons.length=" + mIcons.length);
+            }
+            if (mIconIds != null) {
+                Log.d(TAG, "mRollo.mIconIds.length=" + mIconIds.length);
+            }
+            Log.d(TAG, "mRollo.mIconIds=" +  Arrays.toString(mIconIds));
+            if (mLabelIds != null) {
+                Log.d(TAG, "mRollo.mLabelIds.length=" + mLabelIds.length);
+            }
+            Log.d(TAG, "mRollo.mLabelIds=" +  Arrays.toString(mLabelIds));
+            Log.d(TAG, "mRollo.mTouchXBorders=" +  Arrays.toString(mTouchXBorders));
+            Log.d(TAG, "mRollo.mTouchYBorders=" +  Arrays.toString(mTouchYBorders));
+            Log.d(TAG, "mRollo.mState.newPositionX=" + mState.newPositionX);
+            Log.d(TAG, "mRollo.mState.newTouchDown=" + mState.newTouchDown);
+            Log.d(TAG, "mRollo.mState.flingVelocity=" + mState.flingVelocity);
+            Log.d(TAG, "mRollo.mState.iconCount=" + mState.iconCount);
+            Log.d(TAG, "mRollo.mState.selectedIconIndex=" + mState.selectedIconIndex);
+            Log.d(TAG, "mRollo.mState.selectedIconTexture=" + mState.selectedIconTexture);
+            Log.d(TAG, "mRollo.mState.zoomTarget=" + mState.zoomTarget);
+            Log.d(TAG, "mRollo.mState.homeButtonId=" + mState.homeButtonId);
+            Log.d(TAG, "mRollo.mState.targetPos=" + mState.targetPos);
+            Log.d(TAG, "mRollo.mParams.bubbleWidth=" + mParams.bubbleWidth);
+            Log.d(TAG, "mRollo.mParams.bubbleHeight=" + mParams.bubbleHeight);
+            Log.d(TAG, "mRollo.mParams.bubbleBitmapWidth=" + mParams.bubbleBitmapWidth);
+            Log.d(TAG, "mRollo.mParams.bubbleBitmapHeight=" + mParams.bubbleBitmapHeight);
+            Log.d(TAG, "mRollo.mParams.homeButtonWidth=" + mParams.homeButtonWidth);
+            Log.d(TAG, "mRollo.mParams.homeButtonHeight=" + mParams.homeButtonHeight);
+            Log.d(TAG, "mRollo.mParams.homeButtonTextureWidth=" + mParams.homeButtonTextureWidth);
+            Log.d(TAG, "mRollo.mParams.homeButtonTextureHeight=" + mParams.homeButtonTextureHeight);
+        }
+    }
+
+    public void dumpState() {
+        Log.d(TAG, "mRS=" + mRS);
+        Log.d(TAG, "mRollo=" + mRollo);
+        ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList", mAllAppsList);
+        Log.d(TAG, "mArrowNavigation=" + mArrowNavigation);
+        Log.d(TAG, "mStartedScrolling=" + mStartedScrolling);
+        Log.d(TAG, "mLastSelection=" + mLastSelection);
+        Log.d(TAG, "mLastSelectedIcon=" + mLastSelectedIcon);
+        Log.d(TAG, "mVelocityTracker=" + mVelocityTracker);
+        Log.d(TAG, "mTouchTracking=" + mTouchTracking);
+        Log.d(TAG, "mShouldGainFocus=" + mShouldGainFocus);
+        Log.d(TAG, "mZoomDirty=" + mZoomDirty);
+        Log.d(TAG, "mAnimateNextZoom=" + mAnimateNextZoom);
+        Log.d(TAG, "mZoom=" + mZoom);
+        Log.d(TAG, "mPosX=" + mPosX);
+        Log.d(TAG, "mVelocity=" + mVelocity);
+        Log.d(TAG, "mMessageProc=" + mMessageProc);
+        if (mRollo != null) {
+            mRollo.dumpState();
+        }
+        if (mRS != null) {
+            mRS.contextDump(0);
+        }
+    }
+}
+
+
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index cf75250..01a6df4 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -23,31 +23,26 @@
 import android.graphics.Canvas;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
 import android.os.SystemClock;
-import android.renderscript.Allocation;
-import android.renderscript.Dimension;
-import android.renderscript.Element;
-import android.renderscript.ProgramFragment;
-import android.renderscript.ProgramStore;
-import android.renderscript.ProgramVertex;
-import android.renderscript.RSSurfaceView;
-import android.renderscript.RenderScriptGL;
-import android.renderscript.RenderScript;
-import android.renderscript.Sampler;
-import android.renderscript.Script;
-import android.renderscript.ScriptC;
-import android.renderscript.SimpleMesh;
-import android.renderscript.Type;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.ViewGroup;
 import android.view.MotionEvent;
+import android.view.LayoutInflater;
 import android.view.SoundEffectConstants;
 import android.view.SurfaceHolder;
 import android.view.VelocityTracker;
 import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
 import android.view.ViewConfiguration;
 import android.view.accessibility.AccessibilityEvent;
+import android.widget.AdapterView;
+import android.widget.TextView;
+import android.widget.ArrayAdapter;
+import android.widget.GridView;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -55,1446 +50,30 @@
 import java.util.Comparator;
 
 
-public class AllAppsView extends RSSurfaceView
-        implements View.OnClickListener, View.OnLongClickListener, DragSource {
-    private static final String TAG = "Launcher.AllAppsView";
+public interface AllAppsView {
+    public interface Watcher {
+        public void zoomed(float zoom);
+    };
 
-    /** Bit for mLocks for when there are icons being loaded. */
-    private static final int LOCK_ICONS_PENDING = 1;
+    public void setLauncher(Launcher launcher);
 
-    private static final int TRACKING_NONE = 0;
-    private static final int TRACKING_FLING = 1;
-    private static final int TRACKING_HOME = 2;
+    public void setDragController(DragController dragger);
 
-    private static final int SELECTED_NONE = 0;
-    private static final int SELECTED_FOCUSED = 1;
-    private static final int SELECTED_PRESSED = 2;
+    public void zoom(float zoom, boolean animate);
 
-    private static final int SELECTION_NONE = 0;
-    private static final int SELECTION_ICONS = 1;
-    private static final int SELECTION_HOME = 2;
+    public boolean isVisible();
 
-    private Launcher mLauncher;
-    private DragController mDragController;
+    public boolean isOpaque();
 
-    /** When this is 0, modifications are allowed, when it's not, they're not.
-     * TODO: What about scrolling? */
-    private int mLocks = LOCK_ICONS_PENDING;
+    public void setApps(ArrayList<ApplicationInfo> list);
 
-    private int mSlop;
-    private int mMaxFlingVelocity;
+    public void addApps(ArrayList<ApplicationInfo> list);
 
-    private Defines mDefines = new Defines();
-    private RenderScriptGL mRS;
-    private RolloRS mRollo;
-    private ArrayList<ApplicationInfo> mAllAppsList;
+    public void removeApps(ArrayList<ApplicationInfo> list);
 
-    /**
-     * True when we are using arrow keys or trackball to drive navigation
-     */
-    private boolean mArrowNavigation = false;
-    private boolean mStartedScrolling;
+    public void updateApps(String packageName, ArrayList<ApplicationInfo> list);
 
-    /**
-     * Used to keep track of the selection when AllAppsView loses window focus.
-     * One of the SELECTION_ constants.
-     */
-    private int mLastSelection;
-
-    /**
-     * Used to keep track of the selection when AllAppsView loses window focus
-     */
-    private int mLastSelectedIcon;
-
-    private VelocityTracker mVelocityTracker;
-    private int mTouchTracking;
-    private int mMotionDownRawX;
-    private int mMotionDownRawY;
-    private int mDownIconIndex = -1;
-    private int mCurrentIconIndex = -1;
-
-    private boolean mShouldGainFocus;
-
-    private boolean mHaveSurface = false;
-    private boolean mZoomDirty = false;
-    private boolean mAnimateNextZoom;
-    private float mNextZoom;
-    private float mZoom;
-    private float mPosX;
-    private float mVelocity;
-    private AAMessage mMessageProc;
-
-    static class Defines {
-        public static final int ALLOC_PARAMS = 0;
-        public static final int ALLOC_STATE = 1;
-        public static final int ALLOC_ICON_IDS = 3;
-        public static final int ALLOC_LABEL_IDS = 4;
-        public static final int ALLOC_VP_CONSTANTS = 5;
-
-        public static final int COLUMNS_PER_PAGE = 4;
-        public static final int ROWS_PER_PAGE = 4;
-
-        public static final int ICON_WIDTH_PX = 64;
-        public static final int ICON_TEXTURE_WIDTH_PX = 74;
-        public static final int SELECTION_TEXTURE_WIDTH_PX = 74 + 20;
-
-        public static final int ICON_HEIGHT_PX = 64;
-        public static final int ICON_TEXTURE_HEIGHT_PX = 74;
-        public static final int SELECTION_TEXTURE_HEIGHT_PX = 74 + 20;
-    }
-
-    public AllAppsView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setFocusable(true);
-        setSoundEffectsEnabled(false);
-        getHolder().setFormat(PixelFormat.TRANSLUCENT);
-        final ViewConfiguration config = ViewConfiguration.get(context);
-        mSlop = config.getScaledTouchSlop();
-        mMaxFlingVelocity = config.getScaledMaximumFlingVelocity();
-
-        setOnClickListener(this);
-        setOnLongClickListener(this);
-        setZOrderOnTop(true);
-        getHolder().setFormat(PixelFormat.TRANSLUCENT);
-
-        mRS = createRenderScript(true);
-    }
-
-    /**
-     * Note that this implementation prohibits this view from ever being reattached.
-     */
-    @Override
-    protected void onDetachedFromWindow() {
-        destroyRenderScript();
-        mRS.mMessageCallback = null;
-        mRS = null;
-    }
-
-    /**
-     * If you have an attached click listener, View always plays the click sound!?!?
-     * Deal with sound effects by hand.
-     */
-    public void reallyPlaySoundEffect(int sound) {
-        boolean old = isSoundEffectsEnabled();
-        setSoundEffectsEnabled(true);
-        playSoundEffect(sound);
-        setSoundEffectsEnabled(old);
-    }
-
-    public AllAppsView(Context context, AttributeSet attrs, int defStyle) {
-        this(context, attrs);
-    }
-
-    public void setLauncher(Launcher launcher) {
-        mLauncher = launcher;
-    }
-
-    @Override
-    public void surfaceDestroyed(SurfaceHolder holder) {
-        super.surfaceDestroyed(holder);
-        // Without this, we leak mMessageCallback which leaks the context.
-        mRS.mMessageCallback = null;
-        // We may lose any callbacks that are pending, so make sure that we re-sync that
-        // on the next surfaceChanged.
-        mZoomDirty = true;
-        mHaveSurface = false;
-    }
-
-    @Override
-    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
-        //long startTime = SystemClock.uptimeMillis();
-
-        super.surfaceChanged(holder, format, w, h);
-
-        mHaveSurface = true;
-
-        if (mRollo == null) {
-            mRollo = new RolloRS();
-            mRollo.init(getResources(), w, h);
-            if (mAllAppsList != null) {
-                mRollo.setApps(mAllAppsList);
-            }
-            if (mShouldGainFocus) {
-                gainFocus();
-                mShouldGainFocus = false;
-            }
-        }
-        mRollo.dirtyCheck();
-        mRollo.resize(w, h);
-
-        if (mRS != null) {
-            mRS.mMessageCallback = mMessageProc = new AAMessage();
-        }
-
-        Resources res = getContext().getResources();
-        int barHeight = (int)res.getDimension(R.dimen.button_bar_height);
-
-
-        if (mRollo.mUniformAlloc != null) {
-            float tf[] = new float[] {72.f, 72.f,
-                                      120.f, 120.f, 0.f, 0.f,
-                                      120.f, 680.f,
-                                      (2.f / 480.f), 0, -((float)w / 2) - 0.25f, -380.25f};
-            if (w > h) {
-                tf[6] = 40.f;
-                tf[7] = h - 40.f;
-                tf[9] = 1.f;
-                tf[10] = -((float)w / 2) - 0.25f;
-                tf[11] = -((float)h / 2) - 0.25f;
-            }
-
-            mRollo.mUniformAlloc.data(tf);
-        }
-
-        //long endTime = SystemClock.uptimeMillis();
-        //Log.d(TAG, "surfaceChanged took " + (endTime-startTime) + "ms");
-    }
-
-    @Override
-    public void onWindowFocusChanged(boolean hasWindowFocus) {
-        super.onWindowFocusChanged(hasWindowFocus);
-        if (mArrowNavigation) {
-            if (!hasWindowFocus) {
-                // Clear selection when we lose window focus
-                mLastSelectedIcon = mRollo.mState.selectedIconIndex;
-                mRollo.setHomeSelected(SELECTED_NONE);
-                mRollo.clearSelectedIcon();
-                mRollo.mState.save();
-            } else if (hasWindowFocus) {
-                if (mRollo.mState.iconCount > 0) {
-                    if (mLastSelection == SELECTION_ICONS) {
-                        int selection = mLastSelectedIcon;
-                        final int firstIcon = Math.round(mPosX) *
-                            Defines.COLUMNS_PER_PAGE;
-                        if (selection < 0 || // No selection
-                                selection < firstIcon || // off the top of the screen
-                                selection >= mRollo.mState.iconCount || // past last icon
-                                selection >= firstIcon + // past last icon on screen
-                                    (Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE)) {
-                            selection = firstIcon;
-                        }
-
-                        // Select the first icon when we gain window focus
-                        mRollo.selectIcon(selection, SELECTED_FOCUSED);
-                        mRollo.mState.save();
-                    } else if (mLastSelection == SELECTION_HOME) {
-                        mRollo.setHomeSelected(SELECTED_FOCUSED);
-                        mRollo.mState.save();
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
-        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
-
-        if (!isVisible()) {
-            return;
-        }
-
-        if (gainFocus) {
-            if (mRollo != null) {
-                gainFocus();
-            } else {
-                mShouldGainFocus = true;
-            }
-        } else {
-            if (mRollo != null) {
-                if (mArrowNavigation) {
-                    // Clear selection when we lose focus
-                    mRollo.clearSelectedIcon();
-                    mRollo.setHomeSelected(SELECTED_NONE);
-                    mRollo.mState.save();
-                    mArrowNavigation = false;
-                }
-            } else {
-                mShouldGainFocus = false;
-            }
-        }
-    }
-
-    private void gainFocus() {
-        if (!mArrowNavigation && mRollo.mState.iconCount > 0) {
-            // Select the first icon when we gain keyboard focus
-            mArrowNavigation = true;
-            mRollo.selectIcon(Math.round(mPosX) * Defines.COLUMNS_PER_PAGE,
-                    SELECTED_FOCUSED);
-            mRollo.mState.save();
-        }
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-
-        boolean handled = false;
-
-        if (!isVisible()) {
-            return false;
-        }
-        final int iconCount = mRollo.mState.iconCount;
-
-        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
-            if (mArrowNavigation) {
-                if (mLastSelection == SELECTION_HOME) {
-                    reallyPlaySoundEffect(SoundEffectConstants.CLICK);
-                    mLauncher.closeAllApps(true);
-                } else {
-                    int whichApp = mRollo.mState.selectedIconIndex;
-                    if (whichApp >= 0) {
-                        ApplicationInfo app = mAllAppsList.get(whichApp);
-                        mLauncher.startActivitySafely(app.intent);
-                        handled = true;
-                    }
-                }
-            }
-        }
-
-        if (iconCount > 0) {
-            mArrowNavigation = true;
-
-            int currentSelection = mRollo.mState.selectedIconIndex;
-            int currentTopRow = Math.round(mPosX);
-
-            // The column of the current selection, in the range 0..COLUMNS_PER_PAGE-1
-            final int currentPageCol = currentSelection % Defines.COLUMNS_PER_PAGE;
-
-            // The row of the current selection, in the range 0..ROWS_PER_PAGE-1
-            final int currentPageRow = (currentSelection - (currentTopRow*Defines.COLUMNS_PER_PAGE))
-                    / Defines.ROWS_PER_PAGE;
-
-            int newSelection = currentSelection;
-
-            switch (keyCode) {
-            case KeyEvent.KEYCODE_DPAD_UP:
-                if (mLastSelection == SELECTION_HOME) {
-                    mRollo.setHomeSelected(SELECTED_NONE);
-                    int lastRowCount = iconCount % Defines.COLUMNS_PER_PAGE;
-                    if (lastRowCount == 0) {
-                        lastRowCount = Defines.COLUMNS_PER_PAGE;
-                    }
-                    newSelection = iconCount - lastRowCount + (Defines.COLUMNS_PER_PAGE / 2);
-                    if (newSelection >= iconCount) {
-                        newSelection = iconCount-1;
-                    }
-                    int target = (newSelection / Defines.COLUMNS_PER_PAGE)
-                            - (Defines.ROWS_PER_PAGE - 1);
-                    if (target < 0) {
-                        target = 0;
-                    }
-                    if (currentTopRow != target) {
-                        mRollo.moveTo(target);
-                    }
-                } else {
-                    if (currentPageRow > 0) {
-                        newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
-                    } else if (currentTopRow > 0) {
-                        newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
-                        mRollo.moveTo(newSelection / Defines.COLUMNS_PER_PAGE);
-                    } else if (currentPageRow != 0) {
-                        newSelection = currentTopRow * Defines.ROWS_PER_PAGE;
-                    }
-                }
-                handled = true;
-                break;
-
-            case KeyEvent.KEYCODE_DPAD_DOWN: {
-                final int rowCount = iconCount / Defines.COLUMNS_PER_PAGE
-                        + (iconCount % Defines.COLUMNS_PER_PAGE == 0 ? 0 : 1);
-                final int currentRow = currentSelection / Defines.COLUMNS_PER_PAGE;
-                if (mLastSelection != SELECTION_HOME) {
-                    if (currentRow < rowCount-1) {
-                        mRollo.setHomeSelected(SELECTED_NONE);
-                        if (currentSelection < 0) {
-                            newSelection = 0;
-                        } else {
-                            newSelection = currentSelection + Defines.COLUMNS_PER_PAGE;
-                        }
-                        if (newSelection >= iconCount) {
-                            // Go from D to G in this arrangement:
-                            //     A B C D
-                            //     E F G
-                            newSelection = iconCount - 1;
-                        }
-                        if (currentPageRow >= Defines.ROWS_PER_PAGE - 1) {
-                            mRollo.moveTo((newSelection / Defines.COLUMNS_PER_PAGE) -
-                                    Defines.ROWS_PER_PAGE + 1);
-                        }
-                    } else {
-                        newSelection = -1;
-                        mRollo.setHomeSelected(SELECTED_FOCUSED);
-                    }
-                }
-                handled = true;
-                break;
-            }
-            case KeyEvent.KEYCODE_DPAD_LEFT:
-                if (mLastSelection != SELECTION_HOME) {
-                    if (currentPageCol > 0) {
-                        newSelection = currentSelection - 1;
-                    }
-                }
-                handled = true;
-                break;
-            case KeyEvent.KEYCODE_DPAD_RIGHT:
-                if (mLastSelection != SELECTION_HOME) {
-                    if ((currentPageCol < Defines.COLUMNS_PER_PAGE - 1) &&
-                            (currentSelection < iconCount - 1)) {
-                        newSelection = currentSelection + 1;
-                    }
-                }
-                handled = true;
-                break;
-            }
-            if (newSelection != currentSelection) {
-                mRollo.selectIcon(newSelection, SELECTED_FOCUSED);
-                mRollo.mState.save();
-            }
-        }
-        return handled;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev)
-    {
-        mArrowNavigation = false;
-
-        if (!isVisible()) {
-            return true;
-        }
-
-        if (mLocks != 0) {
-            return true;
-        }
-
-        super.onTouchEvent(ev);
-
-        int x = (int)ev.getX();
-        int y = (int)ev.getY();
-
-        int action = ev.getAction();
-        switch (action) {
-        case MotionEvent.ACTION_DOWN:
-            if (y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]) {
-                mTouchTracking = TRACKING_HOME;
-                mRollo.setHomeSelected(SELECTED_PRESSED);
-                mRollo.mState.save();
-                mCurrentIconIndex = -1;
-            } else {
-                mTouchTracking = TRACKING_FLING;
-
-                mMotionDownRawX = (int)ev.getRawX();
-                mMotionDownRawY = (int)ev.getRawY();
-
-                mRollo.mState.newPositionX = ev.getRawY() / getHeight();
-                mRollo.mState.newTouchDown = 1;
-
-                if (!mRollo.checkClickOK()) {
-                    mRollo.clearSelectedIcon();
-                } else {
-                    mDownIconIndex = mCurrentIconIndex
-                            = mRollo.selectIcon(x, y, mPosX, SELECTED_PRESSED);
-                    if (mDownIconIndex < 0) {
-                        // if nothing was selected, no long press.
-                        cancelLongPress();
-                    }
-                }
-                mRollo.mState.save();
-                mRollo.move();
-                mVelocityTracker = VelocityTracker.obtain();
-                mVelocityTracker.addMovement(ev);
-                mStartedScrolling = false;
-            }
-            break;
-        case MotionEvent.ACTION_MOVE:
-        case MotionEvent.ACTION_OUTSIDE:
-            if (mTouchTracking == TRACKING_HOME) {
-                mRollo.setHomeSelected(y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]
-                        ? SELECTED_PRESSED : SELECTED_NONE);
-                mRollo.mState.save();
-            } else if (mTouchTracking == TRACKING_FLING) {
-                int rawX = (int)ev.getRawX();
-                int rawY = (int)ev.getRawY();
-                int slop;
-                slop = Math.abs(rawY - mMotionDownRawY);
-
-                if (!mStartedScrolling && slop < mSlop) {
-                    // don't update anything so when we do start scrolling
-                    // below, we get the right delta.
-                    mCurrentIconIndex = mRollo.chooseTappedIcon(x, y, mPosX);
-                    if (mDownIconIndex != mCurrentIconIndex) {
-                        // If a different icon is selected, don't allow it to be picked up.
-                        // This handles off-axis dragging.
-                        cancelLongPress();
-                        mCurrentIconIndex = -1;
-                    }
-                } else {
-                    if (!mStartedScrolling) {
-                        cancelLongPress();
-                        mCurrentIconIndex = -1;
-                    }
-                    mRollo.mState.newPositionX = ev.getRawY() / getHeight();
-                    mRollo.mState.newTouchDown = 1;
-                    mRollo.move();
-
-                    mStartedScrolling = true;
-                    mRollo.clearSelectedIcon();
-                    mVelocityTracker.addMovement(ev);
-                    mRollo.mState.save();
-                }
-            }
-            break;
-        case MotionEvent.ACTION_UP:
-        case MotionEvent.ACTION_CANCEL:
-            if (mTouchTracking == TRACKING_HOME) {
-                if (action == MotionEvent.ACTION_UP) {
-                    if (y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]) {
-                        reallyPlaySoundEffect(SoundEffectConstants.CLICK);
-                        mLauncher.closeAllApps(true);
-                    }
-                    mRollo.setHomeSelected(SELECTED_NONE);
-                    mRollo.mState.save();
-                }
-                mCurrentIconIndex = -1;
-            } else if (mTouchTracking == TRACKING_FLING) {
-                mRollo.mState.newTouchDown = 0;
-                mRollo.mState.newPositionX = ev.getRawY() / getHeight();
-
-                mVelocityTracker.computeCurrentVelocity(1000 /* px/sec */, mMaxFlingVelocity);
-                mRollo.mState.flingVelocity = mVelocityTracker.getYVelocity() / getHeight();
-                mRollo.clearSelectedIcon();
-                mRollo.mState.save();
-                mRollo.fling();
-
-                if (mVelocityTracker != null) {
-                    mVelocityTracker.recycle();
-                    mVelocityTracker = null;
-                }
-            }
-            mTouchTracking = TRACKING_NONE;
-            break;
-        }
-
-        return true;
-    }
-
-    public void onClick(View v) {
-        if (mLocks != 0 || !isVisible()) {
-            return;
-        }
-        if (mRollo.checkClickOK() && mCurrentIconIndex == mDownIconIndex
-                && mCurrentIconIndex >= 0 && mCurrentIconIndex < mAllAppsList.size()) {
-            reallyPlaySoundEffect(SoundEffectConstants.CLICK);
-            ApplicationInfo app = mAllAppsList.get(mCurrentIconIndex);
-            mLauncher.startActivitySafely(app.intent);
-        }
-    }
-
-    public boolean onLongClick(View v) {
-        if (mLocks != 0 || !isVisible()) {
-            return true;
-        }
-        if (mRollo.checkClickOK() && mCurrentIconIndex == mDownIconIndex
-                && mCurrentIconIndex >= 0 && mCurrentIconIndex < mAllAppsList.size()) {
-            ApplicationInfo app = mAllAppsList.get(mCurrentIconIndex);
-
-            Bitmap bmp = app.iconBitmap;
-            final int w = bmp.getWidth();
-            final int h = bmp.getHeight();
-
-            // We don't really have an accurate location to use.  This will do.
-            int screenX = mMotionDownRawX - (w / 2);
-            int screenY = mMotionDownRawY - h;
-
-            int left = (mDefines.ICON_TEXTURE_WIDTH_PX - mDefines.ICON_WIDTH_PX) / 2;
-            int top = (mDefines.ICON_TEXTURE_HEIGHT_PX - mDefines.ICON_HEIGHT_PX) / 2;
-            mDragController.startDrag(bmp, screenX, screenY,
-                    0, 0, w, h, this, app, DragController.DRAG_ACTION_COPY);
-
-            mLauncher.closeAllApps(true);
-        }
-        return true;
-    }
-
-    @Override
-    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
-        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SELECTED) {
-            if (!isVisible()) {
-                return false;
-            }
-            String text = null;
-            int index;
-            int count = mAllAppsList.size() + 1; // +1 is home
-            int pos = -1;
-            switch (mLastSelection) {
-            case SELECTION_ICONS:
-                index = mRollo.mState.selectedIconIndex;
-                if (index >= 0) {
-                    ApplicationInfo info = mAllAppsList.get(index);
-                    if (info.title != null) {
-                        text = info.title.toString();
-                        pos = index;
-                    }
-                }
-                break;
-            case SELECTION_HOME:
-                text = getContext().getString(R.string.all_apps_home_button_label);
-                pos = count;
-                break;
-            }
-            if (text != null) {
-                event.setEnabled(true);
-                event.getText().add(text);
-                //event.setContentDescription(text);
-                event.setItemCount(count);
-                event.setCurrentItemIndex(pos);
-            }
-        }
-        return false;
-    }
-
-    public void setDragController(DragController dragger) {
-        mDragController = dragger;
-    }
-
-    public void onDropCompleted(View target, boolean success) {
-    }
-
-    /**
-     * Zoom to the specifed level.
-     *
-     * @param zoom [0..1] 0 is hidden, 1 is open
-     */
-    public void zoom(float zoom, boolean animate) {
-        cancelLongPress();
-        mNextZoom = zoom;
-        mAnimateNextZoom = animate;
-        // if we do setZoom while we don't have a surface, we won't
-        // get the callbacks that actually set mZoom.
-        if (mRollo == null || !mHaveSurface) {
-            mZoomDirty = true;
-            mZoom = zoom;
-            return;
-        } else {
-            mRollo.setZoom(zoom, animate);
-        }
-    }
-
-    public boolean isVisible() {
-        return mZoom > 0.001f;
-    }
-
-    public boolean isOpaque() {
-        return mZoom > 0.999f;
-    }
-
-    public void setApps(ArrayList<ApplicationInfo> list) {
-        if (mRS == null) {
-            // We've been removed from the window.  Don't bother with all this.
-            return;
-        }
-
-        mAllAppsList = list;
-        if (mRollo != null) {
-            mRollo.setApps(list);
-        }
-        mLocks &= ~LOCK_ICONS_PENDING;
-    }
-
-    public void addApps(ArrayList<ApplicationInfo> list) {
-        if (mAllAppsList == null) {
-            // Not done loading yet.  We'll find out about it later.
-            return;
-        }
-        if (mRS == null) {
-            // We've been removed from the window.  Don't bother with all this.
-            return;
-        }
-
-        final int N = list.size();
-        if (mRollo != null) {
-            mRollo.reallocAppsList(mRollo.mState.iconCount + N);
-        }
-
-        for (int i=0; i<N; i++) {
-            final ApplicationInfo item = list.get(i);
-            int index = Collections.binarySearch(mAllAppsList, item,
-                    LauncherModel.APP_NAME_COMPARATOR);
-            if (index < 0) {
-                index = -(index+1);
-            }
-            mAllAppsList.add(index, item);
-            if (mRollo != null) {
-                mRollo.addApp(index, item);
-            }
-        }
-
-        if (mRollo != null) {
-            mRollo.saveAppsList();
-        }
-    }
-
-    public void removeApps(ArrayList<ApplicationInfo> list) {
-        if (mAllAppsList == null) {
-            // Not done loading yet.  We'll find out about it later.
-            return;
-        }
-
-        final int N = list.size();
-        for (int i=0; i<N; i++) {
-            final ApplicationInfo item = list.get(i);
-            int index = findAppByComponent(mAllAppsList, item);
-            if (index >= 0) {
-                int ic = mRollo != null ? mRollo.mState.iconCount : 666;
-                mAllAppsList.remove(index);
-                if (mRollo != null) {
-                    mRollo.removeApp(index);
-                }
-            } else {
-                Log.w(TAG, "couldn't find a match for item \"" + item + "\"");
-                // Try to recover.  This should keep us from crashing for now.
-            }
-        }
-
-        if (mRollo != null) {
-            mRollo.saveAppsList();
-        }
-    }
-
-    public void updateApps(String packageName, ArrayList<ApplicationInfo> list) {
-        // Just remove and add, because they may need to be re-sorted.
-        removeApps(list);
-        addApps(list);
-    }
-
-    private static int findAppByComponent(ArrayList<ApplicationInfo> list, ApplicationInfo item) {
-        ComponentName component = item.intent.getComponent();
-        final int N = list.size();
-        for (int i=0; i<N; i++) {
-            ApplicationInfo x = list.get(i);
-            if (x.intent.getComponent().equals(component)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    private static int countPages(int iconCount) {
-        int iconsPerPage = Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE;
-        int pages = iconCount / iconsPerPage;
-        if (pages*iconsPerPage != iconCount) {
-            pages++;
-        }
-        return pages;
-    }
-
-    class AAMessage extends RenderScript.RSMessage {
-        public void run() {
-            mPosX = ((float)mData[0]) / (1 << 16);
-            mVelocity = ((float)mData[1]) / (1 << 16);
-            mZoom = ((float)mData[2]) / (1 << 16);
-            mZoomDirty = false;
-        }
-    }
-
-    public class RolloRS {
-
-        // Allocations ======
-        private int mWidth;
-        private int mHeight;
-
-        private Resources mRes;
-        private Script mScript;
-        private Script.Invokable mInvokeMove;
-        private Script.Invokable mInvokeMoveTo;
-        private Script.Invokable mInvokeFling;
-        private Script.Invokable mInvokeResetWAR;
-        private Script.Invokable mInvokeSetZoom;
-
-        private ProgramStore mPSIcons;
-        private ProgramFragment mPFTexMip;
-        private ProgramFragment mPFTexMipAlpha;
-        private ProgramFragment mPFTexNearest;
-        private ProgramVertex mPV;
-        private ProgramVertex mPVCurve;
-        private SimpleMesh mMesh;
-        private ProgramVertex.MatrixAllocation mPVA;
-
-        private Allocation mUniformAlloc;
-
-        private Allocation mHomeButtonNormal;
-        private Allocation mHomeButtonFocused;
-        private Allocation mHomeButtonPressed;
-
-        private Allocation[] mIcons;
-        private int[] mIconIds;
-        private Allocation mAllocIconIds;
-
-        private Allocation[] mLabels;
-        private int[] mLabelIds;
-        private Allocation mAllocLabelIds;
-        private Allocation mSelectedIcon;
-
-        private int[] mTouchYBorders;
-        private int[] mTouchXBorders;
-
-        private Bitmap mSelectionBitmap;
-        private Canvas mSelectionCanvas;
-
-        Params mParams;
-        State mState;
-
-        class BaseAlloc {
-            Allocation mAlloc;
-            Type mType;
-
-            void save() {
-                mAlloc.data(this);
-            }
-        }
-
-        private boolean checkClickOK() {
-            return (Math.abs(mVelocity) < 0.4f) &&
-                   (Math.abs(mPosX - Math.round(mPosX)) < 0.4f);
-        }
-
-        class Params extends BaseAlloc {
-            Params() {
-                mType = Type.createFromClass(mRS, Params.class, 1, "ParamsClass");
-                mAlloc = Allocation.createTyped(mRS, mType);
-                save();
-            }
-            public int bubbleWidth;
-            public int bubbleHeight;
-            public int bubbleBitmapWidth;
-            public int bubbleBitmapHeight;
-
-            public int homeButtonWidth;
-            public int homeButtonHeight;
-            public int homeButtonTextureWidth;
-            public int homeButtonTextureHeight;
-        }
-
-        class State extends BaseAlloc {
-            public float newPositionX;
-            public int newTouchDown;
-            public float flingVelocity;
-            public int iconCount;
-            public int selectedIconIndex = -1;
-            public int selectedIconTexture;
-            public float zoomTarget;
-            public int homeButtonId;
-            public float targetPos;
-
-            State() {
-                mType = Type.createFromClass(mRS, State.class, 1, "StateClass");
-                mAlloc = Allocation.createTyped(mRS, mType);
-                save();
-            }
-        }
-
-        public RolloRS() {
-        }
-
-        public void init(Resources res, int width, int height) {
-            mRes = res;
-            mWidth = width;
-            mHeight = height;
-            initProgramVertex();
-            initProgramFragment();
-            initProgramStore();
-            initGl();
-            initData();
-            initTouchState();
-            initRs();
-        }
-
-        public void initMesh() {
-            SimpleMesh.TriangleMeshBuilder tm = new SimpleMesh.TriangleMeshBuilder(mRS, 2, 0);
-
-            for (int ct=0; ct < 16; ct++) {
-                float pos = (1.f / (16.f - 1)) * ct;
-                tm.addVertex(0.0f, pos);
-                tm.addVertex(1.0f, pos);
-            }
-            for (int ct=0; ct < (16 * 2 - 2); ct+= 2) {
-                tm.addTriangle(ct, ct+1, ct+2);
-                tm.addTriangle(ct+1, ct+3, ct+2);
-            }
-            mMesh = tm.create();
-            mMesh.setName("SMCell");
-        }
-
-        void resize(int w, int h) {
-            mPVA.setupProjectionNormalized(w, h);
-            mWidth = w;
-            mHeight = h;
-        }
-
-        private void initProgramVertex() {
-            mPVA = new ProgramVertex.MatrixAllocation(mRS);
-            resize(mWidth, mHeight);
-
-            ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
-            pvb.setTextureMatrixEnable(true);
-            mPV = pvb.create();
-            mPV.setName("PV");
-            mPV.bindAllocation(mPVA);
-
-            Element.Builder eb = new Element.Builder(mRS);
-            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "ImgSize");
-            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 4), "Position");
-            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "BendPos");
-            eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 4), "ScaleOffset");
-            Element e = eb.create();
-
-            mUniformAlloc = Allocation.createSized(mRS, e, 1);
-
-            initMesh();
-            ProgramVertex.ShaderBuilder sb = new ProgramVertex.ShaderBuilder(mRS);
-            String t = new String("void main() {\n" +
-                                  // Animation
-                                  "  float ani = UNI_Position.z;\n" +
-
-                                  "  float bendY1 = UNI_BendPos.x;\n" +
-                                  "  float bendY2 = UNI_BendPos.y;\n" +
-                                  "  float bendAngle = 47.0 * (3.14 / 180.0);\n" +
-                                  "  float bendDistance = bendY1 * 0.4;\n" +
-                                  "  float distanceDimLevel = 0.6;\n" +
-
-                                  "  float bendStep = (bendAngle / bendDistance) * (bendAngle * 0.5);\n" +
-                                  "  float aDy = cos(bendAngle);\n" +
-                                  "  float aDz = sin(bendAngle);\n" +
-
-                                  "  float scale = (2.0 / 480.0);\n" +
-                                  "  float x = UNI_Position.x + UNI_ImgSize.x * (1.0 - ani) * (ATTRIB_position.x - 0.5);\n" +
-                                  "  float ys= UNI_Position.y + UNI_ImgSize.y * (1.0 - ani) * ATTRIB_position.y;\n" +
-                                  "  float y = 0.0;\n" +
-                                  "  float z = 0.0;\n" +
-                                  "  float lum = 1.0;\n" +
-
-                                  "  float cv = min(ys, bendY1 - bendDistance) - (bendY1 - bendDistance);\n" +
-                                  "  y += cv * aDy;\n" +
-                                  "  z += -cv * aDz;\n" +
-                                  "  cv = clamp(ys, bendY1 - bendDistance, bendY1) - bendY1;\n" +  // curve range
-                                  "  lum += cv / bendDistance * distanceDimLevel;\n" +
-                                  "  y += cv * cos(cv * bendStep);\n" +
-                                  "  z += cv * sin(cv * bendStep);\n" +
-
-                                  "  cv = max(ys, bendY2 + bendDistance) - (bendY2 + bendDistance);\n" +
-                                  "  y += cv * aDy;\n" +
-                                  "  z += cv * aDz;\n" +
-                                  "  cv = clamp(ys, bendY2, bendY2 + bendDistance) - bendY2;\n" +
-                                  "  lum -= cv / bendDistance * distanceDimLevel;\n" +
-                                  "  y += cv * cos(cv * bendStep);\n" +
-                                  "  z += cv * sin(cv * bendStep);\n" +
-
-                                  "  y += clamp(ys, bendY1, bendY2);\n" +
-
-                                  "  vec4 pos;\n" +
-                                  "  pos.x = (x + UNI_ScaleOffset.z) * UNI_ScaleOffset.x;\n" +
-                                  "  pos.y = (y + UNI_ScaleOffset.w) * UNI_ScaleOffset.x;\n" +
-                                  "  pos.z = z * UNI_ScaleOffset.x;\n" +
-                                  "  pos.w = 1.0;\n" +
-
-                                  "  pos.x *= 1.0 + ani * 4.0;\n" +
-                                  "  pos.y *= 1.0 + ani * 4.0;\n" +
-                                  "  pos.z -= ani * 1.5;\n" +
-                                  "  lum *= 1.0 - ani;\n" +
-
-                                  "  gl_Position = UNI_MVP * pos;\n" +
-                                  "  varColor.rgba = vec4(lum, lum, lum, 1.0);\n" +
-                                  "  varTex0.xy = ATTRIB_position;\n" +
-                                  "  varTex0.y = 1.0 - varTex0.y;\n" +
-                                  "  varTex0.zw = vec2(0.0, 0.0);\n" +
-                                  "}\n");
-            sb.setShader(t);
-            sb.addConstant(mUniformAlloc.getType());
-            sb.addInput(mMesh.getVertexType(0).getElement());
-            mPVCurve = sb.create();
-            mPVCurve.setName("PVCurve");
-            mPVCurve.bindAllocation(mPVA);
-            mPVCurve.bindConstants(mUniformAlloc, 1);
-
-            mRS.contextBindProgramVertex(mPV);
-        }
-
-        private void initProgramFragment() {
-            Sampler.Builder sb = new Sampler.Builder(mRS);
-            sb.setMin(Sampler.Value.LINEAR_MIP_LINEAR);
-            sb.setMag(Sampler.Value.NEAREST);
-            sb.setWrapS(Sampler.Value.CLAMP);
-            sb.setWrapT(Sampler.Value.CLAMP);
-            Sampler linear = sb.create();
-
-            sb.setMin(Sampler.Value.NEAREST);
-            sb.setMag(Sampler.Value.NEAREST);
-            Sampler nearest = sb.create();
-
-            ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS);
-            bf.setTexture(ProgramFragment.Builder.EnvMode.MODULATE,
-                          ProgramFragment.Builder.Format.RGBA, 0);
-            mPFTexMip = bf.create();
-            mPFTexMip.setName("PFTexMip");
-            mPFTexMip.bindSampler(linear, 0);
-
-            mPFTexNearest = bf.create();
-            mPFTexNearest.setName("PFTexNearest");
-            mPFTexNearest.bindSampler(nearest, 0);
-
-            bf.setTexture(ProgramFragment.Builder.EnvMode.MODULATE,
-                          ProgramFragment.Builder.Format.ALPHA, 0);
-            mPFTexMipAlpha = bf.create();
-            mPFTexMipAlpha.setName("PFTexMipAlpha");
-            mPFTexMipAlpha.bindSampler(linear, 0);
-
-        }
-
-        private void initProgramStore() {
-            ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
-            bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
-            bs.setColorMask(true,true,true,false);
-            bs.setDitherEnable(true);
-            bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
-                            ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-            mPSIcons = bs.create();
-            mPSIcons.setName("PSIcons");
-        }
-
-        private void initGl() {
-            mTouchXBorders = new int[Defines.COLUMNS_PER_PAGE+1];
-            mTouchYBorders = new int[Defines.ROWS_PER_PAGE+1];
-        }
-
-        private void initData() {
-            mParams = new Params();
-            mState = new State();
-
-            final Utilities.BubbleText bubble = new Utilities.BubbleText(getContext());
-
-            mParams.bubbleWidth = bubble.getBubbleWidth();
-            mParams.bubbleHeight = bubble.getMaxBubbleHeight();
-            mParams.bubbleBitmapWidth = bubble.getBitmapWidth();
-            mParams.bubbleBitmapHeight = bubble.getBitmapHeight();
-
-            mHomeButtonNormal = Allocation.createFromBitmapResource(mRS, mRes,
-                    R.drawable.home_button_normal, Element.RGBA_8888(mRS), false);
-            mHomeButtonNormal.uploadToTexture(0);
-            mHomeButtonFocused = Allocation.createFromBitmapResource(mRS, mRes,
-                    R.drawable.home_button_focused, Element.RGBA_8888(mRS), false);
-            mHomeButtonFocused.uploadToTexture(0);
-            mHomeButtonPressed = Allocation.createFromBitmapResource(mRS, mRes,
-                    R.drawable.home_button_pressed, Element.RGBA_8888(mRS), false);
-            mHomeButtonPressed.uploadToTexture(0);
-            mParams.homeButtonWidth = 76;
-            mParams.homeButtonHeight = 68;
-            mParams.homeButtonTextureWidth = 128;
-            mParams.homeButtonTextureHeight = 128;
-
-            mState.homeButtonId = mHomeButtonNormal.getID();
-
-            mParams.save();
-            mState.save();
-
-            mSelectionBitmap = Bitmap.createBitmap(Defines.SELECTION_TEXTURE_WIDTH_PX,
-                    Defines.SELECTION_TEXTURE_HEIGHT_PX, Bitmap.Config.ARGB_8888);
-            mSelectionCanvas = new Canvas(mSelectionBitmap);
-
-            setApps(null);
-        }
-
-        private void initScript(int id) {
-        }
-
-        private void initRs() {
-            ScriptC.Builder sb = new ScriptC.Builder(mRS);
-            sb.setScript(mRes, R.raw.allapps);
-            sb.setRoot(true);
-            sb.addDefines(mDefines);
-            sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS);
-            sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
-            sb.setType(mUniformAlloc.getType(), "vpConstants", Defines.ALLOC_VP_CONSTANTS);
-            mInvokeMove = sb.addInvokable("move");
-            mInvokeFling = sb.addInvokable("fling");
-            mInvokeMoveTo = sb.addInvokable("moveTo");
-            mInvokeResetWAR = sb.addInvokable("resetHWWar");
-            mInvokeSetZoom = sb.addInvokable("setZoom");
-            mScript = sb.create();
-            mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
-            mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
-            mScript.bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
-            mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
-            mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
-            mScript.bindAllocation(mUniformAlloc, Defines.ALLOC_VP_CONSTANTS);
-
-            mRS.contextBindRootScript(mScript);
-        }
-
-        void dirtyCheck() {
-            if (mZoomDirty) {
-                setZoom(mNextZoom, mAnimateNextZoom);
-            }
-        }
-
-        private void setApps(ArrayList<ApplicationInfo> list) {
-            final int count = list != null ? list.size() : 0;
-            int allocCount = count;
-            if (allocCount < 1) {
-                allocCount = 1;
-            }
-
-            mIcons = new Allocation[count];
-            mIconIds = new int[allocCount];
-            mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
-
-            mLabels = new Allocation[count];
-            mLabelIds = new int[allocCount];
-            mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
-
-            Element ie8888 = Element.RGBA_8888(mRS);
-
-            mState.iconCount = count;
-            for (int i=0; i < mState.iconCount; i++) {
-                createAppIconAllocations(i, list.get(i));
-            }
-            for (int i=0; i < mState.iconCount; i++) {
-                uploadAppIcon(i, list.get(i));
-            }
-            saveAppsList();
-        }
-
-        private void setZoom(float zoom, boolean animate) {
-            mRollo.clearSelectedIcon();
-            mRollo.setHomeSelected(SELECTED_NONE);
-            if (zoom > 0.001f) {
-                mRollo.mState.zoomTarget = zoom;
-            } else {
-                mRollo.mState.zoomTarget = 0;
-            }
-            mRollo.mState.save();
-            if (!animate) {
-                mRollo.mInvokeSetZoom.execute();
-            }
-        }
-
-        private void createAppIconAllocations(int index, ApplicationInfo item) {
-            mIcons[index] = Allocation.createFromBitmap(mRS, item.iconBitmap,
-                    Element.RGBA_8888(mRS), true);
-            mLabels[index] = Allocation.createFromBitmap(mRS, item.titleBitmap,
-                    Element.A_8(mRS), true);
-            mIconIds[index] = mIcons[index].getID();
-            mLabelIds[index] = mLabels[index].getID();
-        }
-
-        private void uploadAppIcon(int index, ApplicationInfo item) {
-            if (mIconIds[index] != mIcons[index].getID()) {
-                throw new IllegalStateException("uploadAppIcon index=" + index
-                    + " mIcons[index].getID=" + mIcons[index].getID()
-                    + " mIconsIds[index]=" + mIconIds[index]
-                    + " item=" + item);
-            }
-            mIcons[index].uploadToTexture(0);
-            mLabels[index].uploadToTexture(0);
-        }
-
-        /**
-         * Puts the empty spaces at the end.  Updates mState.iconCount.  You must
-         * fill in the values and call saveAppsList().
-         */
-        private void reallocAppsList(int count) {
-            Allocation[] icons = new Allocation[count];
-            int[] iconIds = new int[count];
-            mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count);
-
-            Allocation[] labels = new Allocation[count];
-            int[] labelIds = new int[count];
-            mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count);
-
-            final int oldCount = mRollo.mState.iconCount;
-
-            System.arraycopy(mIcons, 0, icons, 0, oldCount);
-            System.arraycopy(mIconIds, 0, iconIds, 0, oldCount);
-            System.arraycopy(mLabels, 0, labels, 0, oldCount);
-            System.arraycopy(mLabelIds, 0, labelIds, 0, oldCount);
-
-            mIcons = icons;
-            mIconIds = iconIds;
-            mLabels = labels;
-            mLabelIds = labelIds;
-        }
-
-        /**
-         * Handle the allocations for the new app.  Make sure you call saveAppsList when done.
-         */
-        private void addApp(int index, ApplicationInfo item) {
-            final int count = mState.iconCount - index;
-            final int dest = index + 1;
-
-            System.arraycopy(mIcons, index, mIcons, dest, count);
-            System.arraycopy(mIconIds, index, mIconIds, dest, count);
-            System.arraycopy(mLabels, index, mLabels, dest, count);
-            System.arraycopy(mLabelIds, index, mLabelIds, dest, count);
-
-            createAppIconAllocations(index, item);
-            uploadAppIcon(index, item);
-            mRollo.mState.iconCount++;
-        }
-
-        /**
-         * Handle the allocations for the removed app.  Make sure you call saveAppsList when done.
-         */
-        private void removeApp(int index) {
-            final int count = mState.iconCount - index - 1;
-            final int src = index + 1;
-
-            System.arraycopy(mIcons, src, mIcons, index, count);
-            System.arraycopy(mIconIds, src, mIconIds, index, count);
-            System.arraycopy(mLabels, src, mLabels, index, count);
-            System.arraycopy(mLabelIds, src, mLabelIds, index, count);
-
-            mRollo.mState.iconCount--;
-            final int last = mState.iconCount;
-
-            mIcons[last] = null;
-            mIconIds[last] = 0;
-            mLabels[last] = null;
-            mLabelIds[last] = 0;
-        }
-
-        /**
-         * Send the apps list structures to RS.
-         */
-        private void saveAppsList() {
-            // WTF: how could mScript be not null but mAllocIconIds null b/2460740.
-            if (mScript != null && mAllocIconIds != null) {
-                mRS.contextBindRootScript(null);
-
-                mAllocIconIds.data(mIconIds);
-                mAllocLabelIds.data(mLabelIds);
-
-                mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
-                mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
-
-                mState.save();
-
-                // Note: mScript may be null if we haven't initialized it yet.
-                // In that case, this is a no-op.
-                if (mInvokeResetWAR != null) {
-                    mInvokeResetWAR.execute();
-                }
-
-                mRS.contextBindRootScript(mScript);
-            }
-        }
-
-        void initTouchState() {
-            int width = getWidth();
-            int height = getHeight();
-            int cellHeight = 145;//iconsSize / Defines.ROWS_PER_PAGE;
-            int cellWidth = width / Defines.COLUMNS_PER_PAGE;
-
-            int centerY = (height / 2);
-            mTouchYBorders[0] = centerY - (cellHeight * 2);
-            mTouchYBorders[1] = centerY - cellHeight;
-            mTouchYBorders[2] = centerY;
-            mTouchYBorders[3] = centerY + cellHeight;
-            mTouchYBorders[4] = centerY + (cellHeight * 2);
-
-            int centerX = (width / 2);
-            mTouchXBorders[0] = 0;
-            mTouchXBorders[1] = centerX - (width / 4);
-            mTouchXBorders[2] = centerX;
-            mTouchXBorders[3] = centerX + (width / 4);
-            mTouchXBorders[4] = width;
-        }
-
-        void fling() {
-            mInvokeFling.execute();
-        }
-
-        void move() {
-            mInvokeMove.execute();
-        }
-
-        void moveTo(float row) {
-            mState.targetPos = row;
-            mState.save();
-            mInvokeMoveTo.execute();
-        }
-
-        int chooseTappedIcon(int x, int y, float pos) {
-            // Adjust for scroll position if not zero.
-            y += (pos - ((int)pos)) * (mTouchYBorders[1] - mTouchYBorders[0]);
-
-            int col = -1;
-            int row = -1;
-            for (int i=0; i<Defines.COLUMNS_PER_PAGE; i++) {
-                if (x >= mTouchXBorders[i] && x < mTouchXBorders[i+1]) {
-                    col = i;
-                    break;
-                }
-            }
-            for (int i=0; i<Defines.ROWS_PER_PAGE; i++) {
-                if (y >= mTouchYBorders[i] && y < mTouchYBorders[i+1]) {
-                    row = i;
-                    break;
-                }
-            }
-
-            if (row < 0 || col < 0) {
-                return -1;
-            }
-
-            int index = (((int)pos) * Defines.COLUMNS_PER_PAGE)
-                    + (row * Defines.ROWS_PER_PAGE) + col;
-
-            if (index >= mState.iconCount) {
-                return -1;
-            } else {
-                return index;
-            }
-        }
-
-        /**
-         * You need to call save() on mState on your own after calling this.
-         *
-         * @return the index of the icon that was selected.
-         */
-        int selectIcon(int x, int y, float pos, int pressed) {
-            final int index = chooseTappedIcon(x, y, pos);
-            selectIcon(index, pressed);
-            return index;
-        }
-
-        /**
-         * Select the icon at the given index.
-         *
-         * @param index The index.
-         * @param pressed one of SELECTED_PRESSED or SELECTED_FOCUSED
-         */
-        void selectIcon(int index, int pressed) {
-            if (mAllAppsList == null || index < 0 || index >= mAllAppsList.size()) {
-                mState.selectedIconIndex = -1;
-                if (mLastSelection == SELECTION_ICONS) {
-                    mLastSelection = SELECTION_NONE;
-                }
-            } else {
-                if (pressed == SELECTED_FOCUSED) {
-                    mLastSelection = SELECTION_ICONS;
-                }
-
-                int prev = mState.selectedIconIndex;
-                mState.selectedIconIndex = index;
-
-                ApplicationInfo info = mAllAppsList.get(index);
-                Bitmap selectionBitmap = mSelectionBitmap;
-
-                Utilities.drawSelectedAllAppsBitmap(mSelectionCanvas,
-                        selectionBitmap.getWidth(), selectionBitmap.getHeight(),
-                        pressed == SELECTED_PRESSED, info.iconBitmap);
-
-                mSelectedIcon = Allocation.createFromBitmap(mRS, selectionBitmap,
-                        Element.RGBA_8888(mRS), false);
-                mSelectedIcon.uploadToTexture(0);
-                mState.selectedIconTexture = mSelectedIcon.getID();
-
-                if (prev != index) {
-                    if (info.title != null && info.title.length() > 0) {
-                        //setContentDescription(info.title);
-                        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
-                    }
-                }
-            }
-        }
-
-        /**
-         * You need to call save() on mState on your own after calling this.
-         */
-        void clearSelectedIcon() {
-            mState.selectedIconIndex = -1;
-        }
-
-        void setHomeSelected(int mode) {
-            final int prev = mLastSelection;
-            switch (mode) {
-            case SELECTED_NONE:
-                mState.homeButtonId = mHomeButtonNormal.getID();
-                break;
-            case SELECTED_FOCUSED:
-                mLastSelection = SELECTION_HOME;
-                mState.homeButtonId = mHomeButtonFocused.getID();
-                if (prev != SELECTION_HOME) {
-                    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
-                }
-                break;
-            case SELECTED_PRESSED:
-                mState.homeButtonId = mHomeButtonPressed.getID();
-                break;
-            }
-        }
-
-        public void dumpState() {
-            Log.d(TAG, "mRollo.mWidth=" + mWidth);
-            Log.d(TAG, "mRollo.mHeight=" + mHeight);
-            Log.d(TAG, "mRollo.mIcons=" + mIcons);
-            if (mIcons != null) {
-                Log.d(TAG, "mRollo.mIcons.length=" + mIcons.length);
-            }
-            if (mIconIds != null) {
-                Log.d(TAG, "mRollo.mIconIds.length=" + mIconIds.length);
-            }
-            Log.d(TAG, "mRollo.mIconIds=" +  Arrays.toString(mIconIds));
-            if (mLabelIds != null) {
-                Log.d(TAG, "mRollo.mLabelIds.length=" + mLabelIds.length);
-            }
-            Log.d(TAG, "mRollo.mLabelIds=" +  Arrays.toString(mLabelIds));
-            Log.d(TAG, "mRollo.mTouchXBorders=" +  Arrays.toString(mTouchXBorders));
-            Log.d(TAG, "mRollo.mTouchYBorders=" +  Arrays.toString(mTouchYBorders));
-            Log.d(TAG, "mRollo.mState.newPositionX=" + mState.newPositionX);
-            Log.d(TAG, "mRollo.mState.newTouchDown=" + mState.newTouchDown);
-            Log.d(TAG, "mRollo.mState.flingVelocity=" + mState.flingVelocity);
-            Log.d(TAG, "mRollo.mState.iconCount=" + mState.iconCount);
-            Log.d(TAG, "mRollo.mState.selectedIconIndex=" + mState.selectedIconIndex);
-            Log.d(TAG, "mRollo.mState.selectedIconTexture=" + mState.selectedIconTexture);
-            Log.d(TAG, "mRollo.mState.zoomTarget=" + mState.zoomTarget);
-            Log.d(TAG, "mRollo.mState.homeButtonId=" + mState.homeButtonId);
-            Log.d(TAG, "mRollo.mState.targetPos=" + mState.targetPos);
-            Log.d(TAG, "mRollo.mParams.bubbleWidth=" + mParams.bubbleWidth);
-            Log.d(TAG, "mRollo.mParams.bubbleHeight=" + mParams.bubbleHeight);
-            Log.d(TAG, "mRollo.mParams.bubbleBitmapWidth=" + mParams.bubbleBitmapWidth);
-            Log.d(TAG, "mRollo.mParams.bubbleBitmapHeight=" + mParams.bubbleBitmapHeight);
-            Log.d(TAG, "mRollo.mParams.homeButtonWidth=" + mParams.homeButtonWidth);
-            Log.d(TAG, "mRollo.mParams.homeButtonHeight=" + mParams.homeButtonHeight);
-            Log.d(TAG, "mRollo.mParams.homeButtonTextureWidth=" + mParams.homeButtonTextureWidth);
-            Log.d(TAG, "mRollo.mParams.homeButtonTextureHeight=" + mParams.homeButtonTextureHeight);
-        }
-    }
-
-    public void dumpState() {
-        Log.d(TAG, "mRS=" + mRS);
-        Log.d(TAG, "mRollo=" + mRollo);
-        ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList", mAllAppsList);
-        Log.d(TAG, "mArrowNavigation=" + mArrowNavigation);
-        Log.d(TAG, "mStartedScrolling=" + mStartedScrolling);
-        Log.d(TAG, "mLastSelection=" + mLastSelection);
-        Log.d(TAG, "mLastSelectedIcon=" + mLastSelectedIcon);
-        Log.d(TAG, "mVelocityTracker=" + mVelocityTracker);
-        Log.d(TAG, "mTouchTracking=" + mTouchTracking);
-        Log.d(TAG, "mShouldGainFocus=" + mShouldGainFocus);
-        Log.d(TAG, "mZoomDirty=" + mZoomDirty);
-        Log.d(TAG, "mAnimateNextZoom=" + mAnimateNextZoom);
-        Log.d(TAG, "mZoom=" + mZoom);
-        Log.d(TAG, "mPosX=" + mPosX);
-        Log.d(TAG, "mVelocity=" + mVelocity);
-        Log.d(TAG, "mMessageProc=" + mMessageProc);
-        if (mRollo != null) {
-            mRollo.dumpState();
-        }
-        if (mRS != null) {
-            mRS.contextDump(0);
-        }
-    }
+    public void dumpState();
 }
 
 
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 11b26c5..5146ffd 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -85,7 +85,7 @@
  * Default launcher application.
  */
 public final class Launcher extends Activity
-        implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks {
+        implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {
     static final String TAG = "Launcher";
     static final boolean LOGD = false;
 
@@ -552,9 +552,9 @@
         mAllAppsGrid = (AllAppsView)dragLayer.findViewById(R.id.all_apps_view);
         mAllAppsGrid.setLauncher(this);
         mAllAppsGrid.setDragController(dragController);
-        mAllAppsGrid.setWillNotDraw(false); // We don't want a hole punched in our window.
+        ((View)mAllAppsGrid).setWillNotDraw(false); // We don't want a hole punched in our window.
         // Manage focusability manually since this thing is always visible
-        mAllAppsGrid.setFocusable(false); 
+        ((View)mAllAppsGrid).setFocusable(false); 
 
         mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
         final Workspace workspace = mWorkspace;
@@ -1685,11 +1685,18 @@
         return mAllAppsGrid.isVisible();
     }
 
+    // AllAppsView.Watcher
+    public void zoomed(float zoom) {
+        if (zoom == 1.0f) {
+            mWorkspace.setVisibility(View.GONE);
+        }
+    }
+
     void showAllApps(boolean animated) {
         mAllAppsGrid.zoom(1.0f, animated);
 
-        mAllAppsGrid.setFocusable(true);
-        mAllAppsGrid.requestFocus();
+        ((View)mAllAppsGrid).setFocusable(true);
+        ((View)mAllAppsGrid).requestFocus();
         
         // TODO: fade these two too
         mDeleteZone.setVisibility(View.GONE);
@@ -1732,8 +1739,9 @@
      */
     void closeAllApps(boolean animated) {
         if (mAllAppsGrid.isVisible()) {
+            mWorkspace.setVisibility(View.VISIBLE);
             mAllAppsGrid.zoom(0.0f, animated);
-            mAllAppsGrid.setFocusable(false);
+            ((View)mAllAppsGrid).setFocusable(false);
             mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus();
         }
     }
