Reconcile with jb-mr1-factory-release jb-mr1-release - do not merge

Change-Id: Ia95ceb234c77dafcedb79274226f4bd279c63c79
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9ae31d7..adb6ef3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -99,15 +99,6 @@
                 android:resource="@xml/wallpaper_picker_preview" />
         </activity>
 
-        <activity android:name="com.android.launcher2.RocketLauncher"
-            android:label="@string/dream_name"
-            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
-            <intent-filter>
-                <action android:name="android.service.dreams.DreamService" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
         <!-- Intent received used to prepopulate the default workspace. -->
         <receiver
             android:name="com.android.launcher2.PreloadReceiver"
diff --git a/res/drawable-xhdpi/wallpaper_01.jpg b/res/drawable-xhdpi/wallpaper_01.jpg
index 5b8d1d5..da9fa91 100644
--- a/res/drawable-xhdpi/wallpaper_01.jpg
+++ b/res/drawable-xhdpi/wallpaper_01.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_02.jpg b/res/drawable-xhdpi/wallpaper_02.jpg
index 29cba13..ee949aa 100644
--- a/res/drawable-xhdpi/wallpaper_02.jpg
+++ b/res/drawable-xhdpi/wallpaper_02.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_03.jpg b/res/drawable-xhdpi/wallpaper_03.jpg
index 5c165cf..9931ca2 100644
--- a/res/drawable-xhdpi/wallpaper_03.jpg
+++ b/res/drawable-xhdpi/wallpaper_03.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_04.jpg b/res/drawable-xhdpi/wallpaper_04.jpg
index 2f0da9d..306c8cd 100644
--- a/res/drawable-xhdpi/wallpaper_04.jpg
+++ b/res/drawable-xhdpi/wallpaper_04.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_05.jpg b/res/drawable-xhdpi/wallpaper_05.jpg
index 4ae7bb9..0735f5f 100644
--- a/res/drawable-xhdpi/wallpaper_05.jpg
+++ b/res/drawable-xhdpi/wallpaper_05.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_08.jpg b/res/drawable-xhdpi/wallpaper_08.jpg
index d091cb7..3fa6811 100644
--- a/res/drawable-xhdpi/wallpaper_08.jpg
+++ b/res/drawable-xhdpi/wallpaper_08.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_09.jpg b/res/drawable-xhdpi/wallpaper_09.jpg
index 7990d4c..cd062a6 100644
--- a/res/drawable-xhdpi/wallpaper_09.jpg
+++ b/res/drawable-xhdpi/wallpaper_09.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_10.jpg b/res/drawable-xhdpi/wallpaper_10.jpg
index 1fd1388..02b441e 100644
--- a/res/drawable-xhdpi/wallpaper_10.jpg
+++ b/res/drawable-xhdpi/wallpaper_10.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_11.jpg b/res/drawable-xhdpi/wallpaper_11.jpg
index b1609b9..39490ac 100644
--- a/res/drawable-xhdpi/wallpaper_11.jpg
+++ b/res/drawable-xhdpi/wallpaper_11.jpg
Binary files differ
diff --git a/res/drawable-xhdpi/wallpaper_12.jpg b/res/drawable-xhdpi/wallpaper_12.jpg
index ed7fa0f..d1ca450 100644
--- a/res/drawable-xhdpi/wallpaper_12.jpg
+++ b/res/drawable-xhdpi/wallpaper_12.jpg
Binary files differ
diff --git a/res/layout-land/workspace_cling.xml b/res/layout-land/workspace_cling.xml
index b66f1bd..b035aa1 100644
--- a/res/layout-land/workspace_cling.xml
+++ b/res/layout-land/workspace_cling.xml
@@ -16,6 +16,8 @@
 <com.android.launcher2.Cling
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
     launcher:drawIdentifier="workspace_landscape">
     <FrameLayout
         android:layout_width="match_parent"
@@ -28,6 +30,8 @@
             android:orientation="vertical">
             <TextView
                 style="@style/ClingTitleText"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
                 android:text="@string/workspace_cling_title" />
             <TextView
                 style="@style/ClingText"
@@ -46,6 +50,8 @@
         android:text="@string/workspace_cling_open_all_apps" />
     <Button
         style="@style/ClingButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:layout_marginBottom="15dp"
         android:layout_marginRight="10dp"
         android:layout_gravity="bottom|right"
diff --git a/res/layout-port/workspace_cling.xml b/res/layout-port/workspace_cling.xml
index 10e6976..738e2c5 100644
--- a/res/layout-port/workspace_cling.xml
+++ b/res/layout-port/workspace_cling.xml
@@ -16,6 +16,8 @@
 <com.android.launcher2.Cling
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
     launcher:drawIdentifier="workspace_portrait">
     <FrameLayout
         android:layout_width="match_parent"
@@ -29,6 +31,8 @@
             android:orientation="vertical">
             <TextView
                 style="@style/ClingTitleText"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
                 android:text="@string/workspace_cling_title" />
             <TextView
                 style="@style/ClingText"
@@ -49,6 +53,8 @@
         android:text="@string/workspace_cling_open_all_apps" />
     <Button
         style="@style/ClingButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:layout_marginBottom="15dp"
         android:layout_marginRight="10dp"
         android:layout_gravity="bottom|right"
diff --git a/res/layout-sw720dp/workspace_cling.xml b/res/layout-sw720dp/workspace_cling.xml
index 10e6976..738e2c5 100644
--- a/res/layout-sw720dp/workspace_cling.xml
+++ b/res/layout-sw720dp/workspace_cling.xml
@@ -16,6 +16,8 @@
 <com.android.launcher2.Cling
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
     launcher:drawIdentifier="workspace_portrait">
     <FrameLayout
         android:layout_width="match_parent"
@@ -29,6 +31,8 @@
             android:orientation="vertical">
             <TextView
                 style="@style/ClingTitleText"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
                 android:text="@string/workspace_cling_title" />
             <TextView
                 style="@style/ClingText"
@@ -49,6 +53,8 @@
         android:text="@string/workspace_cling_open_all_apps" />
     <Button
         style="@style/ClingButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         android:layout_marginBottom="15dp"
         android:layout_marginRight="10dp"
         android:layout_gravity="bottom|right"
diff --git a/res/layout/custom_workspace_cling.xml b/res/layout/custom_workspace_cling.xml
index 5bdc587..0fdb575 100644
--- a/res/layout/custom_workspace_cling.xml
+++ b/res/layout/custom_workspace_cling.xml
@@ -17,6 +17,8 @@
 <com.android.launcher2.Cling
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
     launcher:drawIdentifier="workspace_custom">
     <TextView
         android:layout_width="wrap_content"
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 63a0972..a1bfb2e 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -28,12 +28,12 @@
     <string name="pick_wallpaper" msgid="5630222540525626723">"ልጥፎች"</string>
     <string name="activity_not_found" msgid="217823393239365967">"ትግበራ አልተጫነም።"</string>
     <string name="widgets_tab_label" msgid="9145860100000983599">" ፍርግሞች"</string>
-    <string name="long_press_widget_to_add" msgid="7395697462851217506">"ፍርግም ለማንሳት ንካ &amp; በመጫን ያዝ"</string>
+    <string name="long_press_widget_to_add" msgid="7395697462851217506">"ፍርግም ለማንሳት ይንክ እና በመጫን ይያዙ"</string>
     <string name="market" msgid="2652226429823445833">"ሸምት"</string>
     <string name="external_drop_widget_error" msgid="2285187188524172774">"እዚህ የመነሻ ማያ ላይ ንጥል ማኖር አልተቻለም።"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"ለመፍጠር ምግብር  ምረጥ"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"አቃፊ ስም"</string>
-    <string name="rename_folder_title" msgid="4544573104191526550">"አቃፊእንደገና ሰይም"</string>
+    <string name="rename_folder_title" msgid="4544573104191526550">"አቃፊ እንደገና ሰይም"</string>
     <string name="rename_action" msgid="6016003384693240896">"እሺ"</string>
     <string name="cancel_action" msgid="3811860427489435048">"ይቅር"</string>
     <string name="menu_item_add_item" msgid="6233177331075781114">"ወደ መነሻ ማያ አክል"</string>
@@ -72,17 +72,17 @@
     <string name="cab_menu_delete_app" msgid="4089398025537640349">"ትግበራ አራግፍ"</string>
     <string name="cab_menu_app_info" msgid="914548323652698884">"የትግበራ ዝርዝር"</string>
     <string name="cab_app_selection_text" msgid="6378522164293415735">"1 መተግበሪያ  ተመርጧል"</string>
-    <string name="cab_widget_selection_text" msgid="962527270506951955">"1 ዊድጌት ተመርጧል"</string>
+    <string name="cab_widget_selection_text" msgid="962527270506951955">"1 ፍርግም ተመርጧል"</string>
     <string name="cab_folder_selection_text" msgid="8916111874189565067">"1 አቃፊ ተመርጧል"</string>
     <string name="cab_shortcut_selection_text" msgid="8115847384500412878">"1 አቋራጭ ተመርጧል"</string>
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"አቋራጮችን ጫን።"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"መተግበሪያ  ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ ለማከል ይፈቅዳል።"</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"አቋራጮችን አራግፍ"</string>
     <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ ለማስወገድ ለመተግበሪያ ይፈቅዳል።"</string>
-    <string name="permlab_read_settings" msgid="3452408290738106747">"የመነሻቅንብሮች እና አቋራጮችን አንብብ"</string>
-    <string name="permdesc_read_settings" msgid="5788109303585403679">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለማንበብ ለትግበራ ይፈቅዳል።"</string>
+    <string name="permlab_read_settings" msgid="3452408290738106747">"የመነሻ ቅንብሮች እና አቋራጮችን ያንብቡ"</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"ቅንብሮችን እና አቋራጮችን በመነሻ ለማንበብ ለትግበራ ይፈቅዳል።"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"መነሻ ቅንብሮች እና አቋራጮች ፃፍ"</string>
-    <string name="permdesc_write_settings" msgid="8530105489115785531">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለመለወጥ ለመተግበሪያ ይፈቅዳል።"</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"ቅንብሮችን እና አቋራጮችን በመነሻ ለመለወጥ ለመተግበሪያ ይፈቅዳል።"</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"ፍርግም የመጫን ችግር"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"ይህ የስርዓት ትግበራ ነው እና አለማራገፍ አይቻልም።"</string>
     <string name="dream_name" msgid="2847171357608437154">"የሮኬት ማስነሻ"</string>
@@ -92,14 +92,14 @@
     <string name="workspace_scroll_format" msgid="1704767047951143301">"መነሻ ማያ ገጽ %1$d ከ%2$d"</string>
     <string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"Appsገጽ %1$d የ %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"ፍርግሞች ገጽ %1$d የ %2$d"</string>
-    <string name="workspace_cling_title" msgid="738396473989890567">"እቤትህ እንዳለህ ሆነሀ ዘና በል"</string>
-    <string name="workspace_cling_move_item" msgid="791013895761065070">"ተወዳጅ መተግበሪያዎችህን እዚህ ላይ ማስቀመጥ ትችላለህ፡፡"</string>
-    <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"ሁሉንም መተግበሪያዎችህን ለማየት፣ ክቡን ንካ::"</string>
-    <string name="all_apps_cling_title" msgid="2559734712581447107">"አንዳንድ መተግበሪያዎች ምረጥ"</string>
-    <string name="all_apps_cling_add_item" msgid="5665035103260318891">"ወደ መነሻ ማያህ፣ መተግበሪያ ለማከል፣ ንካውና &amp; ያዘው፡፡"</string>
-    <string name="folder_cling_title" msgid="4308949882377840953">"መተግበሪያዎችህን ከዓቃፊዎች ጋር አደራጅ"</string>
-    <string name="folder_cling_move_item" msgid="270598675060435169">"መተግበሪያ ለማንቀሳቀስ፣ ንካው እና &amp; ያዘው::"</string>
-    <string name="folder_cling_create_folder" msgid="8352867485656129478">"በመነሻ ማያህ ላይ አዲስ ዓቃፊ ለመፍጠር፣ አንዱን መተግበሪያ በሌላው ላይ ቆልል፡፡"</string>
+    <string name="workspace_cling_title" msgid="738396473989890567">"እቤትዎ እንዳሉ ሆነው ዘና ይበሉ"</string>
+    <string name="workspace_cling_move_item" msgid="791013895761065070">"ተወዳጅ መተግበሪያዎችዎን እዚህ ላይ ማስቀመጥ ይችላሉ።"</string>
+    <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"ሁሉንም መተግበሪያዎችዎን ለማየት፣ ክቡን ይንኩ"</string>
+    <string name="all_apps_cling_title" msgid="2559734712581447107">"አንዳንድ መተግበሪያዎችን ይምረጡ"</string>
+    <string name="all_apps_cling_add_item" msgid="5665035103260318891">"ወደ መነሻ ማያዎ፣ መተግበሪያ ለማከል፣ ይንኩት እና ይያዙ።"</string>
+    <string name="folder_cling_title" msgid="4308949882377840953">"መተግበሪያዎችዎን ከዓቃፊዎች ጋር ያደራጁ"</string>
+    <string name="folder_cling_move_item" msgid="270598675060435169">"መተግበሪያ ለማንቀሳቀስ፣ ይንኩት እና ይያዙት"</string>
+    <string name="folder_cling_create_folder" msgid="8352867485656129478">"በመነሻ ማያዎ ላይ አዲስ ዓቃፊ ለመፍጠር፣ አንዱን መተግበሪያ በሌላው ላይ ይቆልሉ።"</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"እሺ"</string>
     <string name="folder_opened" msgid="1262064100943801533">"አቃፊ ተከፍቷል፣ <xliff:g id="WIDTH">%1$d</xliff:g> በ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1335478160661137579">"አቃፊን ለመዝጋት ንካ"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 5dd726a..7e49aef 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -20,7 +20,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="8424725141379931883">"Покретач"</string>
-    <string name="home" msgid="5921706419368316758">"Кућни"</string>
+    <string name="home" msgid="5921706419368316758">"Почетна"</string>
     <string name="uid_name" msgid="3371120195364560632">"Основне Android апликације"</string>
     <string name="folder_name" msgid="8551881338202938211"></string>
     <string name="chooser_wallpaper" msgid="6063168087625352235">"Избор позадине из"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index f5eeab1..fe30775 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -27,11 +27,11 @@
     <string name="wallpaper_instructions" msgid="4215640646180727542">"设置壁纸"</string>
     <string name="pick_wallpaper" msgid="5630222540525626723">"壁纸"</string>
     <string name="activity_not_found" msgid="217823393239365967">"未安装该应用。"</string>
-    <string name="widgets_tab_label" msgid="9145860100000983599">"窗口小部件"</string>
-    <string name="long_press_widget_to_add" msgid="7395697462851217506">"触摸并按住可选取窗口小部件。"</string>
+    <string name="widgets_tab_label" msgid="9145860100000983599">"小部件"</string>
+    <string name="long_press_widget_to_add" msgid="7395697462851217506">"触摸并按住可选取小部件。"</string>
     <string name="market" msgid="2652226429823445833">"购买"</string>
     <string name="external_drop_widget_error" msgid="2285187188524172774">"无法将项拖放到此主屏幕上。"</string>
-    <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"选择要处理拖放操作的窗口小部件"</string>
+    <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"选择要创建的小部件"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"文件夹名称"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"重命名文件夹"</string>
     <string name="rename_action" msgid="6016003384693240896">"确定"</string>
@@ -39,12 +39,12 @@
     <string name="menu_item_add_item" msgid="6233177331075781114">"添加到主屏幕"</string>
     <string name="group_applications" msgid="2103752818818161976">"应用"</string>
     <string name="group_shortcuts" msgid="9133529424900391877">"快捷方式"</string>
-    <string name="group_widgets" msgid="6704978494073105844">"窗口小部件"</string>
+    <string name="group_widgets" msgid="6704978494073105844">"小部件"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"壁纸"</string>
     <string name="completely_out_of_space" msgid="1759078539443491182">"您的主屏幕上没有空间了。"</string>
     <string name="out_of_space" msgid="8365249326091984698">"此主屏幕上已没有空间。"</string>
     <string name="hotseat_out_of_space" msgid="6304886797358479361">"底部区域已无空间。"</string>
-    <string name="invalid_hotseat_item" msgid="6545340627805449250">"该窗口小部件太大,超出基座区域可用空间。"</string>
+    <string name="invalid_hotseat_item" msgid="6545340627805449250">"该小部件太大,超出基座区域可用空间。"</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"已创建“<xliff:g id="NAME">%s</xliff:g>”快捷方式。"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"已删除“<xliff:g id="NAME">%s</xliff:g>”快捷方式。"</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"“<xliff:g id="NAME">%s</xliff:g>”快捷方式已存在。"</string>
@@ -72,7 +72,7 @@
     <string name="cab_menu_delete_app" msgid="4089398025537640349">"卸载该应用"</string>
     <string name="cab_menu_app_info" msgid="914548323652698884">"应用详情"</string>
     <string name="cab_app_selection_text" msgid="6378522164293415735">"选中了 1 个应用"</string>
-    <string name="cab_widget_selection_text" msgid="962527270506951955">"已选中 1 个窗口小部件"</string>
+    <string name="cab_widget_selection_text" msgid="962527270506951955">"已选中 1 个小部件"</string>
     <string name="cab_folder_selection_text" msgid="8916111874189565067">"已选中 1 个文件夹"</string>
     <string name="cab_shortcut_selection_text" msgid="8115847384500412878">"已选中 1 个快捷方式"</string>
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"安装快捷方式"</string>
@@ -83,7 +83,7 @@
     <string name="permdesc_read_settings" msgid="5788109303585403679">"允许应用读取主屏幕中的设置和快捷方式。"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"写入主屏幕的设置和快捷方式"</string>
     <string name="permdesc_write_settings" msgid="8530105489115785531">"允许应用更改主屏幕中的设置和快捷方式。"</string>
-    <string name="gadget_error_text" msgid="8359351016167075858">"载入窗口小部件时出现问题"</string>
+    <string name="gadget_error_text" msgid="8359351016167075858">"载入小部件时出现问题"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"这是系统应用,无法卸载。"</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
     <string name="folder_hint_text" msgid="8633351560105748141">"未命名文件夹"</string>
@@ -91,7 +91,7 @@
     <string name="default_scroll_format" msgid="4057140866420001240">"第 %1$d 页,共 %2$d 页"</string>
     <string name="workspace_scroll_format" msgid="1704767047951143301">"主屏幕 %1$d(共 %2$d 个)"</string>
     <string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"应用:第 %1$d 页,共 %2$d 页"</string>
-    <string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"窗口小部件:第 %1$d 页,共 %2$d 页"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"小部件:第 %1$d 页,共 %2$d 页"</string>
     <string name="workspace_cling_title" msgid="738396473989890567">"您的主屏幕您做主"</string>
     <string name="workspace_cling_move_item" msgid="791013895761065070">"您可以在此处放置自己喜爱的应用。"</string>
     <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"要查看您的所有应用,请触摸该圆圈。"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 04e45ae..0ea12c4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -266,12 +266,12 @@
 
     <!-- Clings -->
     <!-- Dummy string [CHAR_LIMIT=40] -->
-    <add-resource type="string" name="custom_workspace_cling_title_1"/>
+    <string name="custom_workspace_cling_title_1"></string>
     <!-- Dummy string [CHAR_LIMIT=60] -->
-    <add-resource type="string" name="custom_workspace_cling_description_1"/>
+    <string name="custom_workspace_cling_description_1"></string>
     <!-- Dummy string [CHAR_LIMIT=40] -->
-    <add-resource type="string" name="custom_workspace_cling_title_2"/>
+    <string name="custom_workspace_cling_title_2"></string>
     <!-- Dummy string [CHAR_LIMIT=60] -->
-    <add-resource type="string" name="custom_workspace_cling_description_2"/>
+    <string name="custom_workspace_cling_description_2"></string>
 
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 0960269..c3fe7ef 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -46,6 +46,8 @@
         <item name="android:shadowRadius">2.0</item>
     </style>
     <style name="ClingText">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
         <item name="android:textSize">15sp</item>
         <item name="android:textColor">#FFFFFF</item>
         <item name="android:shadowColor">#000000</item>
diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java
index 5b33c31..96ec33e 100644
--- a/src/com/android/launcher2/AppsCustomizeTabHost.java
+++ b/src/com/android/launcher2/AppsCustomizeTabHost.java
@@ -352,11 +352,6 @@
             // force building the layer, so you don't get a blip early in an animation
             // when the layer is created layer
             buildLayer();
-
-            // Let the GC system know that now is a good time to do any garbage
-            // collection; makes it less likely we'll get a GC during the all apps
-            // to workspace animation
-            System.gc();
         }
     }
 
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java
index fed0ad9..e870d0a 100644
--- a/src/com/android/launcher2/DragLayer.java
+++ b/src/com/android/launcher2/DragLayer.java
@@ -167,6 +167,9 @@
 
     @Override
     public boolean onInterceptHoverEvent(MotionEvent ev) {
+        if (mLauncher == null || mLauncher.getWorkspace() == null) {
+            return false;
+        }
         Folder currentFolder = mLauncher.getWorkspace().getOpenFolder();
         if (currentFolder == null) {
             return false;
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 6fcda8a..c221815 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -1384,39 +1384,54 @@
             // also will cancel mWaitingForResult.
             closeSystemDialogs();
 
-            boolean alreadyOnHome = ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
+            final boolean alreadyOnHome =
+                    ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
                         != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
 
-            Folder openFolder = mWorkspace.getOpenFolder();
-            // In all these cases, only animate if we're already on home
-            mWorkspace.exitWidgetResizeMode();
-            if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() &&
-                    openFolder == null) {
-                mWorkspace.moveToDefaultScreen(true);
-            }
+            Runnable processIntent = new Runnable() {
+                public void run() {
+                    Folder openFolder = mWorkspace.getOpenFolder();
+                    // In all these cases, only animate if we're already on home
+                    mWorkspace.exitWidgetResizeMode();
+                    if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() &&
+                            openFolder == null) {
+                        mWorkspace.moveToDefaultScreen(true);
+                    }
 
-            closeFolder();
-            exitSpringLoadedDragMode();
+                    closeFolder();
+                    exitSpringLoadedDragMode();
 
-            // If we are already on home, then just animate back to the workspace, otherwise, just
-            // wait until onResume to set the state back to Workspace
-            if (alreadyOnHome) {
-                showWorkspace(true);
+                    // If we are already on home, then just animate back to the workspace,
+                    // otherwise, just wait until onResume to set the state back to Workspace
+                    if (alreadyOnHome) {
+                        showWorkspace(true);
+                    } else {
+                        mOnResumeState = State.WORKSPACE;
+                    }
+
+                    final View v = getWindow().peekDecorView();
+                    if (v != null && v.getWindowToken() != null) {
+                        InputMethodManager imm = (InputMethodManager)getSystemService(
+                                INPUT_METHOD_SERVICE);
+                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+                    }
+
+                    // Reset AllApps to its initial state
+                    if (!alreadyOnHome && mAppsCustomizeTabHost != null) {
+                        mAppsCustomizeTabHost.reset();
+                    }
+                }
+            };
+
+            if (alreadyOnHome && !mWorkspace.hasWindowFocus()) {
+                // Delay processing of the intent to allow the status bar animation to finish
+                // first in order to avoid janky animations.
+                mWorkspace.postDelayed(processIntent, 350);
             } else {
-                mOnResumeState = State.WORKSPACE;
+                // Process the intent immediately.
+                processIntent.run();
             }
 
-            final View v = getWindow().peekDecorView();
-            if (v != null && v.getWindowToken() != null) {
-                InputMethodManager imm = (InputMethodManager)getSystemService(
-                        INPUT_METHOD_SERVICE);
-                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
-            }
-
-            // Reset AllApps to its initial state
-            if (!alreadyOnHome && mAppsCustomizeTabHost != null) {
-                mAppsCustomizeTabHost.reset();
-            }
         }
     }
 
@@ -2682,6 +2697,7 @@
 
             dispatchOnLauncherTransitionPrepare(fromView, animated, true);
             dispatchOnLauncherTransitionPrepare(toView, animated, true);
+            mAppsCustomizeContent.pauseScrolling();
 
             mStateAnimation.addListener(new AnimatorListenerAdapter() {
                 @Override
@@ -2696,6 +2712,8 @@
                     if (onCompleteRunnable != null) {
                         onCompleteRunnable.run();
                     }
+                    mAppsCustomizeContent.updateCurrentPageScroll();
+                    mAppsCustomizeContent.resumeScrolling();
                 }
             });
 
@@ -2784,8 +2802,9 @@
         mUserPresent = true;
         updateRunning();
 
-        // send an accessibility event to announce the context change
-        getWindow().getDecorView().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+        // Send an accessibility event to announce the context change
+        getWindow().getDecorView()
+                .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
     }
 
     void showAllApps(boolean animated) {
@@ -2803,7 +2822,8 @@
         closeFolder();
 
         // Send an accessibility event to announce the context change
-        getWindow().getDecorView().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+        getWindow().getDecorView()
+                .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
     }
 
     void enterSpringLoadedDragMode() {
@@ -3177,10 +3197,15 @@
 
     @Override
     public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
-        boolean result = super.dispatchPopulateAccessibilityEvent(event);
+        final boolean result = super.dispatchPopulateAccessibilityEvent(event);
         final List<CharSequence> text = event.getText();
         text.clear();
-        text.add(getString(R.string.home));
+        // Populate event with a fake title based on the current state.
+        if (mState == State.APPS_CUSTOMIZE) {
+            text.add(getString(R.string.all_apps_button_label));
+        } else {
+            text.add(getString(R.string.all_apps_home_button_label));
+        }
         return result;
     }
 
@@ -3482,7 +3507,9 @@
             anim.addListener(new AnimatorListenerAdapter() {
                 @Override
                 public void onAnimationEnd(Animator animation) {
-                    mWorkspace.postDelayed(mBuildLayersRunnable, 500);
+                    if (mWorkspace != null) {
+                        mWorkspace.postDelayed(mBuildLayersRunnable, 500);
+                    }
                 }
             });
             anim.start();
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 9b97384..2cb943d 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -59,6 +59,7 @@
     private static final int MIN_LENGTH_FOR_FLING = 25;
 
     protected static final int PAGE_SNAP_ANIMATION_DURATION = 550;
+    protected static final int MAX_PAGE_SNAP_DURATION = 750;
     protected static final int SLOW_PAGE_SNAP_ANIMATION_DURATION = 950;
     protected static final float NANOTIME_DIV = 1000000000.0f;
 
@@ -181,6 +182,7 @@
     protected static final int sScrollIndicatorFadeInDuration = 150;
     protected static final int sScrollIndicatorFadeOutDuration = 650;
     protected static final int sScrollIndicatorFlashDuration = 650;
+    private boolean mScrollingPaused = false;
 
     // If set, will defer loading associated pages until the scrolling settles
     private boolean mDeferLoadAssociatedPagesUntilScrollCompletes;
@@ -304,6 +306,24 @@
     }
 
     /**
+     * Called during AllApps/Home transitions to avoid unnecessary work. When that other animation
+     * ends, {@link #resumeScrolling()} should be called, along with
+     * {@link #updateCurrentPageScroll()} to correctly set the final state and re-enable scrolling.
+     */
+    void pauseScrolling() {
+        mScroller.forceFinished(true);
+        cancelScrollingIndicatorAnimations();
+        mScrollingPaused = true;
+    }
+
+    /**
+     * Enables scrolling again.
+     * @see #pauseScrolling()
+     */
+    void resumeScrolling() {
+        mScrollingPaused = false;
+    }
+    /**
      * Sets the current page.
      */
     void setCurrentPage(int currentPage) {
@@ -1473,6 +1493,7 @@
         // user flings, so we scale the duration by a value near to the derivative of the scroll
         // interpolator at zero, ie. 5. We use 4 to make it a little slower.
         duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
+        duration = Math.min(duration, MAX_PAGE_SNAP_DURATION);
 
         snapToPage(whichPage, delta, duration);
     }
@@ -1743,7 +1764,7 @@
             updateScrollingIndicatorPosition();
             mScrollIndicator.setVisibility(View.VISIBLE);
             cancelScrollingIndicatorAnimations();
-            if (immediately) {
+            if (immediately || mScrollingPaused) {
                 mScrollIndicator.setAlpha(1f);
             } else {
                 mScrollIndicatorAnimator = LauncherAnimUtils.ofFloat(mScrollIndicator, "alpha", 1f);
@@ -1768,7 +1789,7 @@
             // Fade the indicator out
             updateScrollingIndicatorPosition();
             cancelScrollingIndicatorAnimations();
-            if (immediately) {
+            if (immediately || mScrollingPaused) {
                 mScrollIndicator.setVisibility(View.INVISIBLE);
                 mScrollIndicator.setAlpha(0f);
             } else {
diff --git a/src/com/android/launcher2/RocketLauncher.java b/src/com/android/launcher2/RocketLauncher.java
deleted file mode 100644
index 6eefedd..0000000
--- a/src/com/android/launcher2/RocketLauncher.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*);
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// TODO:
-// background stellar matter:
-//  - add some slow horizontal parallax motion, or perhaps veeeeery gradual outward drift
-
-package com.android.launcher2;
-
-import android.animation.AnimatorSet;
-import android.animation.TimeAnimator;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.support.v13.dreams.BasicDream;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-
-import com.android.launcher.R;
-
-import java.util.HashMap;
-import java.util.Random;
-
-public class RocketLauncher extends BasicDream {
-    public static final boolean ROCKET_LAUNCHER = true;
-
-    public static class Board extends FrameLayout
-    {
-        public static final boolean FIXED_STARS = true;
-        public static final boolean FLYING_STARS = true;
-        public static final int NUM_ICONS = 20;
-
-        public static final float MANEUVERING_THRUST_SCALE = 0.1f; // tenth speed
-        private boolean mManeuveringThrusters = false;
-        private float mSpeedScale = 1.0f;
-
-        public static final int LAUNCH_ZOOM_TIME = 400; // ms
-
-        HashMap<ComponentName, Bitmap> mIcons;
-        ComponentName[] mComponentNames;
-
-        static Random sRNG = new Random();
-
-        static float lerp(float a, float b, float f) {
-            return (b-a)*f + a;
-        }
-
-        static float randfrange(float a, float b) {
-            return lerp(a, b, sRNG.nextFloat());
-        }
-
-        static int randsign() {
-            return sRNG.nextBoolean() ? 1 : -1;
-        }
-
-        static <E> E pick(E[] array) {
-            if (array.length == 0) return null;
-            return array[sRNG.nextInt(array.length)];
-        }
-
-        public class FlyingIcon extends ImageView {
-            public static final float VMAX = 1000.0f;
-            public static final float VMIN = 100.0f;
-            public static final float ANGULAR_VMAX = 45f;
-            public static final float ANGULAR_VMIN = 0f;
-            public static final float SCALE_MIN = 0.5f;
-            public static final float SCALE_MAX = 4f;
-
-            public float v, vr;
-
-            public final float[] hsv = new float[3];
-
-            public float angle, anglex, angley;
-            public float fuse;
-            public float dist;
-            public float endscale;
-            public float boardCenterX, boardCenterY;
-
-            public ComponentName component;
-
-            public FlyingIcon(Context context, AttributeSet as) {
-                super(context, as);
-                setLayerType(View.LAYER_TYPE_HARDWARE, null);
-
-                setBackgroundResource(R.drawable.flying_icon_bg);
-                //android.util.Log.d("RocketLauncher", "ctor: " + this);
-                hsv[1] = 1f;
-                hsv[2] = 1f;
-            }
-
-            @Override
-            public boolean onTouchEvent(MotionEvent event) {
-                if (!mManeuveringThrusters || component == null) {
-                    return false;
-                }
-                if (getAlpha() < 0.5f) {
-                    setPressed(false);
-                    return false;
-                }
-
-                switch (event.getAction()) {
-                    case MotionEvent.ACTION_DOWN:
-                        setPressed(true);
-                        Board.this.resetWarpTimer();
-                        break;
-                    case MotionEvent.ACTION_MOVE:
-                        final Rect hit = new Rect();
-                        final Point offset = new Point();
-                        getGlobalVisibleRect(hit, offset);
-                        final int globx = (int) event.getX() + offset.x;
-                        final int globy = (int) event.getY() + offset.y;
-                        setPressed(hit.contains(globx, globy));
-                        Board.this.resetWarpTimer();
-                        break;
-                    case MotionEvent.ACTION_UP:
-                        if (isPressed()) {
-                            setPressed(false);
-                            postDelayed(new Runnable() {
-                                public void run() {
-                                    try {
-                                        getContext().startActivity(new Intent(Intent.ACTION_MAIN)
-                                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-                                            .setComponent(component));
-                                    } catch (android.content.ActivityNotFoundException e) {
-                                    } catch (SecurityException e) {
-                                    }
-                                }
-                            }, LAUNCH_ZOOM_TIME);
-                            endscale = 0;
-                            AnimatorSet s = LauncherAnimUtils.createAnimatorSet();
-                            s.playTogether(
-                                LauncherAnimUtils.ofFloat(this, "scaleX", 15f),
-                                LauncherAnimUtils.ofFloat(this, "scaleY", 15f),
-                                LauncherAnimUtils.ofFloat(this, "alpha", 0f)
-                            );
-
-                            // make sure things are still moving until the very last instant the
-                            // activity is visible
-                            s.setDuration((int)(LAUNCH_ZOOM_TIME * 1.25));
-                            s.setInterpolator(new android.view.animation.AccelerateInterpolator(3));
-                            s.start();
-                        }
-                        break;
-                }
-                return true;
-            }
-
-            public String toString() {
-                return String.format("<'%s' @ (%.1f, %.1f) v=%.1f a=%.1f dist/fuse=%.1f/%.1f>",
-                        "icon", getX(), getY(), v, angle, dist, fuse);
-            }
-
-            public void randomizeIcon() {
-                component = pick(mComponentNames);
-                setImageBitmap(mIcons.get(component));
-            }
-
-            public void randomize() {
-                v = randfrange(VMIN, VMAX);
-                angle = randfrange(0, 360f);
-                anglex = (float) Math.sin(angle / 180. * Math.PI);
-                angley = (float) Math.cos(angle / 180. * Math.PI);
-                vr = randfrange(ANGULAR_VMIN, ANGULAR_VMAX) * randsign();
-                endscale = randfrange(SCALE_MIN, SCALE_MAX);
-
-                randomizeIcon();
-            }
-            public void reset() {
-                randomize();
-                boardCenterX = (Board.this.getWidth() - getWidth()) / 2;
-                boardCenterY = (Board.this.getHeight() - getHeight()) / 2;
-                setX(boardCenterX);
-                setY(boardCenterY);
-                fuse = (float) Math.max(boardCenterX, boardCenterY);
-                setRotation(180-angle);
-                setScaleX(0f);
-                setScaleY(0f);
-                dist = 0;
-                setAlpha(0f);
-            }
-            public void update(float dt) {
-                dist += v * dt;
-                setX(getX() + anglex * v * dt);
-                setY(getY() + angley * v * dt);
-                //setRotation(getRotation() + vr * dt);
-                if (endscale > 0) {
-                    float scale = lerp(0, endscale, (float) Math.sqrt(dist / fuse));
-                        setScaleX(scale * lerp(1f, 0.75f, (float) Math.pow((v-VMIN)/(VMAX-VMIN),3)));
-                        setScaleY(scale * lerp(1f, 1.5f, (float) Math.pow((v-VMIN)/(VMAX-VMIN),3)));
-                    final float q1 = fuse*0.15f;
-                    final float q4 = fuse*0.75f;
-                    if (dist < q1) {
-                        setAlpha((float) Math.sqrt(dist/q1));
-                    } else if (dist > q4) {
-                        setAlpha((dist >= fuse) ? 0f : (1f-(float)Math.pow((dist-q4)/(fuse-q4),2)));
-                    } else {
-                        setAlpha(1f);
-                    }
-                }
-            }
-        }
-
-        public class FlyingStar extends FlyingIcon {
-            public FlyingStar(Context context, AttributeSet as) {
-                super(context, as);
-            }
-            public void randomizeIcon() {
-                setImageResource(R.drawable.widget_resize_handle_bottom);
-            }
-            public void randomize() {
-                super.randomize();
-                v = randfrange(VMAX*0.75f, VMAX*2f); // fasticate
-                endscale = randfrange(1f, 2f); // ensmallen
-            }
-        }
-
-        TimeAnimator mAnim;
-
-        public Board(Context context, AttributeSet as) {
-            super(context, as);
-
-            setBackgroundColor(0xFF000000);
-
-            LauncherApplication app = (LauncherApplication)context.getApplicationContext();
-            mIcons = app.getIconCache().getAllIcons();
-            mComponentNames = new ComponentName[mIcons.size()];
-            mComponentNames = mIcons.keySet().toArray(mComponentNames);
-        }
-
-        private void reset() {
-            removeAllViews();
-
-            final ViewGroup.LayoutParams wrap = new ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.WRAP_CONTENT,
-                        ViewGroup.LayoutParams.WRAP_CONTENT);
-
-            if (FIXED_STARS) {
-                for(int i=0; i<20; i++) {
-                    ImageView fixedStar = new ImageView(getContext(), null);
-                    fixedStar.setImageResource(R.drawable.widget_resize_handle_bottom);
-                    final float s = randfrange(0.25f, 0.75f);
-                    fixedStar.setScaleX(s);
-                    fixedStar.setScaleY(s);
-                    fixedStar.setAlpha(0.75f);
-                    addView(fixedStar, wrap);
-                    fixedStar.setX(randfrange(0, getWidth()));
-                    fixedStar.setY(randfrange(0, getHeight()));
-                }
-            }
-
-            for(int i=0; i<NUM_ICONS*2; i++) {
-                FlyingIcon nv = (FLYING_STARS && (i < NUM_ICONS))
-                    ? new FlyingStar(getContext(), null)
-                    : new FlyingIcon(getContext(), null);
-                addView(nv, wrap);
-                nv.reset();
-            }
-
-            mAnim = new TimeAnimator();
-            mAnim.setTimeListener(new TimeAnimator.TimeListener() {
-                public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
-                    // setRotation(totalTime * 0.01f); // not as cool as you would think
-
-                    final int START_ZOOM_TIME = 3000;
-                    if (totalTime < START_ZOOM_TIME) {
-                        final float x = totalTime/(float)START_ZOOM_TIME;
-                        final float s = 1f-(float)Math.pow(x-1, 4);
-                        setScaleX(s); setScaleY(s);
-                    } else {
-                        setScaleX(1.0f); setScaleY(1.0f);
-                    }
-
-                    if (mManeuveringThrusters) {
-                        if (mSpeedScale > MANEUVERING_THRUST_SCALE) {
-                            mSpeedScale -= (2*deltaTime/1000f);
-                        }
-                        if (mSpeedScale < MANEUVERING_THRUST_SCALE) {
-                            mSpeedScale = MANEUVERING_THRUST_SCALE;
-                        }
-                    } else {
-                        if (mSpeedScale < 1.0f) {
-                            mSpeedScale += (deltaTime/1000f);
-                        }
-                        if (mSpeedScale > 1.0f) {
-                            mSpeedScale = 1.0f;
-                        }
-                    }
-
-                    for (int i=0; i<getChildCount(); i++) {
-                        View v = getChildAt(i);
-                        if (!(v instanceof FlyingIcon)) continue;
-                        FlyingIcon nv = (FlyingIcon) v;
-                        nv.update(deltaTime / 1000f * mSpeedScale);
-                        final float scaledWidth = nv.getWidth() * nv.getScaleX();
-                        final float scaledHeight = nv.getHeight() * nv.getScaleY();
-                        if (   nv.getX() + scaledWidth < 0
-                            || nv.getX() - scaledWidth > getWidth()
-                            || nv.getY() + scaledHeight < 0 
-                            || nv.getY() - scaledHeight > getHeight())
-                        {
-                            nv.reset();
-                        }
-                    }
-                }
-            });
-        }
-
-        @Override
-        protected void onAttachedToWindow() {
-            super.onAttachedToWindow();
-            setLayerType(View.LAYER_TYPE_HARDWARE, null);
-            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
-
-            reset();
-            mAnim.start();
-        }
-
-        protected void onSizeChanged (int w, int h, int oldw, int oldh) {
-            super.onSizeChanged(w,h,oldw,oldh);
-            mAnim.cancel();
-            reset();
-            mAnim.start();
-        }
-
-
-        @Override
-        protected void onDetachedFromWindow() {
-            super.onDetachedFromWindow();
-            mAnim.cancel();
-        }
-
-        @Override
-        public boolean isOpaque() {
-            return true;
-        }
-
-        @Override
-        public boolean onInterceptTouchEvent(MotionEvent e) {
-            // we want to eat touch events ourselves if we're in warp speed
-            return (!(ROCKET_LAUNCHER && mManeuveringThrusters));
-        }
-
-        final Runnable mEngageWarp = new Runnable() {
-            @Override
-            public void run() {
-                mManeuveringThrusters = false;
-            }
-        };
-        public void resetWarpTimer() {
-            final Handler h = getHandler();
-            h.removeCallbacks(mEngageWarp);
-            h.postDelayed(mEngageWarp, 5000);
-        }
-
-        @Override
-        public boolean onTouchEvent(MotionEvent event) {
-            if (!ROCKET_LAUNCHER) {
-                return true;
-            }
-
-            if (event.getAction() == MotionEvent.ACTION_DOWN) {
-                if (!mManeuveringThrusters) {
-                    mManeuveringThrusters = true;
-                    resetWarpTimer();
-                    return true;
-                }
-            }
-
-            return false;
-        }
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-
-        DisplayMetrics metrics = new DisplayMetrics();
-        getWindowManager().getDefaultDisplay().getMetrics(metrics);
-        final int longside = metrics.widthPixels > metrics.heightPixels 
-            ? metrics.widthPixels : metrics.heightPixels;
-
-        Board b = new Board(this, null);
-        setContentView(b, new ViewGroup.LayoutParams(longside, longside));
-        b.setX((metrics.widthPixels - longside) / 2);
-        b.setY((metrics.heightPixels - longside) / 2);
-    }
-
-    @Override
-    public void onUserInteraction() {
-        if (!ROCKET_LAUNCHER) {
-            finish();
-        }
-    }
-}