Merge "Introducing M Land." into mnc-dev
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index bbef259..677ab91 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -322,10 +322,11 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".egg.LLandActivity"
-                  android:theme="@android:style/Theme.Material.Light.NoActionBar"
+        <activity android:name=".egg.MLandActivity"
+                  android:theme="@android:style/Theme.Material.NoActionBar"
                   android:exported="true"
-                  android:label="@string/lland"
+                  android:icon="@drawable/icon"
+                  android:label="@string/mland"
                   android:hardwareAccelerated="true"
                   android:launchMode="singleInstance"
                   android:screenOrientation="locked"
@@ -334,19 +335,6 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
-        <activity android:name=".egg.ShruggyActivity"
-                  android:theme="@android:style/Theme.NoDisplay"
-                  android:exported="true"
-                  android:launchMode="singleInstance"
-                  android:screenOrientation="locked"
-                  android:process=":sweetsweetdesserts"
-                  android:excludeFromRecents="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="com.android.internal.category.PLATLOGO" />
             </intent-filter>
         </activity>
diff --git a/packages/SystemUI/res/drawable-nodpi/android.xml b/packages/SystemUI/res/drawable-nodpi/android.xml
new file mode 100644
index 0000000..750de05
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/android.xml
@@ -0,0 +1,37 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2 (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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48dp"
+        android:height="48dp"
+        android:viewportWidth="48"
+        android:viewportHeight="48">
+    <path
+        android:name="torso"
+        android:pathData="M12,36c0,1.1 0.9,2 2,2l2,0l0,7c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3l0,-7l4,0l0,7c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3l0,-7l2,0c1.1,0 2,-0.9 2,-2L36,16L12,16L12,36z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:name="leftArm"
+        android:pathData="M7,16c-1.7,0 -3,1.3 -3,3l0,14c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3L10,19C10,17.3 8.7,16 7,16z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:name="rightArm"
+        android:pathData="M41,16c-1.7,0 -3,1.3 -3,3l0,14c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3L44,19C44,17.3 42.7,16 41,16z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:name="illFormTheHead"
+        android:pathData="M31.1,4.3l2.6,-2.6c0.4,-0.4 0.4,-1 0,-1.4c-0.4,-0.4 -1,-0.4 -1.4,0l-3,3C27.7,2.5 25.9,2 24,2c-1.9,0 -3.7,0.5 -5.3,1.3l-3,-3c-0.4,-0.4 -1,-0.4 -1.4,0c-0.4,0.4 -0.4,1 0,1.4l2.6,2.6C13.9,6.5 12,10 12,14l24,0C36,10 34.1,6.5 31.1,4.3zM20.31,9c0,0.72 -0.59,1.31 -1.31,1.31c-0.72,0 -1.31,-0.59 -1.31,-1.31c0,-0.72 0.59,-1.31 1.31,-1.31C19.72,7.69 20.31,8.28 20.31,9zM30.31,9c0,0.72 -0.59,1.31 -1.31,1.31c-0.73,0 -1.31,-0.59 -1.31,-1.31c0,-0.72 0.59,-1.31 1.31,-1.31C29.72,7.69 30.31,8.28 30.31,9z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/cactus1.xml b/packages/SystemUI/res/drawable-nodpi/cactus1.xml
new file mode 100644
index 0000000..d0c4453
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/cactus1.xml
@@ -0,0 +1,57 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48dp"
+        android:height="48dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M36.3,25.5c-0.4,-0.3,-1,-0.5,-1.5,-0.5c-0.1,0,-0.3,0,-0.4,0c-0.3,0,-0.5,0,-0.7,0.1c-0.6,0.1,-1.1,0.4,-1.5,0.8   c-0.8,0.6,-1.2,1.6,-1.2,2.7v3.5h-1.2V14c0,-1.4,-0.6,-2.7,-1.6,-3.6c-0.4,-0.4,-0.9,-0.8,-1.5,-1c-0.4,-0.1,-0.7,-0.2,-1.1,-0.3   C25.2,9,24.9,9,24.7,9s-0.5,0,-0.8,0.1c-0.4,0.1,-0.8,0.2,-1.1,0.3c-0.6,0.2,-1.1,0.6,-1.5,1c-1,0.9,-1.6,2.2,-1.6,3.6v10.3h-2.4v-4.5   c0,-1.2,-0.6,-2.2,-1.5,-2.8c-0.4,-0.3,-1,-0.5,-1.5,-0.6c-0.2,0,-0.3,-0.1,-0.5,-0.1c-0.2,0,-0.4,0,-0.6,0.1c-0.6,0.1,-1.1,0.3,-1.5,0.7   c-0.8,0.6,-1.4,1.6,-1.4,2.7v8c0,1.1,0.5,2.1,1.4,2.7c0.4,0.3,0.9,0.6,1.5,0.7c0.2,0,0.4,0.1,0.6,0.1h0.5h1.5h3.8V48   c0,1.4,0.6,2.7,1.6,3.6c0.4,0.4,0.9,0.8,1.5,1c0.4,0.1,0.7,0.2,1.1,0.3c0.2,0,0.5,0.1,0.8,0.1s0.5,0,0.8,-0.1   c0.4,-0.1,0.8,-0.2,1.1,-0.3c0.6,-0.2,1.1,-0.6,1.5,-1c1,-0.9,1.6,-2.2,1.6,-3.6v-9.1h1.2h1.2h1.5h0.7c0.1,0,0.3,0,0.4,0   c0.6,-0.1,1.1,-0.2,1.5,-0.5c0.9,-0.6,1.6,-1.7,1.6,-2.9v-7C37.9,27.2,37.3,26.1,36.3,25.5z"
+        android:fillColor="#0D904F"/>
+    <path
+        android:pathData="M22.8,9.4v43.3c0.4,0.1,0.7,0.2,1.1,0.3V9.1C23.5,9.1,23.1,9.2,22.8,9.4z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M29.7,31.9V14c0,-1.4,-0.6,-2.7,-1.6,-3.6v41.3c1,-0.9,1.6,-2.2,1.6,-3.6v-9.1h1.2v-7H29.7z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M30.9,28.4v3.5v7h1.2V25.8C31.4,26.4,30.9,27.4,30.9,28.4z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M36.3,25.5v12.8c0.9,-0.6,1.6,-1.7,1.6,-2.9v-7C37.9,27.2,37.3,26.1,36.3,25.5z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M34.4,24.9c-0.3,0,-0.5,0,-0.7,0.1v13.9h0.7c0.1,0,0.3,0,0.4,0V25C34.7,24.9,34.6,24.9,34.4,24.9z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M26.6,9.4c-0.4,-0.1,-0.7,-0.2,-1.1,-0.3v43.9c0.4,-0.1,0.8,-0.2,1.1,-0.3c0.6,-0.2,1.1,-0.6,1.5,-1V10.4    C27.7,9.9,27.1,9.6,26.6,9.4z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M32.2,25.8v13.2h1.5V25C33.1,25.1,32.6,25.4,32.2,25.8z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M34.8,25v13.9c0.6,-0.1,1.1,-0.2,1.5,-0.5V25.5C35.9,25.2,35.4,25,34.8,25z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M11.7,17v13.5c0.4,0.3,0.9,0.6,1.5,0.7V16.3C12.6,16.4,12.1,16.7,11.7,17z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M19.7,14v10.3h-2.4v-4.5c0,-1.2,-0.6,-2.2,-1.5,-2.8c-0.4,-0.3,-1,-0.5,-1.5,-0.6v15h1.5h3.8V48    c0,1.4,0.6,2.7,1.6,3.6V10.4C20.3,11.3,19.7,12.5,19.7,14z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M17.3,24.2h2.4v7.0h-2.4z"
+        android:fillColor="#055524"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/cactus2.xml b/packages/SystemUI/res/drawable-nodpi/cactus2.xml
new file mode 100644
index 0000000..613ee83
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/cactus2.xml
@@ -0,0 +1,57 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48dp"
+        android:height="48dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M30.8,12.9l0.0,0.0l0.0,0.0z"
+        android:fillColor="#0D904F"/>
+    <path
+        android:pathData="M41.1,22.1L41.1,22.1c0,-1.7,-1.3,-3,-3,-3h-4.2v-3.2c0,-1.7,-1.3,-3,-3,-3c0,0,0,0,0,0c0,0,0,0,0,0    c-1.6,0,-3,1.4,-3,3v5l-2,2V6.7c0,-2.2,-1.8,-4,-4,-4s-4,1.8,-4,4v7.3v0L15.8,12v-1.4v-2c0,-1.7,-1.3,-3,-3,-3s-3,1.3,-3,3v4.6    c0,0.8,0.3,1.6,0.9,2.1l7.2,7.2v25.7c0,2.2,1.8,4,4,4s4,-1.8,4,-4V31.3l6.2,-6.2h6C39.7,25.1,41.1,23.7,41.1,22.1    C41.1,22.1,41.1,22.1,41.1,22.1L41.1,22.1z"
+        android:fillColor="#0D904F"/>
+    <path
+        android:pathData="M30.8,12.9"
+        android:fillColor="#0D904F"/>
+    <path
+        android:pathData="M38.1,19.1h-4.2l-3,3v-9.3c-1.6,0,-3,1.4,-3,3v5l-2,2V6.7c0,-2.2,-1.8,-4,-4,-4v24.1v25.4c2.2,0,4,-1.8,4,-4V31.3    l6.2,-6.2l3,-3h6C41.1,20.4,39.7,19.1,38.1,19.1z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M30.8,12.9l0.0,0.0l0.0,0.0z"
+        android:fillColor="#0D904F"/>
+    <path
+        android:pathData="M30.8,12.9C30.8,12.9,30.8,12.9,30.8,12.9C30.8,12.9,30.8,12.9,30.8,12.9l0,9.3l3,-3v-3.2    C33.8,14.2,32.5,12.9,30.8,12.9z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M41.1,22.1l0.0,0.0l0.0,0.0z"
+        android:fillColor="#0D904F"/>
+    <path
+        android:pathData="M41.1,22.1L41.1,22.1l-6,0l-3,3h6C39.7,25.1,41.1,23.7,41.1,22.1C41.1,22.1,41.1,22.1,41.1,22.1z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M17.8,14.1L17.8,14.1l-2.1,-2v-1.4v-2c0,-1.7,-1.3,-3,-3,-3v7.2l5.1,5.1L17.8,14.1L17.8,14.1z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M38.3,16.8l0.29999924,1.5l1.2000008,-1.0l-0.70000076,1.4000015l1.5,0.0l-1.3999977,0.5999985l1.0999985,1.0l-1.3999977,-0.5l0.19999695,1.5l-0.79999924,-1.2999992l-0.79999924,1.2999992l0.20000076,-1.5l-1.4000015,0.5l1.1000023,-1.0l-1.4000015,-0.5999985l1.5,0.0l-0.70000076,-1.4000015l1.2000008,1.0z"
+        android:fillColor="#AB47BC"/>
+    <path
+        android:pathData="M38.9,16.9l-0.10000229,1.5l1.4000015,-0.6000004l-1.1000023,1.1000004l1.5,0.39999962l-1.5,0.20000076l0.80000305,1.2999992l-1.300003,-0.8999996l-0.099998474,1.5l-0.5,-1.3999996l-1.0999985,1.0l0.5999985,-1.3999996l-1.5,0.10000038l1.4000015,-0.70000076l-1.2000008,-0.8999996l1.3999977,0.39999962l-0.29999924,-1.5l0.9000015,1.2000008z"
+        android:fillColor="#BA68C8"/>
+    <path
+        android:pathData="M38.3,19.0m-0.4,0.0a0.4,0.4,0,1,1,0.8,0.0a0.4,0.4,0,1,1,-0.8,0.0"
+        android:fillColor="#FFA726"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/cactus3.xml b/packages/SystemUI/res/drawable-nodpi/cactus3.xml
new file mode 100644
index 0000000..d070e07
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/cactus3.xml
@@ -0,0 +1,51 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48dp"
+        android:height="48dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M35.9,15.9c-1.7,0,-3,1.3,-3,3v13.6h-1.1h-0.6v-3.9c0,-1.7,-1.3,-3,-3,-3h-0.3h-0.4v-0.8V22c0,-1.4,-1.1,-2.5,-2.5,-2.5   s-2.5,1.1,-2.5,2.5v3.6h-1.8v-6.4c0,-1.7,-1.3,-3,-3,-3s-3,1.3,-3,3v9.4c0,1.7,1.3,3,3,3h7.6V48c0,1.7,1.3,3,3,3c0.5,0,1,-0.1,1.4,-0.4   c0,0,0,0,0,0c0.4,0.3,0.9,0.4,1.5,0.4c1.7,0,3,-1.3,3,-3v-9.5h1.7c1.7,0,3,-1.3,3,-3V18.9C38.9,17.2,37.6,15.9,35.9,15.9z"
+        android:fillColor="#0D904F"/>
+    <path
+        android:pathData="M31.2,51c1.7,0,3,-1.3,3,-3v-9.5h1.7c1.7,0,3,-1.3,3,-3V18.9c0,-1.7,-1.3,-3,-3,-3v19.6h-7.3v15.1c1.1,0,1.1,0,1.1,0   C30.1,50.8,30.6,51,31.2,51z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M20.7,25.6v-6.4c0,-1.7,-1.3,-3,-3,-3v9.4H20.7z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M26.2,35.5h1.2v15.6h-1.2z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M34.1,22.2h0.8v14.2h-0.8z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M16.8,26.5l0.0,-7.0l-0.79999924,0.0l0.0,7.799999l0.79999924,0.0l5.700001,0.0l0.0,-0.79999924z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M29.9,38.5h1.3v11.7h-1.3z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M32.4,38.5h1.8v11.7h-1.8z"
+        android:fillColor="#055524"/>
+    <path
+        android:pathData="M27.5,25.7L27.5,25.7v-0.9v-0.8V22c0,-1.4,-1.1,-2.5,-2.5,-2.5v9.1h0h0C25.1,27.2,26.1,26,27.5,25.7z"
+        android:fillColor="#097138"/>
+    <path
+        android:pathData="M28.6,25.7v6.1v0.7h2.7v-3.8C31.2,27.2,30.1,25.9,28.6,25.7z"
+        android:fillColor="#097138"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/cloud.xml b/packages/SystemUI/res/drawable-nodpi/cloud.xml
new file mode 100644
index 0000000..17e4ad2
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/cloud.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M38.700001,20.100000C37.299999,13.200000 31.299999,8.000000 24.000000,8.000000c-5.800000,0.000000 -10.800000,3.300000 -13.300000,8.100000C4.700000,16.700001 0.000000,21.799999 0.000000,28.000000c0.000000,6.600000 5.400000,12.000000 12.000000,12.000000l26.000000,0.000000c5.500000,0.000000 10.000000,-4.500000 10.000000,-10.000000C48.000000,24.700001 43.900002,20.400000 38.700001,20.100000z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/cloud_off.xml b/packages/SystemUI/res/drawable-nodpi/cloud_off.xml
new file mode 100644
index 0000000..b15ea5f
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/cloud_off.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M19.400000,10.000000c-0.700000,-3.400000 -3.700000,-6.000000 -7.400000,-6.000000c-1.500000,0.000000 -2.900000,0.400000 -4.000000,1.200000l1.500000,1.500000C10.200000,6.200000 11.100000,6.000000 12.000000,6.000000c3.000000,0.000000 5.500000,2.500000 5.500000,5.500000L17.500000,12.000000L19.000000,12.000000c1.700000,0.000000 3.000000,1.300000 3.000000,3.000000c0.000000,1.100000 -0.600000,2.100000 -1.600000,2.600000l1.500000,1.500000c1.300000,-0.900000 2.100000,-2.400000 2.100000,-4.100000C24.000000,12.400000 21.900000,10.200000 19.400000,10.000000zM3.000000,5.300000L5.800000,8.000000C2.600000,8.200000 0.000000,10.800000 0.000000,14.000000c0.000000,3.300000 2.700000,6.000000 6.000000,6.000000l11.700000,0.000000l2.000000,2.000000l1.300000,-1.300000L4.300000,4.000000L3.000000,5.300000zM7.700000,10.000000l8.000000,8.000000L6.000000,18.000000c-2.200000,0.000000 -4.000000,-1.800000 -4.000000,-4.000000c0.000000,-2.200000 1.800000,-4.000000 4.000000,-4.000000L7.700000,10.000000z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/icon.xml b/packages/SystemUI/res/drawable-nodpi/icon.xml
index 7b8975a..9c36b5a 100644
--- a/packages/SystemUI/res/drawable-nodpi/icon.xml
+++ b/packages/SystemUI/res/drawable-nodpi/icon.xml
@@ -1,5 +1,5 @@
 <!--
-Copyright (C) 2014 The Android Open Source Project
+Copyright (C) 2015 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.
@@ -20,14 +20,14 @@
         android:viewportHeight="48.0">
     <path
         android:pathData="M24.0,2.0C11.8,2.0 2.0,11.8 2.0,24.0c0.0,6.1 2.5,11.6 6.4,15.6L39.6,8.4C35.6,4.5 30.1,2.0 24.0,2.0z"
-        android:fillColor="#F57C00"/>
+        android:fillColor="#E91E63"/>
     <path
         android:pathData="M39.6,8.4L8.4,39.6c4.0,4.0 9.5,6.4 15.6,6.4c12.2,0.0 22.0,-9.8 22.0,-22.0C46.0,17.9 43.5,12.4 39.6,8.4z"
-        android:fillColor="#FF9800"/>
+        android:fillColor="#F06292"/>
     <path
         android:pathData="M45.9,25.9L34.0,14.0L14.0,34.0l11.9,11.9C36.5,45.0 45.0,36.5 45.9,25.9z"
         android:fillAlpha="0.33"
-        android:fillColor="#F57C00"/>
+        android:fillColor="#E91E63"/>
     <path
         android:pathData="M24.0,24.0c0.0,0.0 0.0,2.2 0.0,5.0s0.0,5.0 0.0,5.0l10.0,-10.0L34.0,14.0L24.0,24.0z"
         android:fillColor="#FFFFFF"/>
diff --git a/packages/SystemUI/res/drawable-nodpi/lollipop.xml b/packages/SystemUI/res/drawable-nodpi/lollipop.xml
deleted file mode 100644
index cb63af0..0000000
--- a/packages/SystemUI/res/drawable-nodpi/lollipop.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<!--
-Copyright (C) 2014 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.0apache.0org/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.
--->
-<vector xmlns:android="http://schemas.0android.0com/apk/res/android"
-        android:width="560.0dp"
-        android:height="560.0dp"
-        android:viewportWidth="560.0"
-        android:viewportHeight="560.0">
-    <path
-        android:pathData="M264.079987,240.736l0.0,9.82c7.31,-7.15 17.139999,-11.56 28.07,-11.56c22.639999,0.0 40.799999,18.48 40.799999,41.12c0.0,22.48 -18.16,40.880 -40.799999,40.880c-10.93,0.0 -20.280,-4.09 -27.59,-10.93L264.559998,339.0l-11.32,0.0l0.0,-98.269997L264.079987,240.731zM265.809998,264.869995c-0.47,0.79 -1.26,2.04 -1.26,4.79l0.0,21.07c0.0,1.97 0.47,3.07 1.1,4.17c5.19,8.88 14.78,14.94 25.63,14.94c16.43,0.0 29.950,-13.44 29.950,-29.870c0.0,-16.280 -13.52,-29.799999 -29.950,-29.799999C280.51,250.169998 271.0,256.059998 265.809998,264.869995z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M445.731,240.736l0.0,9.82c7.31,-7.15 17.139999,-11.56 28.07,-11.56c22.639999,0.0 40.799999,18.48 40.799999,41.12c0.0,22.48 -18.16,40.880 -40.799999,40.880c-10.93,0.0 -20.280,-4.09 -27.59,-10.93L446.210052,339.0l-11.32,0.0l0.0,-98.269997L445.731,240.731zM447.459991,264.869995c-0.47,0.79 -1.26,2.04 -1.26,4.79l0.0,21.07c0.0,1.97 0.47,3.07 1.1,4.17c5.19,8.88 14.78,14.94 25.63,14.94c16.43,0.0 29.950,-13.44 29.950,-29.870c0.0,-16.280 -13.52,-29.799999 -29.950,-29.799999C462.160004,250.169998 452.649994,256.059998 447.459991,264.869995z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M169.490005,279.880005c0.0,22.639999 -18.32,41.12 -40.810,41.12c-22.639999,0.0 -41.040,-18.48 -41.040,-41.12c0.0,-22.48 18.389999,-40.880 41.040,-40.880C151.169998,239.0 169.490005,257.399994 169.490005,279.880005zM158.089996,280.040009c0.0,-16.43 -13.13,-29.870 -29.41,-29.870c-16.51,0.0 -29.4,13.44 -29.4,29.870c0.0,16.280 12.89,29.799999 29.4,29.799999C144.960007,309.8387 158.089996,296.309998 158.089996,280.040009z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M423.790009,279.880005c0.0,22.639999 -18.32,41.12 -40.810,41.12c-22.639999,0.0 -41.040,-18.48 -41.040,-41.12c0.0,-22.48 18.389999,-40.880 41.040,-40.880C405.470,239.0 423.790009,257.399994 423.790009,279.880005zM412.395,280.040009c0.0,-16.43 -13.13,-29.870 -29.41,-29.870c-16.51,0.0 -29.4,13.44 -29.4,29.870c0.0,16.280 12.89,29.799999 29.4,29.799999C399.26,309.8387 412.395,296.309998 412.395,280.040009z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M229.02,221.0l11.17,0.0l0.0,11.48l-11.17,0.0z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M229.02,240.65l11.17,0.0l0.0,78.62l-11.17,0.0z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M65.4,221.0l11.17,0.0l0.0,98.27l-11.17,0.0z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M180.58,221.0l11.17,0.0l0.0,98.27l-11.17,0.0z"
-        android:fillColor="#FFFFFF"/>
-    <path
-        android:pathData="M204.8,221.0l11.17,0.0l0.0,98.27l-11.17,0.0z"
-        android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/minus.xml b/packages/SystemUI/res/drawable-nodpi/minus.xml
new file mode 100644
index 0000000..a308e07
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/minus.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M4.0,20.0l40.0,0.0l0.0,8.0l-40.0,0.0z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_antennae.xml b/packages/SystemUI/res/drawable-nodpi/mm_antennae.xml
new file mode 100644
index 0000000..15cd450
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_antennae.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M15.6,5.3c0,0,-0.1,0,-0.1,0c-0.3,-0.1,-0.4,-0.3,-0.4,-0.6L16,1.4C16,1.1,16.3,0.9,16.6,1   c0.3,0.1,0.4,0.3,0.4,0.6l-0.8,3.3C16.1,5.1,15.9,5.3,15.6,5.3z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:pathData="M8.4,5.3c-0.2,0,-0.4,-0.2,-0.5,-0.4L7.1,1.6C7,1.4,7.2,1.1,7.4,1C7.7,0.9,8,1.1,8,1.4l0.8,3.3   c0.1,0.3,-0.1,0.5,-0.4,0.6C8.5,5.3,8.4,5.3,8.4,5.3z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_antennae2.xml b/packages/SystemUI/res/drawable-nodpi/mm_antennae2.xml
new file mode 100644
index 0000000..c7c06c5
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_antennae2.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M15.6,5.5C15.5,5.5,15.5,5.5,15.6,5.5c-0.3,-0.3,-0.3,-0.6,-0.1,-0.8l2.4,-2.5c0.2,-0.2,0.5,-0.2,0.7,0   c0.2,0.2,0.2,0.5,0,0.7l-2.4,2.5C16,5.6,15.8,5.7,15.6,5.5z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:pathData="M8.4,5.6C8.2,5.7,8,5.6,7.8,5.5L5.5,3c-0.2,-0.2,-0.2,-0.5,0,-0.7c0.2,-0.2,0.5,-0.2,0.7,0l2.4,2.5   C8.7,5,8.7,5.3,8.4,5.6C8.5,5.5,8.5,5.5,8.4,5.6z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_eyes.xml b/packages/SystemUI/res/drawable-nodpi/mm_eyes.xml
new file mode 100644
index 0000000..ec7eb5d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_eyes.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M7.4,12.0m-0.7,0.0a0.7,0.7,0,1,1,1.4,0.0a0.7,0.7,0,1,1,-1.4,0.0"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M16.6,12.0m-0.7,0.0a0.7,0.7,0,1,1,1.4,0.0a0.7,0.7,0,1,1,-1.4,0.0"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_eyes2.xml b/packages/SystemUI/res/drawable-nodpi/mm_eyes2.xml
new file mode 100644
index 0000000..73ed453
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_eyes2.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M7.4,11.7c-0.6,0,-0.7,0.7,-0.7,0.3c0,-0.4,0.3,-0.7,0.7,-0.7C7.7,11.3,8,11.6,8,12C8,12.4,7.9,11.7,7.4,11.7z   "/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M16.6,11.7c-0.6,0,-0.7,0.7,-0.7,0.3c0,-0.4,0.3,-0.7,0.7,-0.7s0.7,0.3,0.7,0.7C17.3,12.4,17.2,11.7,16.6,11.7   z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_head.xml b/packages/SystemUI/res/drawable-nodpi/mm_head.xml
new file mode 100644
index 0000000..c6a6465
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_head.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M18.6,5.4C18.1,5,16,4,12,4S5.9,5,5.4,5.4C5,5.9,4,8,4,12s1,6.1,1.4,6.6C5.9,19,8,20,12,20s6.1,-1,6.6,-1.4   C19,18.1,20,16,20,12S19,5.9,18.6,5.4z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:pathData="M5.4,5.7
+                          a 6.6 1.7 0 1 1 13.2 0
+                          a 6.6 1.7 0 1 1 -13.2 0
+                          z" 
+        android:fillColor="#33000000" />
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_mouth1.xml b/packages/SystemUI/res/drawable-nodpi/mm_mouth1.xml
new file mode 100644
index 0000000..2ba6c5e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_mouth1.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M6.5,15.5c-0.6,0,-0.9,-0.1,-1.1,-0.2c0,0,0,-0.1,0,-0.2c0,0,0.1,0,0.2,0c0.2,0.2,1.1,0.2,2.5,0.1c1,-0.1,2.3,-0.1,4,-0.1    c1.6,0,2.9,0.1,4,0.1c1.4,0.1,2.3,0.1,2.5,-0.1c0,0,0.1,0,0.2,0c0,0,0,0.1,0,0.2c-0.3,0.3,-1.2,0.3,-2.7,0.2c-1,-0.1,-2.3,-0.1,-4,-0.1    c-1.6,0,-2.9,0.1,-4,0.1C7.4,15.5,6.9,15.5,6.5,15.5z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_mouth2.xml b/packages/SystemUI/res/drawable-nodpi/mm_mouth2.xml
new file mode 100644
index 0000000..50bd98b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_mouth2.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M18.6,15.1c0,0,-0.1,0,-0.2,0c-0.3,0.3,-1.6,0.3,-3.1,0.3c-0.4,0,-0.9,0,-1.4,0c-0.6,0,-1.3,0,-2,0s-1.4,0,-2,0   c-0.5,0,-1,0,-1.4,0c-1.5,0,-2.8,0,-3.1,-0.3c0,0,-0.1,0,-0.2,0c0,0,0,0.1,0,0.1s0,0.1,0,0.1c0.6,0.6,3.1,1,6.6,1s6.1,-0.4,6.6,-1   C18.7,15.2,18.7,15.2,18.6,15.1C18.7,15.1,18.7,15.1,18.6,15.1z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_mouth3.xml b/packages/SystemUI/res/drawable-nodpi/mm_mouth3.xml
new file mode 100644
index 0000000..93258ed
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_mouth3.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M10.3,15.2c0.1,0.9,0.7,1.7,1.7,1.7s1.6,-0.8,1.7,-1.7"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mm_mouth4.xml b/packages/SystemUI/res/drawable-nodpi/mm_mouth4.xml
new file mode 100644
index 0000000..c629492
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mm_mouth4.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M12.0,16.0m-0.9,0.0a0.9,0.9,0,1,1,1.8,0.0a0.9,0.9,0,1,1,-1.8,0.0"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/moon.xml b/packages/SystemUI/res/drawable-nodpi/moon.xml
new file mode 100644
index 0000000..4ee6286
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/moon.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M18.000000,4.000000c-2.100000,0.000000 -4.100000,0.300000 -6.000000,0.900000C20.100000,7.500000 26.000000,15.000000 26.000000,24.000000s-5.900000,16.500000 -14.000000,19.100000c1.900000,0.600000 3.900000,0.900000 6.000000,0.900000c11.000000,0.000000 20.000000,-9.000000 20.000000,-20.000000S29.000000,4.000000 18.000000,4.000000z"
+        android:fillColor="#FFF2F2FF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mountain1.xml b/packages/SystemUI/res/drawable-nodpi/mountain1.xml
new file mode 100644
index 0000000..52e22d0
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mountain1.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48dp"
+        android:height="48dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M0.0,48.0l24.0,-36.0l24.0,36.0z"
+        android:fillColor="#4DB6AC"/>
+    <path
+        android:pathData="M24.0,12.0l-9.9,36.0l33.9,0.0z"
+        android:fillColor="#00897B"/>
+    <path
+        android:pathData="M24.0,12.0l7.700001,11.5l-5.300001,-5.0l-0.8999996,0.8999996l-1.5,-1.2999992l-4.6000004,10.5z"
+        android:fillColor="#CCCCCC"/>
+    <path
+        android:pathData="M24.0,12.0l-8.1,12.200001l2.3000011,1.8999996l1.1999989,2.5z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mountain2.xml b/packages/SystemUI/res/drawable-nodpi/mountain2.xml
new file mode 100644
index 0000000..ad23bdd
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mountain2.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48dp"
+        android:height="48dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M0.0,48.0l24.0,-36.0l24.0,36.0z"
+        android:fillColor="#4DB6AC"/>
+    <path
+        android:pathData="M24.0,12.0l-13.2,36.0l37.2,0.0z"
+        android:fillColor="#00897B"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/mountain3.xml b/packages/SystemUI/res/drawable-nodpi/mountain3.xml
new file mode 100644
index 0000000..02942d7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/mountain3.xml
@@ -0,0 +1,57 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48dp"
+        android:height="48dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M0.1,48.0l21.0,-31.5l20.999998,31.5z"
+        android:fillColor="#4DB6AC"/>
+    <path
+        android:pathData="M21.1,16.5l-7.5,31.5l28.499998,0.0z"
+        android:fillColor="#00897B"/>
+    <path
+        android:pathData="M13.2,28.4l7.9000006,-11.9l-1.0,4.0z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:pathData="M20.1,20.5l4.5,1.3999996l-3.5,-5.3999996z"
+        android:fillColor="#CCCCCC"/>
+    <path
+        android:pathData="M2.1,55.8l25.5,-38.4l25.6,38.4z"
+        android:fillColor="#4DB6AC"/>
+    <path
+        android:pathData="M27.6,17.4l-9.0,38.4l34.6,0.0z"
+        android:fillColor="#00897B"/>
+    <path
+        android:pathData="M18.6,31.0l9.0,-13.6l-1.5,6.700001z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:pathData="M26.1,24.1l2.1999989,-2.2000008l3.7000008,2.0l-4.3999996,-6.5z"
+        android:fillColor="#CCCCCC"/>
+    <path
+        android:pathData="M8.9,59.1l19.9,-29.899998l20.0,29.899998z"
+        android:fillColor="#4DB6AC"/>
+    <path
+        android:pathData="M28.8,29.2l-7.0,29.899998l27.0,0.0z"
+        android:fillColor="#00897B"/>
+    <path
+        android:pathData="M25.1,34.9l3.6999989,-5.700001l-2.0999985,9.0l0.0,-4.5z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:pathData="M26.7,38.2l5.5,-3.9000015l-3.4000015,-5.0999985z"
+        android:fillColor="#CCCCCC"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/play.xml b/packages/SystemUI/res/drawable-nodpi/play.xml
new file mode 100644
index 0000000..747e60b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/play.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M8.0,5.0l0.0,14.0l11.0,-7.0z"/>
+    <path
+        android:pathData="M0 0h24v24H0z"
+        android:fillColor="#00000000"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/plus.xml b/packages/SystemUI/res/drawable-nodpi/plus.xml
new file mode 100644
index 0000000..2bdb0b7
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/plus.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M4.0,20.0l40.0,0.0l0.0,8.0l-40.0,0.0z"
+        android:fillColor="#FFFFFF"/>
+    <path
+        android:pathData="M20.0,4.0l8.0,0.0l0.0,40.0l-8.0,0.0z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/ripplebg.xml b/packages/SystemUI/res/drawable-nodpi/ripplebg.xml
new file mode 100644
index 0000000..21c66eb
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/ripplebg.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2 (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_focused="true">
+        <ripple android:color="#DDDDDD">
+            <item><shape android:shape="oval"><solid android:color="#FFFFFF" /></shape></item>
+        </ripple>
+    </item>
+    <item>
+        <shape android:shape="oval"><solid android:color="#AAAAAA" /></shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable-nodpi/scorecard.xml b/packages/SystemUI/res/drawable-nodpi/scorecard.xml
new file mode 100644
index 0000000..f22ec7b
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/scorecard.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle"
+    >
+    <corners
+        android:radius="4dp" />
+    <solid
+        android:color="#ffffffff" />
+</shape>
diff --git a/packages/SystemUI/res/drawable-nodpi/scorecard_gameover.xml b/packages/SystemUI/res/drawable-nodpi/scorecard_gameover.xml
new file mode 100644
index 0000000..f663a66
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/scorecard_gameover.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle"
+    >
+    <corners
+        android:radius="8dp" />
+    <solid
+        android:color="#ffff0000" />
+</shape>
diff --git a/packages/SystemUI/res/drawable-nodpi/star.xml b/packages/SystemUI/res/drawable-nodpi/star.xml
new file mode 100644
index 0000000..73ca04a
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/star.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <path
+        android:pathData="M30.250000,17.750000L24.000000,4.000000l-6.250000,13.750000L4.000000,24.000000l13.750000,6.250000L24.000000,44.000000l6.250000,-13.750000L44.000000,24.000000L30.250000,17.750000z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable-nodpi/sun.xml b/packages/SystemUI/res/drawable-nodpi/sun.xml
new file mode 100644
index 0000000..3e4a233
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/sun.xml
@@ -0,0 +1,29 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="48.0dp"
+        android:height="48.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0">
+    <group>
+        <path
+            android:pathData="M 24,8 A 16,16 0 1,0 24.0001,8 z"
+            android:fillColor="#FFFFFFCC" />
+        <path
+            android:pathData="M40.0,30.6l6.6,-6.6L40.0,17.4L40.0,8.0l-9.4,0.0L24.0,1.4L17.4,8.0L8.0,8.0l0.0,9.4L1.4,24.0L8.0,30.6L8.0,40.0l9.4,0.0l6.6,6.6l6.6,-6.6L40.0,40.0L40.0,30.6zM24.0,36.0c-6.6,0.0 -12.0,-5.4 -12.0,-12.0s5.4,-12.0 12.0,-12.0c6.6,0.0 12.0,5.4 12.0,12.0S30.6,36.0 24.0,36.0z"
+            android:fillColor="#FFFFFF40"/>
+    </group>
+</vector>
diff --git a/packages/SystemUI/res/layout/lland.xml b/packages/SystemUI/res/layout/lland.xml
deleted file mode 100644
index 71a16c9..0000000
--- a/packages/SystemUI/res/layout/lland.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2014 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.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:orientation="vertical"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-        >
-    <com.android.systemui.egg.LLand
-            android:id="@+id/world"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
-    </com.android.systemui.egg.LLand>
-    <TextView
-            android:id="@+id/score"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textSize="32sp"
-            android:textColor="#FFAAAAAA"
-            android:layout_marginTop="32dp"
-            android:layout_marginStart="16dp"
-            android:layout_gravity="top|start"
-            android:paddingStart="16dp"
-            android:paddingEnd="16dp"
-            android:paddingTop="8dp"
-            android:paddingBottom="8dp"
-            android:background="@drawable/scorecard"
-            />
-    <TextView
-            android:id="@+id/welcome"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textSize="30sp"
-            android:textColor="#FFFFFFFF"
-            android:layout_gravity="center"
-            android:layout_marginTop="70dp"
-            android:visibility="gone"
-            />
-</FrameLayout>
-
diff --git a/packages/SystemUI/res/layout/mland.xml b/packages/SystemUI/res/layout/mland.xml
new file mode 100644
index 0000000..d1b6d00
--- /dev/null
+++ b/packages/SystemUI/res/layout/mland.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+        >
+    <com.android.systemui.egg.MLand
+            android:id="@+id/world"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+    </com.android.systemui.egg.MLand>
+    <FrameLayout
+            android:id="@+id/welcome"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone"
+            android:background="#a0000000"
+            android:clickable="true"
+            >
+        <FrameLayout
+            android:id="@+id/play_button"
+            android:layout_width="72dp"
+            android:layout_height="72dp"
+            android:layout_gravity="center"
+            android:clickable="true"
+            android:background="@drawable/ripplebg"
+            android:focusable="true"
+            android:onClick="startButtonPressed"
+            >
+            <ImageView
+                android:id="@+id/play_button_image"
+                android:layout_width="48dp"
+                android:layout_height="48dp"
+                android:scaleType="fitCenter"
+                android:layout_gravity="center"
+                android:tint="#000000"
+                android:src="@drawable/play"
+                />
+            <TextView
+                android:id="@+id/play_button_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:alpha="0"
+                android:textSize="40dp"
+                android:textColor="#000000"
+                />
+        </FrameLayout>
+    </FrameLayout>
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top|center_horizontal"
+        android:orientation="horizontal"
+        android:gravity="center_vertical"
+        android:id="@+id/player_setup"
+        >
+        <ImageButton
+            style="@android:style/Widget.Material.Button.Borderless"
+            android:id="@+id/player_minus_button"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:padding="10dp"
+            android:scaleType="centerInside"
+            android:onClick="playerMinus"
+            android:src="@drawable/minus"
+            />
+        <LinearLayout
+            android:id="@+id/scores"
+            android:layout_width="wrap_content"
+            android:layout_height="64dp"
+            android:padding="12dp"
+            android:orientation="horizontal"
+            android:clipToPadding="false"
+            >
+        </LinearLayout>
+        <ImageButton
+            style="@android:style/Widget.Material.Button.Borderless"
+            android:id="@+id/player_plus_button"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:padding="10dp"
+            android:scaleType="centerInside"
+            android:onClick="playerPlus"
+            android:src="@drawable/plus"
+            />
+    </LinearLayout>
+</FrameLayout>
diff --git a/packages/SystemUI/res/layout/mland_scorefield.xml b/packages/SystemUI/res/layout/mland_scorefield.xml
new file mode 100644
index 0000000..0ed72e43
--- /dev/null
+++ b/packages/SystemUI/res/layout/mland_scorefield.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<TextView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/score"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:textStyle="bold"
+        android:textSize="22sp"
+        android:gravity="center"
+        android:textColor="#FFAAAAAA"
+        android:paddingStart="12dp"
+        android:paddingEnd="12dp"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp"
+        android:background="@drawable/scorecard"
+        android:elevation="@dimen/hud_z"
+        />
diff --git a/packages/SystemUI/res/values/lland_config.xml b/packages/SystemUI/res/values/lland_config.xml
deleted file mode 100644
index a9e732e..0000000
--- a/packages/SystemUI/res/values/lland_config.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2014, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<resources>
-    <dimen name="obstacle_spacing">380dp</dimen>
-    <dimen name="translation_per_sec">100dp</dimen>
-    <dimen name="boost_dv">550dp</dimen>
-    <dimen name="player_hit_size">40dp</dimen>
-    <dimen name="player_size">40dp</dimen>
-    <dimen name="obstacle_width">90dp</dimen>
-    <dimen name="obstacle_stem_width">12dp</dimen>
-    <dimen name="obstacle_gap">170dp</dimen>
-    <dimen name="obstacle_height_min">48dp</dimen>
-    <dimen name="building_width_min">20dp</dimen>
-    <dimen name="building_width_max">250dp</dimen>
-    <dimen name="building_height_min">20dp</dimen>
-    <dimen name="cloud_size_min">10dp</dimen>
-    <dimen name="cloud_size_max">100dp</dimen>
-    <dimen name="sun_size">45dp</dimen>
-    <dimen name="moon_size">30dp</dimen>
-    <dimen name="star_size_min">3dp</dimen>
-    <dimen name="star_size_max">5dp</dimen>
-    <dimen name="G">30dp</dimen>
-    <dimen name="max_v">1000dp</dimen>
-    <dimen name="scenery_z">6dp</dimen>
-    <dimen name="obstacle_z">18dp</dimen>
-    <dimen name="player_z">18dp</dimen>
-    <dimen name="player_z_boost">20dp</dimen>
-    <dimen name="hud_z">35dp</dimen>
-</resources>
diff --git a/packages/SystemUI/res/values/lland_strings.xml b/packages/SystemUI/res/values/lland_strings.xml
deleted file mode 100644
index ce88157..0000000
--- a/packages/SystemUI/res/values/lland_strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2014, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
- * You may obtain a copy of the License at 
- *
- *     http://www.apache.org/licenses/LICENSE-2.0 
- *
- * Unless required by applicable law or agreed to in writing, software 
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- * See the License for the specific language governing permissions and 
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Name of the L Land easter egg. DO NOT TRANSLATE -->
-    <string name="lland">L Land</string>
-</resources>
diff --git a/packages/SystemUI/res/values/mland_config.xml b/packages/SystemUI/res/values/mland_config.xml
new file mode 100644
index 0000000..0ca88ae
--- /dev/null
+++ b/packages/SystemUI/res/values/mland_config.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <dimen name="obstacle_spacing">380dp</dimen>
+    <dimen name="translation_per_sec">100dp</dimen>
+    <dimen name="boost_dv">550dp</dimen>
+    <dimen name="player_hit_size">40dp</dimen>
+    <dimen name="player_size">40dp</dimen>
+    <dimen name="obstacle_width">130dp</dimen>
+    <dimen name="obstacle_stem_width">8dp</dimen>
+    <dimen name="obstacle_gap">140dp</dimen>
+    <dimen name="obstacle_height_min">48dp</dimen>
+    <dimen name="building_width_min">50dp</dimen>
+    <dimen name="building_width_max">250dp</dimen>
+    <dimen name="building_height_min">20dp</dimen>
+    <dimen name="cloud_size_min">10dp</dimen>
+    <dimen name="cloud_size_max">100dp</dimen>
+    <dimen name="sun_size">45dp</dimen>
+    <dimen name="moon_size">30dp</dimen>
+    <dimen name="star_size_min">3dp</dimen>
+    <dimen name="star_size_max">5dp</dimen>
+    <dimen name="G">30dp</dimen>
+    <dimen name="max_v">1000dp</dimen>
+    <dimen name="scenery_z">6dp</dimen>
+    <dimen name="obstacle_z">18dp</dimen>
+    <dimen name="player_z">18dp</dimen>
+    <dimen name="player_z_boost">20dp</dimen>
+    <dimen name="hud_z">10dp</dimen>
+</resources>
diff --git a/packages/SystemUI/res/values/mland_strings.xml b/packages/SystemUI/res/values/mland_strings.xml
new file mode 100644
index 0000000..fada1ae
--- /dev/null
+++ b/packages/SystemUI/res/values/mland_strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Name of the easter egg. DO NOT TRANSLATE -->
+    <string name="mland">Marshmallow Land</string>
+</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/egg/LLand.java b/packages/SystemUI/src/com/android/systemui/egg/LLand.java
deleted file mode 100644
index fa257b1..0000000
--- a/packages/SystemUI/src/com/android/systemui/egg/LLand.java
+++ /dev/null
@@ -1,988 +0,0 @@
-/*
- * Copyright (C) 2014 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.systemui.egg;
-
-import android.animation.TimeAnimator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Matrix;
-import android.graphics.Outline;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.media.AudioAttributes;
-import android.media.AudioManager;
-import android.os.Vibrator;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.util.Slog;
-import android.view.View;
-import android.view.ViewOutlineProvider;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-
-import java.util.ArrayList;
-
-public class LLand extends FrameLayout {
-    public static final String TAG = "LLand";
-
-    public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-    public static final boolean DEBUG_DRAW = false; // DEBUG
-
-    public static void L(String s, Object ... objects) {
-        if (DEBUG) {
-            Slog.d(TAG, objects.length == 0 ? s : String.format(s, objects));
-        }
-    }
-
-    public static final boolean AUTOSTART = true;
-    public static final boolean HAVE_STARS = true;
-
-    public static final float DEBUG_SPEED_MULTIPLIER = 1f; // 0.1f;
-    public static final boolean DEBUG_IDDQD = Log.isLoggable(TAG + ".iddqd", Log.DEBUG);
-
-    final static int[] POPS = {
-            // resid                // spinny!  // alpha
-            R.drawable.pop_belt,    0,          255,
-            R.drawable.pop_droid,   0,          255,
-            R.drawable.pop_pizza,   1,          255,
-            R.drawable.pop_stripes, 0,          255,
-            R.drawable.pop_swirl,   1,          255,
-            R.drawable.pop_vortex,  1,          255,
-            R.drawable.pop_vortex2, 1,          255,
-            R.drawable.pop_ball,    0,          190,
-    };
-
-    private static class Params {
-        public float TRANSLATION_PER_SEC;
-        public int OBSTACLE_SPACING, OBSTACLE_PERIOD;
-        public int BOOST_DV;
-        public int PLAYER_HIT_SIZE;
-        public int PLAYER_SIZE;
-        public int OBSTACLE_WIDTH, OBSTACLE_STEM_WIDTH;
-        public int OBSTACLE_GAP;
-        public int OBSTACLE_MIN;
-        public int BUILDING_WIDTH_MIN, BUILDING_WIDTH_MAX;
-        public int BUILDING_HEIGHT_MIN;
-        public int CLOUD_SIZE_MIN, CLOUD_SIZE_MAX;
-        public int STAR_SIZE_MIN, STAR_SIZE_MAX;
-        public int G;
-        public int MAX_V;
-            public float SCENERY_Z, OBSTACLE_Z, PLAYER_Z, PLAYER_Z_BOOST, HUD_Z;
-        public Params(Resources res) {
-            TRANSLATION_PER_SEC = res.getDimension(R.dimen.translation_per_sec);
-            OBSTACLE_SPACING = res.getDimensionPixelSize(R.dimen.obstacle_spacing);
-            OBSTACLE_PERIOD = (int) (OBSTACLE_SPACING / TRANSLATION_PER_SEC);
-            BOOST_DV = res.getDimensionPixelSize(R.dimen.boost_dv);
-            PLAYER_HIT_SIZE = res.getDimensionPixelSize(R.dimen.player_hit_size);
-            PLAYER_SIZE = res.getDimensionPixelSize(R.dimen.player_size);
-            OBSTACLE_WIDTH = res.getDimensionPixelSize(R.dimen.obstacle_width);
-            OBSTACLE_STEM_WIDTH = res.getDimensionPixelSize(R.dimen.obstacle_stem_width);
-            OBSTACLE_GAP = res.getDimensionPixelSize(R.dimen.obstacle_gap);
-            OBSTACLE_MIN = res.getDimensionPixelSize(R.dimen.obstacle_height_min);
-            BUILDING_HEIGHT_MIN = res.getDimensionPixelSize(R.dimen.building_height_min);
-            BUILDING_WIDTH_MIN = res.getDimensionPixelSize(R.dimen.building_width_min);
-            BUILDING_WIDTH_MAX = res.getDimensionPixelSize(R.dimen.building_width_max);
-            CLOUD_SIZE_MIN = res.getDimensionPixelSize(R.dimen.cloud_size_min);
-            CLOUD_SIZE_MAX = res.getDimensionPixelSize(R.dimen.cloud_size_max);
-            STAR_SIZE_MIN = res.getDimensionPixelSize(R.dimen.star_size_min);
-            STAR_SIZE_MAX = res.getDimensionPixelSize(R.dimen.star_size_max);
-
-            G = res.getDimensionPixelSize(R.dimen.G);
-            MAX_V = res.getDimensionPixelSize(R.dimen.max_v);
-
-            SCENERY_Z = res.getDimensionPixelSize(R.dimen.scenery_z);
-            OBSTACLE_Z = res.getDimensionPixelSize(R.dimen.obstacle_z);
-            PLAYER_Z = res.getDimensionPixelSize(R.dimen.player_z);
-            PLAYER_Z_BOOST = res.getDimensionPixelSize(R.dimen.player_z_boost);
-            HUD_Z = res.getDimensionPixelSize(R.dimen.hud_z);
-
-            // Sanity checking
-            if (OBSTACLE_MIN <= OBSTACLE_WIDTH / 2) {
-                Slog.e(TAG, "error: obstacles might be too short, adjusting");
-                OBSTACLE_MIN = OBSTACLE_WIDTH / 2 + 1;
-            }
-        }
-    }
-
-    private TimeAnimator mAnim;
-    private Vibrator mVibrator;
-    private AudioManager mAudioManager;
-    private final AudioAttributes mAudioAttrs = new AudioAttributes.Builder()
-            .setUsage(AudioAttributes.USAGE_GAME).build();
-
-    private TextView mScoreField;
-    private View mSplash;
-
-    private Player mDroid;
-    private ArrayList<Obstacle> mObstaclesInPlay = new ArrayList<Obstacle>();
-
-    private float t, dt;
-
-    private int mScore;
-    private float mLastPipeTime; // in sec
-    private int mWidth, mHeight;
-    private boolean mAnimating, mPlaying;
-    private boolean mFrozen; // after death, a short backoff
-    private boolean mFlipped;
-
-    private int mTimeOfDay;
-    private static final int DAY = 0, NIGHT = 1, TWILIGHT = 2, SUNSET = 3;
-    private static final int[][] SKIES = {
-            { 0xFFc0c0FF, 0xFFa0a0FF }, // DAY
-            { 0xFF000010, 0xFF000000 }, // NIGHT
-            { 0xFF000040, 0xFF000010 }, // TWILIGHT
-            { 0xFFa08020, 0xFF204080 }, // SUNSET
-    };
-
-    private static Params PARAMS;
-
-    public LLand(Context context) {
-        this(context, null);
-    }
-
-    public LLand(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public LLand(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
-        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-        setFocusable(true);
-        PARAMS = new Params(getResources());
-        mTimeOfDay = irand(0, SKIES.length);
-
-        // we assume everything will be laid out left|top
-        setLayoutDirection(LAYOUT_DIRECTION_LTR);
-    }
-
-    @Override
-    public boolean willNotDraw() {
-        return !DEBUG;
-    }
-
-    public int getGameWidth() { return mWidth; }
-    public int getGameHeight() { return mHeight; }
-    public float getGameTime() { return t; }
-    public float getLastTimeStep() { return dt; }
-
-    public void setScoreField(TextView tv) {
-        mScoreField = tv;
-        if (tv != null) {
-            tv.setTranslationZ(PARAMS.HUD_Z);
-            if (!(mAnimating && mPlaying)) {
-                tv.setTranslationY(-500);
-            }
-        }
-    }
-
-    public void setSplash(View v) {
-        mSplash = v;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        stop();
-        reset();
-        if (AUTOSTART) {
-            start(false);
-        }
-    }
-
-    final float hsv[] = {0, 0, 0};
-
-    private void thump() {
-        if (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
-            // No interruptions. Not even game haptics.
-            return;
-        }
-        mVibrator.vibrate(80, mAudioAttrs);
-    }
-
-    public void reset() {
-        L("reset");
-        final Drawable sky = new GradientDrawable(
-                GradientDrawable.Orientation.BOTTOM_TOP,
-                SKIES[mTimeOfDay]
-        );
-        sky.setDither(true);
-        setBackground(sky);
-
-        mFlipped = frand() > 0.5f;
-        setScaleX(mFlipped ? -1 : 1);
-
-        setScore(0);
-
-        int i = getChildCount();
-        while (i-->0) {
-            final View v = getChildAt(i);
-            if (v instanceof GameView) {
-                removeViewAt(i);
-            }
-        }
-
-        mObstaclesInPlay.clear();
-
-        mWidth = getWidth();
-        mHeight = getHeight();
-
-        boolean showingSun = (mTimeOfDay == DAY || mTimeOfDay == SUNSET) && frand() > 0.25;
-        if (showingSun) {
-            final Star sun = new Star(getContext());
-            sun.setBackgroundResource(R.drawable.sun);
-            final int w = getResources().getDimensionPixelSize(R.dimen.sun_size);
-            sun.setTranslationX(frand(w, mWidth-w));
-            if (mTimeOfDay == DAY) {
-                sun.setTranslationY(frand(w, (mHeight * 0.66f)));
-                sun.getBackground().setTint(0);
-            } else {
-                sun.setTranslationY(frand(mHeight * 0.66f, mHeight - w));
-                sun.getBackground().setTintMode(PorterDuff.Mode.SRC_ATOP);
-                sun.getBackground().setTint(0xC0FF8000);
-
-            }
-            addView(sun, new LayoutParams(w, w));
-        }
-        if (!showingSun) {
-            final boolean dark = mTimeOfDay == NIGHT || mTimeOfDay == TWILIGHT;
-            final float ff = frand();
-            if ((dark && ff < 0.75f) || ff < 0.5f) {
-                final Star moon = new Star(getContext());
-                moon.setBackgroundResource(R.drawable.moon);
-                moon.getBackground().setAlpha(dark ? 255 : 128);
-                moon.setScaleX(frand() > 0.5 ? -1 : 1);
-                moon.setRotation(moon.getScaleX() * frand(5, 30));
-                final int w = getResources().getDimensionPixelSize(R.dimen.sun_size);
-                moon.setTranslationX(frand(w, mWidth - w));
-                moon.setTranslationY(frand(w, mHeight - w));
-                addView(moon, new LayoutParams(w, w));
-            }
-        }
-
-        final int mh = mHeight / 6;
-        final boolean cloudless = frand() < 0.25;
-        final int N = 20;
-        for (i=0; i<N; i++) {
-            final float r1 = frand();
-            final Scenery s;
-            if (HAVE_STARS && r1 < 0.3 && mTimeOfDay != DAY) {
-                s = new Star(getContext());
-            } else if (r1 < 0.6 && !cloudless) {
-                s = new Cloud(getContext());
-            } else {
-                s = new Building(getContext());
-
-                s.z = (float)i/N;
-                s.setTranslationZ(PARAMS.SCENERY_Z * (1+s.z));
-                s.v = 0.85f * s.z; // buildings move proportional to their distance
-                hsv[0] = 175;
-                hsv[1] = 0.25f;
-                hsv[2] = 1 * s.z;
-                s.setBackgroundColor(Color.HSVToColor(hsv));
-                s.h = irand(PARAMS.BUILDING_HEIGHT_MIN, mh);
-            }
-            final LayoutParams lp = new LayoutParams(s.w, s.h);
-            if (s instanceof Building) {
-                lp.gravity = Gravity.BOTTOM;
-            } else {
-                lp.gravity = Gravity.TOP;
-                final float r = frand();
-                if (s instanceof Star) {
-                    lp.topMargin = (int) (r * r * mHeight);
-                } else {
-                    lp.topMargin = (int) (1 - r*r * mHeight/2) + mHeight/2;
-                }
-            }
-
-            addView(s, lp);
-            s.setTranslationX(frand(-lp.width, mWidth + lp.width));
-        }
-
-        mDroid = new Player(getContext());
-        mDroid.setX(mWidth / 2);
-        mDroid.setY(mHeight / 2);
-        addView(mDroid, new LayoutParams(PARAMS.PLAYER_SIZE, PARAMS.PLAYER_SIZE));
-
-        mAnim = new TimeAnimator();
-        mAnim.setTimeListener(new TimeAnimator.TimeListener() {
-            @Override
-            public void onTimeUpdate(TimeAnimator timeAnimator, long t, long dt) {
-                step(t, dt);
-            }
-        });
-    }
-
-    private void setScore(int score) {
-        mScore = score;
-        if (mScoreField != null) {
-            mScoreField.setText(DEBUG_IDDQD ? "??" : String.valueOf(score));
-        }
-    }
-
-    private void addScore(int incr) {
-        setScore(mScore + incr);
-    }
-
-    public void start(boolean startPlaying) {
-        L("start(startPlaying=%s)", startPlaying?"true":"false");
-        if (startPlaying) {
-            mPlaying = true;
-
-            t = 0;
-            // there's a sucker born every OBSTACLE_PERIOD
-            mLastPipeTime = getGameTime() - PARAMS.OBSTACLE_PERIOD;
-
-            if (mSplash != null && mSplash.getAlpha() > 0f) {
-                mSplash.setTranslationZ(PARAMS.HUD_Z);
-                mSplash.animate().alpha(0).translationZ(0).setDuration(400);
-
-                mScoreField.animate().translationY(0)
-                        .setInterpolator(new DecelerateInterpolator())
-                        .setDuration(1500);
-            }
-
-            mScoreField.setTextColor(0xFFAAAAAA);
-            mScoreField.setBackgroundResource(R.drawable.scorecard);
-            mDroid.setVisibility(View.VISIBLE);
-            mDroid.setX(mWidth / 2);
-            mDroid.setY(mHeight / 2);
-        } else {
-            mDroid.setVisibility(View.GONE);
-        }
-        if (!mAnimating) {
-            mAnim.start();
-            mAnimating = true;
-        }
-    }
-
-    public void stop() {
-        if (mAnimating) {
-            mAnim.cancel();
-            mAnim = null;
-            mAnimating = false;
-            mScoreField.setTextColor(0xFFFFFFFF);
-            mScoreField.setBackgroundResource(R.drawable.scorecard_gameover);
-            mTimeOfDay = irand(0, SKIES.length); // for next reset
-            mFrozen = true;
-            postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        mFrozen = false;
-                    }
-                }, 250);
-        }
-    }
-
-    public static final float lerp(float x, float a, float b) {
-        return (b - a) * x + a;
-    }
-
-    public static final float rlerp(float v, float a, float b) {
-        return (v - a) / (b - a);
-    }
-
-    public static final float clamp(float f) {
-        return f < 0f ? 0f : f > 1f ? 1f : f;
-    }
-
-    public static final float frand() {
-        return (float) Math.random();
-    }
-
-    public static final float frand(float a, float b) {
-        return lerp(frand(), a, b);
-    }
-
-    public static final int irand(int a, int b) {
-        return (int) lerp(frand(), (float) a, (float) b);
-    }
-
-    private void step(long t_ms, long dt_ms) {
-        t = t_ms / 1000f; // seconds
-        dt = dt_ms / 1000f;
-
-        if (DEBUG) {
-            t *= DEBUG_SPEED_MULTIPLIER;
-            dt *= DEBUG_SPEED_MULTIPLIER;
-        }
-
-        // 1. Move all objects and update bounds
-        final int N = getChildCount();
-        int i = 0;
-        for (; i<N; i++) {
-            final View v = getChildAt(i);
-            if (v instanceof GameView) {
-                ((GameView) v).step(t_ms, dt_ms, t, dt);
-            }
-        }
-
-        // 2. Check for altitude
-        if (mPlaying && mDroid.below(mHeight)) {
-            if (DEBUG_IDDQD) {
-                poke();
-                unpoke();
-            } else {
-                L("player hit the floor");
-                thump();
-                stop();
-            }
-        }
-
-        // 3. Check for obstacles
-        boolean passedBarrier = false;
-        for (int j = mObstaclesInPlay.size(); j-->0;) {
-            final Obstacle ob = mObstaclesInPlay.get(j);
-            if (mPlaying && ob.intersects(mDroid) && !DEBUG_IDDQD) {
-                L("player hit an obstacle");
-                thump();
-                stop();
-            } else if (ob.cleared(mDroid)) {
-                if (ob instanceof Stem) passedBarrier = true;
-                mObstaclesInPlay.remove(j);
-            }
-        }
-
-        if (mPlaying && passedBarrier) {
-            addScore(1);
-        }
-
-        // 4. Handle edge of screen
-        // Walk backwards to make sure removal is safe
-        while (i-->0) {
-            final View v = getChildAt(i);
-            if (v instanceof Obstacle) {
-                if (v.getTranslationX() + v.getWidth() < 0) {
-                    removeViewAt(i);
-                }
-            } else if (v instanceof Scenery) {
-                final Scenery s = (Scenery) v;
-                if (v.getTranslationX() + s.w < 0) {
-                    v.setTranslationX(getWidth());
-                }
-            }
-        }
-
-        // 3. Time for more obstacles!
-        if (mPlaying && (t - mLastPipeTime) > PARAMS.OBSTACLE_PERIOD) {
-            mLastPipeTime = t;
-            final int obstacley =
-                    (int)(frand() * (mHeight - 2*PARAMS.OBSTACLE_MIN - PARAMS.OBSTACLE_GAP)) +
-                    PARAMS.OBSTACLE_MIN;
-
-            final int inset = (PARAMS.OBSTACLE_WIDTH - PARAMS.OBSTACLE_STEM_WIDTH) / 2;
-            final int yinset = PARAMS.OBSTACLE_WIDTH/2;
-
-            final int d1 = irand(0,250);
-            final Obstacle s1 = new Stem(getContext(), obstacley - yinset, false);
-            addView(s1, new LayoutParams(
-                    PARAMS.OBSTACLE_STEM_WIDTH,
-                    (int) s1.h,
-                    Gravity.TOP|Gravity.LEFT));
-            s1.setTranslationX(mWidth+inset);
-            s1.setTranslationY(-s1.h-yinset);
-            s1.setTranslationZ(PARAMS.OBSTACLE_Z*0.75f);
-            s1.animate()
-                    .translationY(0)
-                    .setStartDelay(d1)
-                    .setDuration(250);
-            mObstaclesInPlay.add(s1);
-
-            final Obstacle p1 = new Pop(getContext(), PARAMS.OBSTACLE_WIDTH);
-            addView(p1, new LayoutParams(
-                    PARAMS.OBSTACLE_WIDTH,
-                    PARAMS.OBSTACLE_WIDTH,
-                    Gravity.TOP|Gravity.LEFT));
-            p1.setTranslationX(mWidth);
-            p1.setTranslationY(-PARAMS.OBSTACLE_WIDTH);
-            p1.setTranslationZ(PARAMS.OBSTACLE_Z);
-            p1.setScaleX(0.25f);
-            p1.setScaleY(0.25f);
-            p1.animate()
-                    .translationY(s1.h-inset)
-                    .scaleX(1f)
-                    .scaleY(1f)
-                    .setStartDelay(d1)
-                    .setDuration(250);
-            mObstaclesInPlay.add(p1);
-
-            final int d2 = irand(0,250);
-            final Obstacle s2 = new Stem(getContext(),
-                    mHeight - obstacley - PARAMS.OBSTACLE_GAP - yinset,
-                    true);
-            addView(s2, new LayoutParams(
-                    PARAMS.OBSTACLE_STEM_WIDTH,
-                    (int) s2.h,
-                    Gravity.TOP|Gravity.LEFT));
-            s2.setTranslationX(mWidth+inset);
-            s2.setTranslationY(mHeight+yinset);
-            s2.setTranslationZ(PARAMS.OBSTACLE_Z*0.75f);
-            s2.animate()
-                    .translationY(mHeight-s2.h)
-                    .setStartDelay(d2)
-                    .setDuration(400);
-            mObstaclesInPlay.add(s2);
-
-            final Obstacle p2 = new Pop(getContext(), PARAMS.OBSTACLE_WIDTH);
-            addView(p2, new LayoutParams(
-                    PARAMS.OBSTACLE_WIDTH,
-                    PARAMS.OBSTACLE_WIDTH,
-                    Gravity.TOP|Gravity.LEFT));
-            p2.setTranslationX(mWidth);
-            p2.setTranslationY(mHeight);
-            p2.setTranslationZ(PARAMS.OBSTACLE_Z);
-            p2.setScaleX(0.25f);
-            p2.setScaleY(0.25f);
-            p2.animate()
-                    .translationY(mHeight-s2.h-yinset)
-                    .scaleX(1f)
-                    .scaleY(1f)
-                    .setStartDelay(d2)
-                    .setDuration(400);
-            mObstaclesInPlay.add(p2);
-        }
-
-        if (DEBUG_DRAW) invalidate();
-    }
-    
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        L("touch: %s", ev);
-        switch (ev.getAction()) {
-            case MotionEvent.ACTION_DOWN:
-                poke();
-                return true;
-            case MotionEvent.ACTION_UP:
-                unpoke();
-                return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onTrackballEvent(MotionEvent ev) {
-        L("trackball: %s", ev);
-        switch (ev.getAction()) {
-            case MotionEvent.ACTION_DOWN:
-                poke();
-                return true;
-            case MotionEvent.ACTION_UP:
-                unpoke();
-                return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent ev) {
-        L("keyDown: %d", keyCode);
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_DPAD_CENTER:
-            case KeyEvent.KEYCODE_DPAD_UP:
-            case KeyEvent.KEYCODE_SPACE:
-            case KeyEvent.KEYCODE_ENTER:
-            case KeyEvent.KEYCODE_BUTTON_A:
-                poke();
-                return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onKeyUp(int keyCode, KeyEvent ev) {
-        L("keyDown: %d", keyCode);
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_DPAD_CENTER:
-            case KeyEvent.KEYCODE_DPAD_UP:
-            case KeyEvent.KEYCODE_SPACE:
-            case KeyEvent.KEYCODE_ENTER:
-            case KeyEvent.KEYCODE_BUTTON_A:
-                unpoke();
-                return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onGenericMotionEvent (MotionEvent ev) {
-        L("generic: %s", ev);
-        return false;
-    }
-
-    private void poke() {
-        L("poke");
-        if (mFrozen) return;
-        if (!mAnimating) {
-            reset();
-            start(true);
-        } else if (!mPlaying) {
-            start(true);
-        }
-        mDroid.boost();
-        if (DEBUG) {
-            mDroid.dv *= DEBUG_SPEED_MULTIPLIER;
-            mDroid.animate().setDuration((long) (200/DEBUG_SPEED_MULTIPLIER));
-        }
-    }
-
-    private void unpoke() {
-        L("unboost");
-        if (mFrozen) return;
-        if (!mAnimating) return;
-        mDroid.unboost();
-    }
-
-    @Override
-    public void onDraw(Canvas c) {
-        super.onDraw(c);
-
-        if (!DEBUG_DRAW) return;
-
-        final Paint pt = new Paint();
-        pt.setColor(0xFFFFFFFF);
-        final int L = mDroid.corners.length;
-        final int N = L/2;
-        for (int i=0; i<N; i++) {
-            final int x = (int) mDroid.corners[i*2];
-            final int y = (int) mDroid.corners[i*2+1];
-            c.drawCircle(x, y, 4, pt);
-            c.drawLine(x, y,
-                    mDroid.corners[(i*2+2)%L],
-                    mDroid.corners[(i*2+3)%L],
-                    pt);
-        }
-
-        pt.setStyle(Paint.Style.STROKE);
-        pt.setStrokeWidth(getResources().getDisplayMetrics().density);
-
-        final int M = getChildCount();
-        pt.setColor(0x8000FF00);
-        for (int i=0; i<M; i++) {
-            final View v = getChildAt(i);
-            if (v == mDroid) continue;
-            if (!(v instanceof GameView)) continue;
-            if (v instanceof Pop) {
-                final Pop p = (Pop) v;
-                c.drawCircle(p.cx, p.cy, p.r, pt);
-            } else {
-                final Rect r = new Rect();
-                v.getHitRect(r);
-                c.drawRect(r, pt);
-            }
-        }
-
-        pt.setColor(Color.BLACK);
-        final StringBuilder sb = new StringBuilder("obstacles: ");
-        for (Obstacle ob : mObstaclesInPlay) {
-            sb.append(ob.hitRect.toShortString());
-            sb.append(" ");
-        }
-        pt.setTextSize(20f);
-        c.drawText(sb.toString(), 20, 100, pt);
-    }
-
-    static final Rect sTmpRect = new Rect();
-
-    private interface GameView {
-        public void step(long t_ms, long dt_ms, float t, float dt);
-    }
-
-    private class Player extends ImageView implements GameView {
-        public float dv;
-
-        private boolean mBoosting;
-
-        private final int[] sColors = new int[] {
-                0xFF78C557,
-        };
-
-        private final float[] sHull = new float[] {
-                0.3f,  0f,    // left antenna
-                0.7f,  0f,    // right antenna
-                0.92f, 0.33f, // off the right shoulder of Orion
-                0.92f, 0.75f, // right hand (our right, not his right)
-                0.6f,  1f,    // right foot
-                0.4f,  1f,    // left foot BLUE!
-                0.08f, 0.75f, // sinistram
-                0.08f, 0.33f, // cold shoulder
-        };
-        public final float[] corners = new float[sHull.length];
-
-        public Player(Context context) {
-            super(context);
-
-            setBackgroundResource(R.drawable.android);
-            getBackground().setTintMode(PorterDuff.Mode.SRC_ATOP);
-            getBackground().setTint(sColors[0]);
-            setOutlineProvider(new ViewOutlineProvider() {
-                @Override
-                public void getOutline(View view, Outline outline) {
-                    final int w = view.getWidth();
-                    final int h = view.getHeight();
-                    final int ix = (int) (w * 0.3f);
-                    final int iy = (int) (h * 0.2f);
-                    outline.setRect(ix, iy, w - ix, h - iy);
-                }
-            });
-        }
-
-        public void prepareCheckIntersections() {
-            final int inset = (PARAMS.PLAYER_SIZE - PARAMS.PLAYER_HIT_SIZE)/2;
-            final int scale = PARAMS.PLAYER_HIT_SIZE;
-            final int N = sHull.length/2;
-            for (int i=0; i<N; i++) {
-                corners[i*2]   = scale * sHull[i*2]   + inset;
-                corners[i*2+1] = scale * sHull[i*2+1] + inset;
-            }
-            final Matrix m = getMatrix();
-            m.mapPoints(corners);
-        }
-
-        public boolean below(int h) {
-            final int N = corners.length/2;
-            for (int i=0; i<N; i++) {
-                final int y = (int) corners[i*2+1];
-                if (y >= h) return true;
-            }
-            return false;
-        }
-
-        public void step(long t_ms, long dt_ms, float t, float dt) {
-            if (getVisibility() != View.VISIBLE) return; // not playing yet
-
-            if (mBoosting) {
-                dv = -PARAMS.BOOST_DV;
-            } else {
-                dv += PARAMS.G;
-            }
-            if (dv < -PARAMS.MAX_V) dv = -PARAMS.MAX_V;
-            else if (dv > PARAMS.MAX_V) dv = PARAMS.MAX_V;
-
-            final float y = getTranslationY() + dv * dt;
-            setTranslationY(y < 0 ? 0 : y);
-            setRotation(
-                    90 + lerp(clamp(rlerp(dv, PARAMS.MAX_V, -1 * PARAMS.MAX_V)), 90, -90));
-
-            prepareCheckIntersections();
-        }
-
-        public void boost() {
-            mBoosting = true;
-            dv = -PARAMS.BOOST_DV;
-
-            animate().cancel();
-            animate()
-                    .scaleX(1.25f)
-                    .scaleY(1.25f)
-                    .translationZ(PARAMS.PLAYER_Z_BOOST)
-                    .setDuration(100);
-            setScaleX(1.25f);
-            setScaleY(1.25f);
-        }
-
-        public void unboost() {
-            mBoosting = false;
-
-            animate().cancel();
-            animate()
-                    .scaleX(1f)
-                    .scaleY(1f)
-                    .translationZ(PARAMS.PLAYER_Z)
-                    .setDuration(200);
-        }
-    }
-
-    private class Obstacle extends View implements GameView {
-        public float h;
-
-        public final Rect hitRect = new Rect();
-
-        public Obstacle(Context context, float h) {
-            super(context);
-            setBackgroundColor(0xFFFF0000);
-            this.h = h;
-        }
-
-        public boolean intersects(Player p) {
-            final int N = p.corners.length/2;
-            for (int i=0; i<N; i++) {
-                final int x = (int) p.corners[i*2];
-                final int y = (int) p.corners[i*2+1];
-                if (hitRect.contains(x, y)) return true;
-            }
-            return false;
-        }
-
-        public boolean cleared(Player p) {
-            final int N = p.corners.length/2;
-            for (int i=0; i<N; i++) {
-                final int x = (int) p.corners[i*2];
-                if (hitRect.right >= x) return false;
-            }
-            return true;
-        }
-
-        @Override
-        public void step(long t_ms, long dt_ms, float t, float dt) {
-            setTranslationX(getTranslationX()-PARAMS.TRANSLATION_PER_SEC*dt);
-            getHitRect(hitRect);
-        }
-    }
-
-    private class Pop extends Obstacle {
-        int mRotate;
-        int cx, cy, r;
-        public Pop(Context context, float h) {
-            super(context, h);
-            int idx = 3*irand(0, POPS.length/3);
-            setBackgroundResource(POPS[idx]);
-            setAlpha((float)(POPS[idx+2])/255);
-            setScaleX(frand() < 0.5f ? -1 : 1);
-            mRotate = POPS[idx+1] == 0 ? 0 : (frand() < 0.5f ? -1 : 1);
-            setOutlineProvider(new ViewOutlineProvider() {
-                @Override
-                public void getOutline(View view, Outline outline) {
-                    final int pad = (int) (getWidth() * 0.02f);
-                    outline.setOval(pad, pad, getWidth()-pad, getHeight()-pad);
-                }
-            });
-        }
-
-        public boolean intersects(Player p) {
-            final int N = p.corners.length/2;
-            for (int i=0; i<N; i++) {
-                final int x = (int) p.corners[i*2];
-                final int y = (int) p.corners[i*2+1];
-                if (Math.hypot(x-cx, y-cy) <= r) return true;
-            }
-            return false;
-        }
-
-        @Override
-        public void step(long t_ms, long dt_ms, float t, float dt) {
-            super.step(t_ms, dt_ms, t, dt);
-            if (mRotate != 0) {
-                setRotation(getRotation() + dt * 45 * mRotate);
-            }
-
-            cx = (hitRect.left + hitRect.right)/2;
-            cy = (hitRect.top + hitRect.bottom)/2;
-            r = getWidth()/2;
-        }
-    }
-
-    private class Stem extends Obstacle {
-        Paint mPaint = new Paint();
-        Path mShadow = new Path();
-        boolean mDrawShadow;
-
-        public Stem(Context context, float h, boolean drawShadow) {
-            super(context, h);
-            mDrawShadow = drawShadow;
-            mPaint.setColor(0xFFAAAAAA);
-            setBackground(null);
-        }
-
-        @Override
-        public void onAttachedToWindow() {
-            super.onAttachedToWindow();
-            setWillNotDraw(false);
-            setOutlineProvider(new ViewOutlineProvider() {
-                @Override
-                public void getOutline(View view, Outline outline) {
-                    outline.setRect(0, 0, getWidth(), getHeight());
-                }
-            });
-        }
-        @Override
-        public void onDraw(Canvas c) {
-            final int w = c.getWidth();
-            final int h = c.getHeight();
-            final GradientDrawable g = new GradientDrawable();
-            g.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
-            g.setGradientCenter(w * 0.75f, 0);
-            g.setColors(new int[] { 0xFFFFFFFF, 0xFFAAAAAA });
-            g.setBounds(0, 0, w, h);
-            g.draw(c);
-            if (!mDrawShadow) return;
-            mShadow.reset();
-            mShadow.moveTo(0,0);
-            mShadow.lineTo(w, 0);
-            mShadow.lineTo(w, PARAMS.OBSTACLE_WIDTH/2+w*1.5f);
-            mShadow.lineTo(0, PARAMS.OBSTACLE_WIDTH/2);
-            mShadow.close();
-            c.drawPath(mShadow, mPaint);
-        }
-    }
-
-    private class Scenery extends FrameLayout implements GameView {
-        public float z;
-        public float v;
-        public int h, w;
-        public Scenery(Context context) {
-            super(context);
-        }
-
-        @Override
-        public void step(long t_ms, long dt_ms, float t, float dt) {
-            setTranslationX(getTranslationX() - PARAMS.TRANSLATION_PER_SEC * dt * v);
-        }
-    }
-
-    private class Building extends Scenery {
-        public Building(Context context) {
-            super(context);
-
-            w = irand(PARAMS.BUILDING_WIDTH_MIN, PARAMS.BUILDING_WIDTH_MAX);
-            h = 0; // will be setup later, along with z
-
-            setTranslationZ(PARAMS.SCENERY_Z);
-        }
-    }
-
-    private class Cloud extends Scenery {
-        public Cloud(Context context) {
-            super(context);
-            setBackgroundResource(frand() < 0.01f ? R.drawable.cloud_off : R.drawable.cloud);
-            getBackground().setAlpha(0x40);
-            w = h = irand(PARAMS.CLOUD_SIZE_MIN, PARAMS.CLOUD_SIZE_MAX);
-            z = 0;
-            v = frand(0.15f,0.5f);
-        }
-    }
-
-    private class Star extends Scenery {
-        public Star(Context context) {
-            super(context);
-            setBackgroundResource(R.drawable.star);
-            w = h = irand(PARAMS.STAR_SIZE_MIN, PARAMS.STAR_SIZE_MAX);
-            v = z = 0;
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/egg/LLandActivity.java b/packages/SystemUI/src/com/android/systemui/egg/LLandActivity.java
deleted file mode 100644
index 50221d3..0000000
--- a/packages/SystemUI/src/com/android/systemui/egg/LLandActivity.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2014 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.systemui.egg;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-
-public class LLandActivity extends Activity {
-    LLand mLand;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.lland);
-        mLand = (LLand) findViewById(R.id.world);
-        mLand.setScoreField((TextView) findViewById(R.id.score));
-        mLand.setSplash(findViewById(R.id.welcome));
-        //Log.v(LLand.TAG, "focus: " + mLand.requestFocus());
-    }
-
-    @Override
-    public void onPause() {
-        mLand.stop();
-        super.onPause();
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/egg/MLand.java b/packages/SystemUI/src/com/android/systemui/egg/MLand.java
new file mode 100644
index 0000000..b84777b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/egg/MLand.java
@@ -0,0 +1,1441 @@
+/*
+ * Copyright (C) 2015 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.systemui.egg;
+
+import android.animation.LayoutTransition;
+import android.animation.TimeAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Outline;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.media.AudioAttributes;
+import android.media.AudioManager;
+import android.os.Vibrator;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.InputDevice;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewOutlineProvider;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import com.android.internal.logging.MetricsLogger;
+
+import com.android.systemui.R;
+
+// It's like LLand, but "M"ultiplayer.
+public class MLand extends FrameLayout {
+    public static final String TAG = "MLand";
+
+    public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    public static final boolean DEBUG_DRAW = false; // DEBUG
+
+    public static final boolean SHOW_TOUCHES = true;
+
+    public static void L(String s, Object ... objects) {
+        if (DEBUG) {
+            Log.d(TAG, objects.length == 0 ? s : String.format(s, objects));
+        }
+    }
+
+    public static final float PI_2 = (float) (Math.PI/2);
+
+    public static final boolean AUTOSTART = true;
+    public static final boolean HAVE_STARS = true;
+
+    public static final float DEBUG_SPEED_MULTIPLIER = 0.5f; // only if DEBUG
+    public static final boolean DEBUG_IDDQD = Log.isLoggable(TAG + ".iddqd", Log.DEBUG);
+
+    public static final int DEFAULT_PLAYERS = 1;
+    public static final int MIN_PLAYERS = 1;
+    public static final int MAX_PLAYERS = 6;
+
+    static final float CONTROLLER_VIBRATION_MULTIPLIER = 2f;
+
+    private static class Params {
+        public float TRANSLATION_PER_SEC;
+        public int OBSTACLE_SPACING, OBSTACLE_PERIOD;
+        public int BOOST_DV;
+        public int PLAYER_HIT_SIZE;
+        public int PLAYER_SIZE;
+        public int OBSTACLE_WIDTH, OBSTACLE_STEM_WIDTH;
+        public int OBSTACLE_GAP;
+        public int OBSTACLE_MIN;
+        public int BUILDING_WIDTH_MIN, BUILDING_WIDTH_MAX;
+        public int BUILDING_HEIGHT_MIN;
+        public int CLOUD_SIZE_MIN, CLOUD_SIZE_MAX;
+        public int STAR_SIZE_MIN, STAR_SIZE_MAX;
+        public int G;
+        public int MAX_V;
+            public float SCENERY_Z, OBSTACLE_Z, PLAYER_Z, PLAYER_Z_BOOST, HUD_Z;
+        public Params(Resources res) {
+            TRANSLATION_PER_SEC = res.getDimension(R.dimen.translation_per_sec);
+            OBSTACLE_SPACING = res.getDimensionPixelSize(R.dimen.obstacle_spacing);
+            OBSTACLE_PERIOD = (int) (OBSTACLE_SPACING / TRANSLATION_PER_SEC);
+            BOOST_DV = res.getDimensionPixelSize(R.dimen.boost_dv);
+            PLAYER_HIT_SIZE = res.getDimensionPixelSize(R.dimen.player_hit_size);
+            PLAYER_SIZE = res.getDimensionPixelSize(R.dimen.player_size);
+            OBSTACLE_WIDTH = res.getDimensionPixelSize(R.dimen.obstacle_width);
+            OBSTACLE_STEM_WIDTH = res.getDimensionPixelSize(R.dimen.obstacle_stem_width);
+            OBSTACLE_GAP = res.getDimensionPixelSize(R.dimen.obstacle_gap);
+            OBSTACLE_MIN = res.getDimensionPixelSize(R.dimen.obstacle_height_min);
+            BUILDING_HEIGHT_MIN = res.getDimensionPixelSize(R.dimen.building_height_min);
+            BUILDING_WIDTH_MIN = res.getDimensionPixelSize(R.dimen.building_width_min);
+            BUILDING_WIDTH_MAX = res.getDimensionPixelSize(R.dimen.building_width_max);
+            CLOUD_SIZE_MIN = res.getDimensionPixelSize(R.dimen.cloud_size_min);
+            CLOUD_SIZE_MAX = res.getDimensionPixelSize(R.dimen.cloud_size_max);
+            STAR_SIZE_MIN = res.getDimensionPixelSize(R.dimen.star_size_min);
+            STAR_SIZE_MAX = res.getDimensionPixelSize(R.dimen.star_size_max);
+
+            G = res.getDimensionPixelSize(R.dimen.G);
+            MAX_V = res.getDimensionPixelSize(R.dimen.max_v);
+
+            SCENERY_Z = res.getDimensionPixelSize(R.dimen.scenery_z);
+            OBSTACLE_Z = res.getDimensionPixelSize(R.dimen.obstacle_z);
+            PLAYER_Z = res.getDimensionPixelSize(R.dimen.player_z);
+            PLAYER_Z_BOOST = res.getDimensionPixelSize(R.dimen.player_z_boost);
+            HUD_Z = res.getDimensionPixelSize(R.dimen.hud_z);
+
+            // Sanity checking
+            if (OBSTACLE_MIN <= OBSTACLE_WIDTH / 2) {
+                L("error: obstacles might be too short, adjusting");
+                OBSTACLE_MIN = OBSTACLE_WIDTH / 2 + 1;
+            }
+        }
+    }
+
+    private TimeAnimator mAnim;
+    private Vibrator mVibrator;
+    private AudioManager mAudioManager;
+    private final AudioAttributes mAudioAttrs = new AudioAttributes.Builder()
+            .setUsage(AudioAttributes.USAGE_GAME).build();
+
+    private View mSplash;
+    private ViewGroup mScoreFields;
+
+    private ArrayList<Player> mPlayers = new ArrayList<Player>();
+    private ArrayList<Obstacle> mObstaclesInPlay = new ArrayList<Obstacle>();
+
+    private float t, dt;
+
+    private float mLastPipeTime; // in sec
+    private int mCurrentPipeId; // basically, equivalent to the current score
+    private int mWidth, mHeight;
+    private boolean mAnimating, mPlaying;
+    private boolean mFrozen; // after death, a short backoff
+    private int mCountdown = 0;
+    private boolean mFlipped;
+
+    private int mTaps;
+
+    private int mTimeOfDay;
+    private static final int DAY = 0, NIGHT = 1, TWILIGHT = 2, SUNSET = 3;
+    private static final int[][] SKIES = {
+            { 0xFFc0c0FF, 0xFFa0a0FF }, // DAY
+            { 0xFF000010, 0xFF000000 }, // NIGHT
+            { 0xFF000040, 0xFF000010 }, // TWILIGHT
+            { 0xFFa08020, 0xFF204080 }, // SUNSET
+    };
+
+    private int mScene;
+    private static final int SCENE_CITY = 0, SCENE_TX = 1, SCENE_ZRH = 2;
+    private static final int SCENE_COUNT = 3;
+
+    private static Params PARAMS;
+
+    private static float dp = 1f;
+
+    private Paint mTouchPaint, mPlayerTracePaint;
+
+    private ArrayList<Integer> mGameControllers = new ArrayList<>();
+
+    public MLand(Context context) {
+        this(context, null);
+    }
+
+    public MLand(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public MLand(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+
+        mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+        setFocusable(true);
+        PARAMS = new Params(getResources());
+        mTimeOfDay = irand(0, SKIES.length - 1);
+        mScene = irand(0, SCENE_COUNT);
+
+        mTouchPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+        mTouchPaint.setColor(0x80FFFFFF);
+        mTouchPaint.setStyle(Paint.Style.FILL);
+
+        mPlayerTracePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+        mPlayerTracePaint.setColor(0x80FFFFFF);
+        mPlayerTracePaint.setStyle(Paint.Style.STROKE);
+        mPlayerTracePaint.setStrokeWidth(2 * dp);
+
+        // we assume everything will be laid out left|top
+        setLayoutDirection(LAYOUT_DIRECTION_LTR);
+
+        setupPlayers(DEFAULT_PLAYERS);
+
+        MetricsLogger.count(getContext(), "egg_mland_create", 1);
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        dp = getResources().getDisplayMetrics().density;
+
+        reset();
+        if (AUTOSTART) {
+            start(false);
+        }
+    }
+
+    @Override
+    public boolean willNotDraw() {
+        return !DEBUG;
+    }
+
+    public int getGameWidth() { return mWidth; }
+    public int getGameHeight() { return mHeight; }
+    public float getGameTime() { return t; }
+    public float getLastTimeStep() { return dt; }
+
+    public void setScoreFieldHolder(ViewGroup vg) {
+        mScoreFields = vg;
+        if (vg != null) {
+            final LayoutTransition lt = new LayoutTransition();
+            lt.setDuration(250);
+            mScoreFields.setLayoutTransition(lt);
+        }
+        for (Player p : mPlayers) {
+            mScoreFields.addView(p.mScoreField,
+                    new MarginLayoutParams(
+                            MarginLayoutParams.WRAP_CONTENT,
+                            MarginLayoutParams.MATCH_PARENT));
+        }
+    }
+
+    public void setSplash(View v) {
+        mSplash = v;
+    }
+
+    public static boolean isGamePad(InputDevice dev) {
+        int sources = dev.getSources();
+
+        // Verify that the device has gamepad buttons, control sticks, or both.
+        return (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD)
+                || ((sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK));
+    }
+
+    public ArrayList getGameControllers() {
+        mGameControllers.clear();
+        int[] deviceIds = InputDevice.getDeviceIds();
+        for (int deviceId : deviceIds) {
+            InputDevice dev = InputDevice.getDevice(deviceId);
+            if (isGamePad(dev)) {
+                if (!mGameControllers.contains(deviceId)) {
+                    mGameControllers.add(deviceId);
+                }
+            }
+        }
+        return mGameControllers;
+    }
+
+    public int getControllerPlayer(int id) {
+        final int player = mGameControllers.indexOf(id);
+        if (player < 0 || player >= mPlayers.size()) return 0;
+        return player;
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        dp = getResources().getDisplayMetrics().density;
+
+        stop();
+
+        reset();
+        if (AUTOSTART) {
+            start(false);
+        }
+    }
+
+    final static float hsv[] = {0, 0, 0};
+
+    private static float luma(int bgcolor) {
+        return    0.2126f * (float) (bgcolor & 0xFF0000) / 0xFF0000
+                + 0.7152f * (float) (bgcolor & 0xFF00) / 0xFF00
+                + 0.0722f * (float) (bgcolor & 0xFF) / 0xFF;
+    }
+
+    public Player getPlayer(int i) {
+        return i < mPlayers.size() ? mPlayers.get(i) : null;
+    }
+
+    private int addPlayerInternal(Player p) {
+        mPlayers.add(p);
+        realignPlayers();
+        TextView scoreField = (TextView)
+            LayoutInflater.from(getContext()).inflate(R.layout.mland_scorefield, null);
+        if (mScoreFields != null) {
+            mScoreFields.addView(scoreField,
+                new MarginLayoutParams(
+                        MarginLayoutParams.WRAP_CONTENT,
+                        MarginLayoutParams.MATCH_PARENT));
+        }
+        p.setScoreField(scoreField);
+        return mPlayers.size()-1;
+    }
+
+    private void removePlayerInternal(Player p) {
+        if (mPlayers.remove(p)) {
+            removeView(p);
+            mScoreFields.removeView(p.mScoreField);
+            realignPlayers();
+        }
+    }
+
+    private void realignPlayers() {
+        final int N = mPlayers.size();
+        float x = (mWidth - (N-1) * PARAMS.PLAYER_SIZE) / 2;
+        for (int i=0; i<N; i++) {
+            final Player p = mPlayers.get(i);
+            p.setX(x);
+            x += PARAMS.PLAYER_SIZE;
+        }
+    }
+
+    private void clearPlayers() {
+        while (mPlayers.size() > 0) {
+            removePlayerInternal(mPlayers.get(0));
+        }
+    }
+
+    public void setupPlayers(int num) {
+        clearPlayers();
+        for (int i=0; i<num; i++) {
+            addPlayerInternal(Player.create(this));
+        }
+    }
+
+    public void addPlayer() {
+        if (getNumPlayers() == MAX_PLAYERS) return;
+        addPlayerInternal(Player.create(this));
+    }
+
+    public int getNumPlayers() {
+        return mPlayers.size();
+    }
+
+    public void removePlayer() {
+        if (getNumPlayers() == MIN_PLAYERS) return;
+        removePlayerInternal(mPlayers.get(mPlayers.size() - 1));
+    }
+
+    private void thump(int playerIndex, long ms) {
+        if (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
+            // No interruptions. Not even game haptics.
+            return;
+        }
+        if (playerIndex < mGameControllers.size()) {
+            int controllerId = mGameControllers.get(playerIndex);
+            InputDevice dev = InputDevice.getDevice(controllerId);
+            if (dev != null && dev.getVibrator().hasVibrator()) {
+                dev.getVibrator().vibrate(
+                        (long) (ms * CONTROLLER_VIBRATION_MULTIPLIER),
+                        mAudioAttrs);
+                return;
+            }
+        }
+        mVibrator.vibrate(ms, mAudioAttrs);
+    }
+
+    public void reset() {
+        L("reset");
+        final Drawable sky = new GradientDrawable(
+                GradientDrawable.Orientation.BOTTOM_TOP,
+                SKIES[mTimeOfDay]
+        );
+        sky.setDither(true);
+        setBackground(sky);
+
+        mFlipped = frand() > 0.5f;
+        setScaleX(mFlipped ? -1 : 1);
+
+        int i = getChildCount();
+        while (i-->0) {
+            final View v = getChildAt(i);
+            if (v instanceof GameView) {
+                removeViewAt(i);
+            }
+        }
+
+        mObstaclesInPlay.clear();
+        mCurrentPipeId = 0;
+
+        mWidth = getWidth();
+        mHeight = getHeight();
+
+        boolean showingSun = (mTimeOfDay == DAY || mTimeOfDay == SUNSET) && frand() > 0.25;
+        if (showingSun) {
+            final Star sun = new Star(getContext());
+            sun.setBackgroundResource(R.drawable.sun);
+            final int w = getResources().getDimensionPixelSize(R.dimen.sun_size);
+            sun.setTranslationX(frand(w, mWidth-w));
+            if (mTimeOfDay == DAY) {
+                sun.setTranslationY(frand(w, (mHeight * 0.66f)));
+                sun.getBackground().setTint(0);
+            } else {
+                sun.setTranslationY(frand(mHeight * 0.66f, mHeight - w));
+                sun.getBackground().setTintMode(PorterDuff.Mode.SRC_ATOP);
+                sun.getBackground().setTint(0xC0FF8000);
+
+            }
+            addView(sun, new LayoutParams(w, w));
+        }
+        if (!showingSun) {
+            final boolean dark = mTimeOfDay == NIGHT || mTimeOfDay == TWILIGHT;
+            final float ff = frand();
+            if ((dark && ff < 0.75f) || ff < 0.5f) {
+                final Star moon = new Star(getContext());
+                moon.setBackgroundResource(R.drawable.moon);
+                moon.getBackground().setAlpha(dark ? 255 : 128);
+                moon.setScaleX(frand() > 0.5 ? -1 : 1);
+                moon.setRotation(moon.getScaleX() * frand(5, 30));
+                final int w = getResources().getDimensionPixelSize(R.dimen.sun_size);
+                moon.setTranslationX(frand(w, mWidth - w));
+                moon.setTranslationY(frand(w, mHeight - w));
+                addView(moon, new LayoutParams(w, w));
+            }
+        }
+
+        final int mh = mHeight / 6;
+        final boolean cloudless = frand() < 0.25;
+        final int N = 20;
+        for (i=0; i<N; i++) {
+            final float r1 = frand();
+            final Scenery s;
+            if (HAVE_STARS && r1 < 0.3 && mTimeOfDay != DAY) {
+                s = new Star(getContext());
+            } else if (r1 < 0.6 && !cloudless) {
+                s = new Cloud(getContext());
+            } else {
+                switch (mScene) {
+                    case SCENE_ZRH:
+                        s = new Mountain(getContext());
+                        break;
+                    case SCENE_TX:
+                        s = new Cactus(getContext());
+                        break;
+                    case SCENE_CITY:
+                    default:
+                        s = new Building(getContext());
+                        break;
+                }
+                s.z = (float) i / N;
+                // no more shadows for these things
+                //s.setTranslationZ(PARAMS.SCENERY_Z * (1+s.z));
+                s.v = 0.85f * s.z; // buildings move proportional to their distance
+                if (mScene == SCENE_CITY) {
+                    s.setBackgroundColor(Color.GRAY);
+                    s.h = irand(PARAMS.BUILDING_HEIGHT_MIN, mh);
+                }
+                final int c = (int)(255f*s.z);
+                final Drawable bg = s.getBackground();
+                if (bg != null) bg.setColorFilter(Color.rgb(c,c,c), PorterDuff.Mode.MULTIPLY);
+            }
+            final LayoutParams lp = new LayoutParams(s.w, s.h);
+            if (s instanceof Building) {
+                lp.gravity = Gravity.BOTTOM;
+            } else {
+                lp.gravity = Gravity.TOP;
+                final float r = frand();
+                if (s instanceof Star) {
+                    lp.topMargin = (int) (r * r * mHeight);
+                } else {
+                    lp.topMargin = (int) (1 - r*r * mHeight/2) + mHeight/2;
+                }
+            }
+
+
+            addView(s, lp);
+            s.setTranslationX(frand(-lp.width, mWidth + lp.width));
+        }
+
+        for (Player p : mPlayers) {
+            addView(p); // put it back!
+            p.reset();
+        }
+
+        realignPlayers();
+
+        if (mAnim != null) {
+            mAnim.cancel();
+        }
+        mAnim = new TimeAnimator();
+        mAnim.setTimeListener(new TimeAnimator.TimeListener() {
+            @Override
+            public void onTimeUpdate(TimeAnimator timeAnimator, long t, long dt) {
+                step(t, dt);
+            }
+        });
+    }
+
+    public void start(boolean startPlaying) {
+        L("start(startPlaying=%s)", startPlaying ? "true" : "false");
+        if (startPlaying && mCountdown <= 0) {
+            showSplash();
+
+            mSplash.findViewById(R.id.play_button).setEnabled(false);
+
+            final View playImage = mSplash.findViewById(R.id.play_button_image);
+            final TextView playText = (TextView) mSplash.findViewById(R.id.play_button_text);
+
+            playImage.animate().alpha(0f);
+            playText.animate().alpha(1f);
+
+            mCountdown = 3;
+            post(new Runnable() {
+                @Override
+                public void run() {
+                    if (mCountdown == 0) {
+                        startPlaying();
+                    } else {
+                        postDelayed(this, 500);
+                    }
+                    playText.setText(String.valueOf(mCountdown));
+                    mCountdown--;
+                }
+            });
+        }
+
+        for (Player p : mPlayers) {
+            p.setVisibility(View.INVISIBLE);
+        }
+
+        if (!mAnimating) {
+            mAnim.start();
+            mAnimating = true;
+        }
+    }
+
+    public void hideSplash() {
+        if (mSplash != null && mSplash.getVisibility() == View.VISIBLE) {
+            mSplash.setClickable(false);
+            mSplash.animate().alpha(0).translationZ(0).setDuration(300).withEndAction(
+                    new Runnable() {
+                        @Override
+                        public void run() {
+                            mSplash.setVisibility(View.GONE);
+                        }
+                    }
+            );
+        }
+    }
+
+    public void showSplash() {
+        if (mSplash != null && mSplash.getVisibility() != View.VISIBLE) {
+            mSplash.setClickable(true);
+            mSplash.setAlpha(0f);
+            mSplash.setVisibility(View.VISIBLE);
+            mSplash.animate().alpha(1f).setDuration(1000);
+            mSplash.findViewById(R.id.play_button_image).setAlpha(1f);
+            mSplash.findViewById(R.id.play_button_text).setAlpha(0f);
+            mSplash.findViewById(R.id.play_button).setEnabled(true);
+            mSplash.findViewById(R.id.play_button).requestFocus();
+        }
+    }
+
+    public void startPlaying() {
+        mPlaying = true;
+
+        t = 0;
+        // there's a sucker born every OBSTACLE_PERIOD
+        mLastPipeTime = getGameTime() - PARAMS.OBSTACLE_PERIOD;
+
+        hideSplash();
+
+        realignPlayers();
+        mTaps = 0;
+
+        final int N = mPlayers.size();
+        MetricsLogger.histogram(getContext(), "egg_mland_players", N);
+        for (int i=0; i<N; i++) {
+            final Player p = mPlayers.get(i);
+            p.setVisibility(View.VISIBLE);
+            p.reset();
+            p.start();
+            p.boost(-1, -1); // start you off flying!
+            p.unboost(); // not forever, though
+        }
+    }
+
+    public void stop() {
+        if (mAnimating) {
+            mAnim.cancel();
+            mAnim = null;
+            mAnimating = false;
+            mPlaying = false;
+            mTimeOfDay = irand(0, SKIES.length - 1); // for next reset
+            mScene = irand(0, SCENE_COUNT);
+            mFrozen = true;
+            for (Player p : mPlayers) {
+                p.die();
+            }
+            postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        mFrozen = false;
+                    }
+                }, 250);
+        }
+    }
+
+    public static final float lerp(float x, float a, float b) {
+        return (b - a) * x + a;
+    }
+
+    public static final float rlerp(float v, float a, float b) {
+        return (v - a) / (b - a);
+    }
+
+    public static final float clamp(float f) {
+        return f < 0f ? 0f : f > 1f ? 1f : f;
+    }
+
+    public static final float frand() {
+        return (float) Math.random();
+    }
+
+    public static final float frand(float a, float b) {
+        return lerp(frand(), a, b);
+    }
+
+    public static final int irand(int a, int b) {
+        return Math.round(frand((float) a, (float) b));
+    }
+
+    public static int pick(int[] l) {
+        return l[irand(0, l.length-1)];
+    }
+
+    private void step(long t_ms, long dt_ms) {
+        t = t_ms / 1000f; // seconds
+        dt = dt_ms / 1000f;
+
+        if (DEBUG) {
+            t *= DEBUG_SPEED_MULTIPLIER;
+            dt *= DEBUG_SPEED_MULTIPLIER;
+        }
+
+        // 1. Move all objects and update bounds
+        final int N = getChildCount();
+        int i = 0;
+        for (; i<N; i++) {
+            final View v = getChildAt(i);
+            if (v instanceof GameView) {
+                ((GameView) v).step(t_ms, dt_ms, t, dt);
+            }
+        }
+
+        if (mPlaying) {
+            int livingPlayers = 0;
+            for (i = 0; i < mPlayers.size(); i++) {
+                final Player p = getPlayer(i);
+
+                if (p.mAlive) {
+                    // 2. Check for altitude
+                    if (p.below(mHeight)) {
+                        if (DEBUG_IDDQD) {
+                            poke(i);
+                            unpoke(i);
+                        } else {
+                            L("player %d hit the floor", i);
+                            thump(i, 80);
+                            p.die();
+                        }
+                    }
+
+                    // 3. Check for obstacles
+                    int maxPassedStem = 0;
+                    for (int j = mObstaclesInPlay.size(); j-- > 0; ) {
+                        final Obstacle ob = mObstaclesInPlay.get(j);
+                        if (ob.intersects(p) && !DEBUG_IDDQD) {
+                            L("player hit an obstacle");
+                            thump(i, 80);
+                            p.die();
+                        } else if (ob.cleared(p)) {
+                            if (ob instanceof Stem) {
+                                maxPassedStem = Math.max(maxPassedStem, ((Stem)ob).id);
+                            }
+                        }
+                    }
+
+                    if (maxPassedStem > p.mScore) {
+                        p.addScore(1);
+                    }
+                }
+
+                if (p.mAlive) livingPlayers++;
+            }
+
+            if (livingPlayers == 0) {
+                stop();
+
+                MetricsLogger.count(getContext(), "egg_mland_taps", mTaps);
+                mTaps = 0;
+                final int playerCount = mPlayers.size();
+                for (int pi=0; pi<playerCount; pi++) {
+                    final Player p = mPlayers.get(pi);
+                    MetricsLogger.histogram(getContext(), "egg_mland_score", p.getScore());
+                }
+            }
+        }
+
+        // 4. Handle edge of screen
+        // Walk backwards to make sure removal is safe
+        while (i-->0) {
+            final View v = getChildAt(i);
+            if (v instanceof Obstacle) {
+                if (v.getTranslationX() + v.getWidth() < 0) {
+                    removeViewAt(i);
+                    mObstaclesInPlay.remove(v);
+                }
+            } else if (v instanceof Scenery) {
+                final Scenery s = (Scenery) v;
+                if (v.getTranslationX() + s.w < 0) {
+                    v.setTranslationX(getWidth());
+                }
+            }
+        }
+
+        // 3. Time for more obstacles!
+        if (mPlaying && (t - mLastPipeTime) > PARAMS.OBSTACLE_PERIOD) {
+            mLastPipeTime = t;
+            mCurrentPipeId ++;
+            final int obstacley =
+                    (int)(frand() * (mHeight - 2*PARAMS.OBSTACLE_MIN - PARAMS.OBSTACLE_GAP)) +
+                    PARAMS.OBSTACLE_MIN;
+
+            final int inset = (PARAMS.OBSTACLE_WIDTH - PARAMS.OBSTACLE_STEM_WIDTH) / 2;
+            final int yinset = PARAMS.OBSTACLE_WIDTH/2;
+
+            final int d1 = irand(0,250);
+            final Obstacle s1 = new Stem(getContext(), obstacley - yinset, false);
+            addView(s1, new LayoutParams(
+                    PARAMS.OBSTACLE_STEM_WIDTH,
+                    (int) s1.h,
+                    Gravity.TOP|Gravity.LEFT));
+            s1.setTranslationX(mWidth+inset);
+            s1.setTranslationY(-s1.h-yinset);
+            s1.setTranslationZ(PARAMS.OBSTACLE_Z*0.75f);
+            s1.animate()
+                    .translationY(0)
+                    .setStartDelay(d1)
+                    .setDuration(250);
+            mObstaclesInPlay.add(s1);
+
+            final Obstacle p1 = new Pop(getContext(), PARAMS.OBSTACLE_WIDTH);
+            addView(p1, new LayoutParams(
+                    PARAMS.OBSTACLE_WIDTH,
+                    PARAMS.OBSTACLE_WIDTH,
+                    Gravity.TOP|Gravity.LEFT));
+            p1.setTranslationX(mWidth);
+            p1.setTranslationY(-PARAMS.OBSTACLE_WIDTH);
+            p1.setTranslationZ(PARAMS.OBSTACLE_Z);
+            p1.setScaleX(0.25f);
+            p1.setScaleY(-0.25f);
+            p1.animate()
+                    .translationY(s1.h-inset)
+                    .scaleX(1f)
+                    .scaleY(-1f)
+                    .setStartDelay(d1)
+                    .setDuration(250);
+            mObstaclesInPlay.add(p1);
+
+            final int d2 = irand(0,250);
+            final Obstacle s2 = new Stem(getContext(),
+                    mHeight - obstacley - PARAMS.OBSTACLE_GAP - yinset,
+                    true);
+            addView(s2, new LayoutParams(
+                    PARAMS.OBSTACLE_STEM_WIDTH,
+                    (int) s2.h,
+                    Gravity.TOP|Gravity.LEFT));
+            s2.setTranslationX(mWidth+inset);
+            s2.setTranslationY(mHeight+yinset);
+            s2.setTranslationZ(PARAMS.OBSTACLE_Z*0.75f);
+            s2.animate()
+                    .translationY(mHeight-s2.h)
+                    .setStartDelay(d2)
+                    .setDuration(400);
+            mObstaclesInPlay.add(s2);
+
+            final Obstacle p2 = new Pop(getContext(), PARAMS.OBSTACLE_WIDTH);
+            addView(p2, new LayoutParams(
+                    PARAMS.OBSTACLE_WIDTH,
+                    PARAMS.OBSTACLE_WIDTH,
+                    Gravity.TOP|Gravity.LEFT));
+            p2.setTranslationX(mWidth);
+            p2.setTranslationY(mHeight);
+            p2.setTranslationZ(PARAMS.OBSTACLE_Z);
+            p2.setScaleX(0.25f);
+            p2.setScaleY(0.25f);
+            p2.animate()
+                    .translationY(mHeight-s2.h-yinset)
+                    .scaleX(1f)
+                    .scaleY(1f)
+                    .setStartDelay(d2)
+                    .setDuration(400);
+            mObstaclesInPlay.add(p2);
+        }
+
+        if (SHOW_TOUCHES || DEBUG_DRAW) invalidate();
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        L("touch: %s", ev);
+        final int actionIndex = ev.getActionIndex();
+        final float x = ev.getX(actionIndex);
+        final float y = ev.getY(actionIndex);
+        int playerIndex = (int) (getNumPlayers() * (x / getWidth()));
+        if (mFlipped) playerIndex = getNumPlayers() - 1 - playerIndex;
+        switch (ev.getActionMasked()) {
+            case MotionEvent.ACTION_DOWN:
+            case MotionEvent.ACTION_POINTER_DOWN:
+                poke(playerIndex, x, y);
+                return true;
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_POINTER_UP:
+                unpoke(playerIndex);
+                return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onTrackballEvent(MotionEvent ev) {
+        L("trackball: %s", ev);
+        switch (ev.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                poke(0);
+                return true;
+            case MotionEvent.ACTION_UP:
+                unpoke(0);
+                return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent ev) {
+        L("keyDown: %d", keyCode);
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_DPAD_UP:
+            case KeyEvent.KEYCODE_SPACE:
+            case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_BUTTON_A:
+                int player = getControllerPlayer(ev.getDeviceId());
+                poke(player);
+                return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onKeyUp(int keyCode, KeyEvent ev) {
+        L("keyDown: %d", keyCode);
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_DPAD_UP:
+            case KeyEvent.KEYCODE_SPACE:
+            case KeyEvent.KEYCODE_ENTER:
+            case KeyEvent.KEYCODE_BUTTON_A:
+                int player = getControllerPlayer(ev.getDeviceId());
+                unpoke(player);
+                return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onGenericMotionEvent (MotionEvent ev) {
+        L("generic: %s", ev);
+        return false;
+    }
+
+    private void poke(int playerIndex) {
+        poke(playerIndex, -1, -1);
+    }
+
+    private void poke(int playerIndex, float x, float y) {
+        L("poke(%d)", playerIndex);
+        if (mFrozen) return;
+        if (!mAnimating) {
+            reset();
+        }
+        if (!mPlaying) {
+            start(true);
+        } else {
+            final Player p = getPlayer(playerIndex);
+            if (p == null) return; // no player for this controller
+            p.boost(x, y);
+            mTaps++;
+            if (DEBUG) {
+                p.dv *= DEBUG_SPEED_MULTIPLIER;
+                p.animate().setDuration((long) (200 / DEBUG_SPEED_MULTIPLIER));
+            }
+        }
+    }
+
+    private void unpoke(int playerIndex) {
+        L("unboost(%d)", playerIndex);
+        if (mFrozen || !mAnimating || !mPlaying) return;
+        final Player p = getPlayer(playerIndex);
+        if (p == null) return; // no player for this controller
+        p.unboost();
+    }
+
+    @Override
+    public void onDraw(Canvas c) {
+        super.onDraw(c);
+
+        if (SHOW_TOUCHES) {
+            for (Player p : mPlayers) {
+                if (p.mTouchX > 0) {
+                    mTouchPaint.setColor(0x80FFFFFF & p.color);
+                    mPlayerTracePaint.setColor(0x80FFFFFF & p.color);
+                    float x1 = p.mTouchX;
+                    float y1 = p.mTouchY;
+                    c.drawCircle(x1, y1, 100, mTouchPaint);
+                    float x2 = p.getX() + p.getPivotX();
+                    float y2 = p.getY() + p.getPivotY();
+                    float angle = PI_2 - (float) Math.atan2(x2-x1, y2-y1);
+                    x1 += 100*Math.cos(angle);
+                    y1 += 100*Math.sin(angle);
+                    c.drawLine(x1, y1, x2, y2, mPlayerTracePaint);
+                }
+            }
+        }
+
+        if (!DEBUG_DRAW) return;
+
+        final Paint pt = new Paint();
+        pt.setColor(0xFFFFFFFF);
+        for (Player p : mPlayers) {
+            final int L = p.corners.length;
+            final int N = L / 2;
+            for (int i = 0; i < N; i++) {
+                final int x = (int) p.corners[i * 2];
+                final int y = (int) p.corners[i * 2 + 1];
+                c.drawCircle(x, y, 4, pt);
+                c.drawLine(x, y,
+                        p.corners[(i * 2 + 2) % L],
+                        p.corners[(i * 2 + 3) % L],
+                        pt);
+            }
+        }
+
+        pt.setStyle(Paint.Style.STROKE);
+        pt.setStrokeWidth(getResources().getDisplayMetrics().density);
+
+        final int M = getChildCount();
+        pt.setColor(0x8000FF00);
+        for (int i=0; i<M; i++) {
+            final View v = getChildAt(i);
+            if (v instanceof Player) continue;
+            if (!(v instanceof GameView)) continue;
+            if (v instanceof Pop) {
+                final Pop pop = (Pop) v;
+                c.drawCircle(pop.cx, pop.cy, pop.r, pt);
+            } else {
+                final Rect r = new Rect();
+                v.getHitRect(r);
+                c.drawRect(r, pt);
+            }
+        }
+
+        pt.setColor(Color.BLACK);
+        final StringBuilder sb = new StringBuilder("obstacles: ");
+        for (Obstacle ob : mObstaclesInPlay) {
+            sb.append(ob.hitRect.toShortString());
+            sb.append(" ");
+        }
+        pt.setTextSize(20f);
+        c.drawText(sb.toString(), 20, 100, pt);
+    }
+
+    static final Rect sTmpRect = new Rect();
+
+    private interface GameView {
+        public void step(long t_ms, long dt_ms, float t, float dt);
+    }
+
+    private static class Player extends ImageView implements GameView {
+        public float dv;
+        public int color;
+        private MLand mLand;
+        private boolean mBoosting;
+        private float mTouchX = -1, mTouchY = -1;
+        private boolean mAlive;
+        private int mScore;
+        private TextView mScoreField;
+
+        private final int[] sColors = new int[] {
+                //0xFF78C557,
+                0xFFDB4437,
+                0xFF3B78E7,
+                0xFFF4B400,
+                0xFF0F9D58,
+                0xFF7B1880,
+                0xFF9E9E9E,
+        };
+        static int sNextColor = 0;
+
+        private final float[] sHull = new float[] {
+                0.3f,  0f,    // left antenna
+                0.7f,  0f,    // right antenna
+                0.92f, 0.33f, // off the right shoulder of Orion
+                0.92f, 0.75f, // right hand (our right, not his right)
+                0.6f,  1f,    // right foot
+                0.4f,  1f,    // left foot BLUE!
+                0.08f, 0.75f, // sinistram
+                0.08f, 0.33f, // cold shoulder
+        };
+        public final float[] corners = new float[sHull.length];
+
+        public static Player create(MLand land) {
+            final Player p = new Player(land.getContext());
+            p.mLand = land;
+            p.reset();
+            p.setVisibility(View.INVISIBLE);
+            land.addView(p, new LayoutParams(PARAMS.PLAYER_SIZE, PARAMS.PLAYER_SIZE));
+            return p;
+        }
+
+        private void setScore(int score) {
+            mScore = score;
+            if (mScoreField != null) {
+                mScoreField.setText(DEBUG_IDDQD ? "??" : String.valueOf(score));
+            }
+        }
+
+        public int getScore() {
+            return mScore;
+        }
+
+        private void addScore(int incr) {
+            setScore(mScore + incr);
+        }
+
+        public void setScoreField(TextView tv) {
+            mScoreField = tv;
+            if (tv != null) {
+                setScore(mScore); // reapply
+                //mScoreField.setBackgroundResource(R.drawable.scorecard);
+                mScoreField.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
+                mScoreField.setTextColor(luma(color) > 0.7f ? 0xFF000000 : 0xFFFFFFFF);
+            }
+        }
+
+        public void reset() {
+            //setX(mLand.mWidth / 2);
+            setY(mLand.mHeight / 2
+                    + (int)(Math.random() * PARAMS.PLAYER_SIZE)
+                    - PARAMS.PLAYER_SIZE / 2);
+            setScore(0);
+            setScoreField(mScoreField); // refresh color
+            mBoosting = false;
+            dv = 0;
+        }
+
+        public Player(Context context) {
+            super(context);
+
+            setBackgroundResource(R.drawable.android);
+            getBackground().setTintMode(PorterDuff.Mode.SRC_ATOP);
+            color = sColors[(sNextColor++%sColors.length)];
+            getBackground().setTint(color);
+            setOutlineProvider(new ViewOutlineProvider() {
+                @Override
+                public void getOutline(View view, Outline outline) {
+                    final int w = view.getWidth();
+                    final int h = view.getHeight();
+                    final int ix = (int) (w * 0.3f);
+                    final int iy = (int) (h * 0.2f);
+                    outline.setRect(ix, iy, w - ix, h - iy);
+                }
+            });
+        }
+
+        public void prepareCheckIntersections() {
+            final int inset = (PARAMS.PLAYER_SIZE - PARAMS.PLAYER_HIT_SIZE)/2;
+            final int scale = PARAMS.PLAYER_HIT_SIZE;
+            final int N = sHull.length/2;
+            for (int i=0; i<N; i++) {
+                corners[i*2]   = scale * sHull[i*2]   + inset;
+                corners[i*2+1] = scale * sHull[i*2+1] + inset;
+            }
+            final Matrix m = getMatrix();
+            m.mapPoints(corners);
+        }
+
+        public boolean below(int h) {
+            final int N = corners.length/2;
+            for (int i=0; i<N; i++) {
+                final int y = (int) corners[i*2+1];
+                if (y >= h) return true;
+            }
+            return false;
+        }
+
+        public void step(long t_ms, long dt_ms, float t, float dt) {
+            if (!mAlive) {
+                // float away with the garbage
+                setTranslationX(getTranslationX()-PARAMS.TRANSLATION_PER_SEC*dt);
+                return;
+            }
+
+            if (mBoosting) {
+                dv = -PARAMS.BOOST_DV;
+            } else {
+                dv += PARAMS.G;
+            }
+            if (dv < -PARAMS.MAX_V) dv = -PARAMS.MAX_V;
+            else if (dv > PARAMS.MAX_V) dv = PARAMS.MAX_V;
+
+            final float y = getTranslationY() + dv * dt;
+            setTranslationY(y < 0 ? 0 : y);
+            setRotation(
+                    90 + lerp(clamp(rlerp(dv, PARAMS.MAX_V, -1 * PARAMS.MAX_V)), 90, -90));
+
+            prepareCheckIntersections();
+        }
+
+        public void boost(float x, float y) {
+            mTouchX = x;
+            mTouchY = y;
+            boost();
+        }
+
+        public void boost() {
+            mBoosting = true;
+            dv = -PARAMS.BOOST_DV;
+
+            animate().cancel();
+            animate()
+                    .scaleX(1.25f)
+                    .scaleY(1.25f)
+                    .translationZ(PARAMS.PLAYER_Z_BOOST)
+                    .setDuration(100);
+            setScaleX(1.25f);
+            setScaleY(1.25f);
+        }
+
+        public void unboost() {
+            mBoosting = false;
+            mTouchX = mTouchY = -1;
+
+            animate().cancel();
+            animate()
+                    .scaleX(1f)
+                    .scaleY(1f)
+                    .translationZ(PARAMS.PLAYER_Z)
+                    .setDuration(200);
+        }
+
+        public void die() {
+            mAlive = false;
+            if (mScoreField != null) {
+                //mScoreField.setTextColor(0xFFFFFFFF);
+                //mScoreField.getBackground().setColorFilter(0xFF666666, PorterDuff.Mode.SRC_ATOP);
+                //mScoreField.setBackgroundResource(R.drawable.scorecard_gameover);
+            }
+        }
+
+        public void start() {
+            mAlive = true;
+        }
+    }
+
+    private class Obstacle extends View implements GameView {
+        public float h;
+
+        public final Rect hitRect = new Rect();
+
+        public Obstacle(Context context, float h) {
+            super(context);
+            setBackgroundColor(0xFFFF0000);
+            this.h = h;
+        }
+
+        public boolean intersects(Player p) {
+            final int N = p.corners.length/2;
+            for (int i=0; i<N; i++) {
+                final int x = (int) p.corners[i*2];
+                final int y = (int) p.corners[i*2+1];
+                if (hitRect.contains(x, y)) return true;
+            }
+            return false;
+        }
+
+        public boolean cleared(Player p) {
+            final int N = p.corners.length/2;
+            for (int i=0; i<N; i++) {
+                final int x = (int) p.corners[i*2];
+                if (hitRect.right >= x) return false;
+            }
+            return true;
+        }
+
+        @Override
+        public void step(long t_ms, long dt_ms, float t, float dt) {
+            setTranslationX(getTranslationX()-PARAMS.TRANSLATION_PER_SEC*dt);
+            getHitRect(hitRect);
+        }
+    }
+
+    static final int[] ANTENNAE = new int[] {R.drawable.mm_antennae, R.drawable.mm_antennae2};
+    static final int[] EYES = new int[] {R.drawable.mm_eyes, R.drawable.mm_eyes2};
+    static final int[] MOUTHS = new int[] {R.drawable.mm_mouth1, R.drawable.mm_mouth2,
+            R.drawable.mm_mouth3, R.drawable.mm_mouth4};
+    private class Pop extends Obstacle {
+        int mRotate;
+        int cx, cy, r;
+        // The marshmallow illustration and hitbox is 2/3 the size of its container.
+        Drawable antenna, eyes, mouth;
+
+
+        public Pop(Context context, float h) {
+            super(context, h);
+            setBackgroundResource(R.drawable.mm_head);
+            antenna = context.getDrawable(pick(ANTENNAE));
+            if (frand() > 0.5f) {
+                eyes = context.getDrawable(pick(EYES));
+                if (frand() > 0.8f) {
+                    mouth = context.getDrawable(pick(MOUTHS));
+                }
+            }
+            setOutlineProvider(new ViewOutlineProvider() {
+                @Override
+                public void getOutline(View view, Outline outline) {
+                    final int pad = (int) (getWidth() * 1f/6);
+                    outline.setOval(pad, pad, getWidth()-pad, getHeight()-pad);
+                }
+            });
+        }
+
+        public boolean intersects(Player p) {
+            final int N = p.corners.length/2;
+            for (int i=0; i<N; i++) {
+                final int x = (int) p.corners[i*2];
+                final int y = (int) p.corners[i*2+1];
+                if (Math.hypot(x-cx, y-cy) <= r) return true;
+            }
+            return false;
+        }
+
+        @Override
+        public void step(long t_ms, long dt_ms, float t, float dt) {
+            super.step(t_ms, dt_ms, t, dt);
+            if (mRotate != 0) {
+                setRotation(getRotation() + dt * 45 * mRotate);
+            }
+
+            cx = (hitRect.left + hitRect.right)/2;
+            cy = (hitRect.top + hitRect.bottom)/2;
+            r = getWidth() / 3; // see above re 2/3 container size
+        }
+
+        @Override
+        public void onDraw(Canvas c) {
+            super.onDraw(c);
+            if (antenna != null) {
+                antenna.setBounds(0, 0, c.getWidth(), c.getHeight());
+                antenna.draw(c);
+            }
+            if (eyes != null) {
+                eyes.setBounds(0, 0, c.getWidth(), c.getHeight());
+                eyes.draw(c);
+            }
+            if (mouth != null) {
+                mouth.setBounds(0, 0, c.getWidth(), c.getHeight());
+                mouth.draw(c);
+            }
+        }
+    }
+
+    private class Stem extends Obstacle {
+        Paint mPaint = new Paint();
+        Path mShadow = new Path();
+        GradientDrawable mGradient = new GradientDrawable();
+        boolean mDrawShadow;
+        Path mJandystripe;
+        Paint mPaint2;
+        int id; // use this to track which pipes have been cleared
+
+        public Stem(Context context, float h, boolean drawShadow) {
+            super(context, h);
+            id = mCurrentPipeId;
+
+            mDrawShadow = drawShadow;
+            setBackground(null);
+            mGradient.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
+            mPaint.setColor(0xFF000000);
+            mPaint.setColorFilter(new PorterDuffColorFilter(0x22000000, PorterDuff.Mode.MULTIPLY));
+
+            if (frand() < 0.01f) {
+                mGradient.setColors(new int[]{0xFFFFFFFF, 0xFFDDDDDD});
+                mJandystripe = new Path();
+                mPaint2 = new Paint();
+                mPaint2.setColor(0xFFFF0000);
+                mPaint2.setColorFilter(new PorterDuffColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY));
+            } else {
+                //mPaint.setColor(0xFFA1887F);
+                mGradient.setColors(new int[]{0xFFBCAAA4, 0xFFA1887F});
+            }
+        }
+
+        @Override
+        public void onAttachedToWindow() {
+            super.onAttachedToWindow();
+            setWillNotDraw(false);
+            setOutlineProvider(new ViewOutlineProvider() {
+                @Override
+                public void getOutline(View view, Outline outline) {
+                    outline.setRect(0, 0, getWidth(), getHeight());
+                }
+            });
+        }
+        @Override
+        public void onDraw(Canvas c) {
+            final int w = c.getWidth();
+            final int h = c.getHeight();
+            mGradient.setGradientCenter(w * 0.75f, 0);
+            mGradient.setBounds(0, 0, w, h);
+            mGradient.draw(c);
+
+            if (mJandystripe != null) {
+                mJandystripe.reset();
+                mJandystripe.moveTo(0, w);
+                mJandystripe.lineTo(w, 0);
+                mJandystripe.lineTo(w, 2 * w);
+                mJandystripe.lineTo(0, 3 * w);
+                mJandystripe.close();
+                for (int y=0; y<h; y+=4*w) {
+                    c.drawPath(mJandystripe, mPaint2);
+                    mJandystripe.offset(0, 4 * w);
+                }
+            }
+
+            if (!mDrawShadow) return;
+            mShadow.reset();
+            mShadow.moveTo(0, 0);
+            mShadow.lineTo(w, 0);
+            mShadow.lineTo(w, PARAMS.OBSTACLE_WIDTH * 0.4f + w*1.5f);
+            mShadow.lineTo(0, PARAMS.OBSTACLE_WIDTH * 0.4f);
+            mShadow.close();
+            c.drawPath(mShadow, mPaint);
+        }
+    }
+
+    private class Scenery extends FrameLayout implements GameView {
+        public float z;
+        public float v;
+        public int h, w;
+        public Scenery(Context context) {
+            super(context);
+        }
+
+        @Override
+        public void step(long t_ms, long dt_ms, float t, float dt) {
+            setTranslationX(getTranslationX() - PARAMS.TRANSLATION_PER_SEC * dt * v);
+        }
+    }
+
+    private class Building extends Scenery {
+        public Building(Context context) {
+            super(context);
+
+            w = irand(PARAMS.BUILDING_WIDTH_MIN, PARAMS.BUILDING_WIDTH_MAX);
+            h = 0; // will be setup later, along with z
+        }
+    }
+
+    static final int[] CACTI = { R.drawable.cactus1, R.drawable.cactus2, R.drawable.cactus3 };
+    private class Cactus extends Building {
+        public Cactus(Context context) {
+            super(context);
+
+            setBackgroundResource(pick(CACTI));
+            w = h = irand(PARAMS.BUILDING_WIDTH_MAX / 4, PARAMS.BUILDING_WIDTH_MAX / 2);
+        }
+    }
+
+    static final int[] MOUNTAINS = {
+            R.drawable.mountain1, R.drawable.mountain2, R.drawable.mountain3 };
+    private class Mountain extends Building {
+        public Mountain(Context context) {
+            super(context);
+
+            setBackgroundResource(pick(MOUNTAINS));
+            w = h = irand(PARAMS.BUILDING_WIDTH_MAX / 2, PARAMS.BUILDING_WIDTH_MAX);
+            z = 0;
+        }
+    }
+    private class Cloud extends Scenery {
+        public Cloud(Context context) {
+            super(context);
+            setBackgroundResource(frand() < 0.01f ? R.drawable.cloud_off : R.drawable.cloud);
+            getBackground().setAlpha(0x40);
+            w = h = irand(PARAMS.CLOUD_SIZE_MIN, PARAMS.CLOUD_SIZE_MAX);
+            z = 0;
+            v = frand(0.15f,0.5f);
+        }
+    }
+
+    private class Star extends Scenery {
+        public Star(Context context) {
+            super(context);
+            setBackgroundResource(R.drawable.star);
+            w = h = irand(PARAMS.STAR_SIZE_MIN, PARAMS.STAR_SIZE_MAX);
+            v = z = 0;
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/egg/MLandActivity.java b/packages/SystemUI/src/com/android/systemui/egg/MLandActivity.java
new file mode 100644
index 0000000..cdda45f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/egg/MLandActivity.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2015 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.systemui.egg;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.systemui.R;
+
+public class MLandActivity extends Activity {
+    MLand mLand;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.mland);
+        mLand = (MLand) findViewById(R.id.world);
+        mLand.setScoreFieldHolder((ViewGroup) findViewById(R.id.scores));
+        final View welcome = findViewById(R.id.welcome);
+        mLand.setSplash(welcome);
+        final int numControllers = mLand.getGameControllers().size();
+        if (numControllers > 0) {
+            mLand.setupPlayers(numControllers);
+        }
+    }
+
+    public void updateSplashPlayers() {
+        final int N = mLand.getNumPlayers();
+        final View minus = findViewById(R.id.player_minus_button);
+        final View plus = findViewById(R.id.player_plus_button);
+        if (N == 1) {
+            minus.setVisibility(View.INVISIBLE);
+            plus.setVisibility(View.VISIBLE);
+            plus.requestFocus();
+        } else if (N == mLand.MAX_PLAYERS) {
+            minus.setVisibility(View.VISIBLE);
+            plus.setVisibility(View.INVISIBLE);
+            minus.requestFocus();
+        } else {
+            minus.setVisibility(View.VISIBLE);
+            plus.setVisibility(View.VISIBLE);
+        }
+    }
+
+    @Override
+    public void onPause() {
+        mLand.stop();
+        super.onPause();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        mLand.onAttachedToWindow(); // resets and starts animation
+        updateSplashPlayers();
+        mLand.showSplash();
+    }
+
+    public void playerMinus(View v) {
+        mLand.removePlayer();
+        updateSplashPlayers();
+    }
+
+    public void playerPlus(View v) {
+        mLand.addPlayer();
+        updateSplashPlayers();
+    }
+
+    public void startButtonPressed(View v) {
+        findViewById(R.id.player_minus_button).setVisibility(View.INVISIBLE);
+        findViewById(R.id.player_plus_button).setVisibility(View.INVISIBLE);
+        mLand.start(true);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/egg/ShruggyActivity.java b/packages/SystemUI/src/com/android/systemui/egg/ShruggyActivity.java
deleted file mode 100644
index 7459957..0000000
--- a/packages/SystemUI/src/com/android/systemui/egg/ShruggyActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2015 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.systemui.egg;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Log;
-import android.widget.Toast;
-import com.android.systemui.R;
-
-public class ShruggyActivity extends Activity {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Toast.makeText(this, getString(R.string.regrettable_lack_of_easter_egg),
-                Toast.LENGTH_SHORT).show();
-        Log.v("SystemUI", "Hey, it's just a preview; what did you expect?");
-        finish();
-    }
-}