diff --git a/res/anim/disappear.xml b/res/anim/disappear.xml
deleted file mode 100644
index b1fd5e3..0000000
--- a/res/anim/disappear.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-
-	<alpha
-		android:interpolator="@android:anim/decelerate_interpolator"
-		android:fromAlpha="1.0" android:toAlpha="0.0"
-		android:duration="400"
-	/>
-</set>
\ No newline at end of file
diff --git a/res/anim/grow_from_bottom.xml b/res/anim/grow_from_bottom.xml
deleted file mode 100644
index d2a371d..0000000
--- a/res/anim/grow_from_bottom.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-	<scale
-		android:fromXScale="0.3" android:toXScale="1.0"
-		android:fromYScale="0.3" android:toYScale="1.0"
-		android:pivotX="50%" android:pivotY="100%"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-	<alpha
-		android:interpolator="@android:anim/decelerate_interpolator"
-		android:fromAlpha="0.0" android:toAlpha="1.0"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-</set>
diff --git a/res/anim/grow_from_bottomleft_to_topright.xml b/res/anim/grow_from_bottomleft_to_topright.xml
deleted file mode 100644
index a4bf4ea..0000000
--- a/res/anim/grow_from_bottomleft_to_topright.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-	<scale
-		android:fromXScale="0.3" android:toXScale="1.0"
-		android:fromYScale="0.3" android:toYScale="1.0"
-		android:pivotX="0%" android:pivotY="50%"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-	<alpha
-		android:interpolator="@android:anim/decelerate_interpolator"
-		android:fromAlpha="0.0" android:toAlpha="1.0"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-</set>
\ No newline at end of file
diff --git a/res/anim/grow_from_bottomright_to_topleft.xml b/res/anim/grow_from_bottomright_to_topleft.xml
deleted file mode 100644
index 3446623..0000000
--- a/res/anim/grow_from_bottomright_to_topleft.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-	<scale
-		android:fromXScale="0.3" android:toXScale="1.0"
-		android:fromYScale="0.3" android:toYScale="1.0"
-		android:pivotX="100%" android:pivotY="50%"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-	<alpha
-		android:interpolator="@android:anim/decelerate_interpolator"
-		android:fromAlpha="0.0" android:toAlpha="1.0"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-</set>
\ No newline at end of file
diff --git a/res/anim/pump_bottom.xml b/res/anim/pump_bottom.xml
deleted file mode 100644
index f681951..0000000
--- a/res/anim/pump_bottom.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-	<scale
-		android:fromXScale="1.1" android:toXScale="1.0"
-		android:fromYScale="1.1" android:toYScale="1.0"
-		android:pivotX="50%" android:pivotY="100%"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-	<alpha
-		android:interpolator="@android:anim/decelerate_interpolator"
-		android:fromAlpha="0.0" android:toAlpha="1.0"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-</set>
diff --git a/res/anim/shrink_from_top.xml b/res/anim/shrink_from_top.xml
deleted file mode 100644
index 89cd8f4..0000000
--- a/res/anim/shrink_from_top.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-	<scale
-		android:fromXScale="1.0" android:toXScale="0.3"
-		android:fromYScale="1.0" android:toYScale="0.3"
-		android:pivotX="50%" android:pivotY="100%"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-	<alpha
-		android:interpolator="@android:anim/accelerate_interpolator"
-		android:fromAlpha="1.0" android:toAlpha="0.0"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-</set>
diff --git a/res/anim/shrink_from_topleft_to_bottomright.xml b/res/anim/shrink_from_topleft_to_bottomright.xml
deleted file mode 100644
index 1341728..0000000
--- a/res/anim/shrink_from_topleft_to_bottomright.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-	<scale
-		android:fromXScale="1.0" android:toXScale="0.3"
-		android:fromYScale="1.0" android:toYScale="0.3"
-		android:pivotX="100%" android:pivotY="100%"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-	<alpha
-		android:interpolator="@android:anim/accelerate_interpolator"
-		android:fromAlpha="1.0" android:toAlpha="0.0"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-</set>
\ No newline at end of file
diff --git a/res/anim/shrink_from_topright_to_bottomleft.xml b/res/anim/shrink_from_topright_to_bottomleft.xml
deleted file mode 100644
index d4064fc..0000000
--- a/res/anim/shrink_from_topright_to_bottomleft.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-	<scale
-		android:fromXScale="1.0" android:toXScale="0.3"
-		android:fromYScale="1.0" android:toYScale="0.3"
-		android:pivotX="0%" android:pivotY="100%"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-	<alpha
-		android:interpolator="@android:anim/accelerate_interpolator"
-		android:fromAlpha="1.0" android:toAlpha="0.0"
-		android:duration="@android:integer/config_shortAnimTime"
-	/>
-</set>
diff --git a/res/drawable-hdpi/arrow_down.png b/res/drawable-hdpi/arrow_down.png
deleted file mode 100644
index 1c57f8f..0000000
--- a/res/drawable-hdpi/arrow_down.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/arrow_up.png b/res/drawable-hdpi/arrow_up.png
deleted file mode 100644
index 523a6ad..0000000
--- a/res/drawable-hdpi/arrow_up.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_sysbar_home_carmode_pixel.png b/res/drawable-xxxhdpi/ic_sysbar_home_carmode_pixel.png
deleted file mode 100644
index 60da8e4..0000000
--- a/res/drawable-xxxhdpi/ic_sysbar_home_carmode_pixel.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_sysbar_home_pixel.png b/res/drawable-xxxhdpi/ic_sysbar_home_pixel.png
deleted file mode 100644
index 45ac145..0000000
--- a/res/drawable-xxxhdpi/ic_sysbar_home_pixel.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/action_item_btn.xml b/res/drawable/action_item_btn.xml
deleted file mode 100644
index 3057c40..0000000
--- a/res/drawable/action_item_btn.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:dither="true">
-
-    <item
-        android:state_window_focused="false"
-        android:drawable="@android:color/transparent" />
-    <item
-        android:state_pressed="true"
-        android:drawable="@drawable/action_item_selected"/>
-    <item
-        android:state_focused="true"
-        android:drawable="@drawable/action_item_selected"/>
-    <item
-        android:drawable="@android:color/transparent"/>
-
-</selector>
diff --git a/res/drawable/action_item_selected.xml b/res/drawable/action_item_selected.xml
deleted file mode 100644
index 249e7b3..0000000
--- a/res/drawable/action_item_selected.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="#267a7a7a" android:pathData="M0,0H24V24H0" />
-</vector>
diff --git a/res/drawable/edit_mode.xml b/res/drawable/edit_mode.xml
deleted file mode 100644
index f80aa6e..0000000
--- a/res/drawable/edit_mode.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="50.000000dp"
-    android:height="50.000000dp"
-    android:viewportWidth="512.000000"
-    android:viewportHeight="512.000000">
-
-    <group
-        android:translateY="512.000000"
-        android:scaleX="0.100000"
-        android:scaleY="-0.100000">
-        <path
-            android:fillColor="@*android:color/accent_device_default_light"
-            android:strokeWidth="1"
-            android:pathData="M2235 5045 c-278 -36 -525 -111 -780 -235 -240 -117 -452 -268 -648 -459 -407 -397
--664 -917 -733 -1483 -20 -165 -15 -540 10 -691 166 -1024 930 -1833 1942 -2056
-310 -69 748 -69 1058 0 296 65 588 187 831 346 541 356 917 884 1069 1507 45 183
-58 289 63 531 8 365 -29 601 -149 935 -74 208 -235 492 -388 685 -90 114 -258 284
--375 378 -371 300 -803 484 -1275 543 -141 17 -486 17 -625 -1z" />
-        <path
-            android:fillColor="@color/edit_mode_check_mark_color"
-            android:strokeWidth="1"
-            android:pathData="M3303 3663 c-44 -54 -786 -1016 -1033 -1340 -47 -62 -89 -112 -93 -112 -5 -1 -117
-104 -249 232 -131 127 -248 236 -258 241 -10 4 -24 4 -32 0 -8 -5 -78 -76 -156
--159 -104 -110 -142 -157 -142 -175 0 -20 87 -109 423 -436 233 -226 434 -417 447
--424 20 -11 26 -9 55 21 27 27 1034 1329 1372 1773 84 110 93 130 71 158 -26 33
--332 268 -349 268 -9 0 -35 -21 -56 -47z" />
-    </group>
-</vector>
diff --git a/res/drawable/ic_assistant_sound_search.xml b/res/drawable/ic_assistant_sound_search.xml
deleted file mode 100644
index db11d6c..0000000
--- a/res/drawable/ic_assistant_sound_search.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2018 The Dirty Unicorns 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="30.0dp"
-    android:height="30.0dp"
-    android:viewportWidth="96.0"
-    android:viewportHeight="96.0">
-    <path
-        android:fillColor="@color/icon_color_sound_search"
-        android:pathData="m 47.999997,18.329373 h 23.733698 v 11.866848 h -17.79676 v 32.639091 c 0,8.188699 -6.646618,14.835319 -14.835313,14.835314 -8.188698,0 -14.835315,-6.646615 -14.835317,-14.835314 2e-6,-8.188697 6.64662,-14.835313 14.835317,-14.835313 3.382285,0 6.406168,1.12578 8.898378,3.024609 z"/>
-</vector>
diff --git a/res/drawable/ic_assistant_sound_search_dark.xml b/res/drawable/ic_assistant_sound_search_dark.xml
deleted file mode 100644
index 29ab440..0000000
--- a/res/drawable/ic_assistant_sound_search_dark.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2018 The Dirty Unicorns 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="30.0dp"
-    android:height="30.0dp"
-    android:viewportWidth="96.0"
-    android:viewportHeight="96.0">
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="m 47.999997,18.329373 h 23.733698 v 11.866848 h -17.79676 v 32.639091 c 0,8.188699 -6.646618,14.835319 -14.835313,14.835314 -8.188698,0 -14.835315,-6.646615 -14.835317,-14.835314 2e-6,-8.188697 6.64662,-14.835313 14.835317,-14.835313 3.382285,0 6.406168,1.12578 8.898378,3.024609 z"/>
-</vector>
diff --git a/res/drawable/ic_eos_fling.xml b/res/drawable/ic_eos_fling.xml
deleted file mode 100644
index 35bcdb8..0000000
--- a/res/drawable/ic_eos_fling.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="36dp"
-    android:height="36dp"
-    android:viewportWidth="36"
-    android:viewportHeight="36">
-
-    <path
-        android:fillColor="#ffffff"
-        android:pathData="m 18.000001,24.339682 c 3.501309,0 6.339682,-2.838372 6.339682,-6.339683 0,-3.501309 -2.838373,-6.339682 -6.339682,-6.339682 -3.501311,0 -6.339683,2.838373 -6.339683,6.339682 0,3.501311 2.838372,6.339683 6.339683,6.339683 z M 18,29.384397 C 11.712571,29.384397 6.6156025,24.287429 6.6156025,18 6.6156025,11.712573 11.712571,6.6156032 18,6.6156032 c 6.287429,0 11.384397,5.0969678 11.384397,11.3843968 0,6.287429 -5.096968,11.384397 -11.384397,11.384397 z m 0,-3.252685 v 0 c 4.49102,0 8.131712,-3.640691 8.131712,-8.131712 0,-4.49102 -3.640692,-8.1317116 -8.131712,-8.1317116 -4.491021,0 -8.1317115,3.6406906 -8.1317115,8.1317116 0,4.491021 3.6406905,8.131712 8.1317115,8.131712 z" />
-
-</vector>
diff --git a/res/drawable/ic_eos_fling_dark.xml b/res/drawable/ic_eos_fling_dark.xml
deleted file mode 100644
index 61a1855..0000000
--- a/res/drawable/ic_eos_fling_dark.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="36dp"
-    android:height="36dp"
-    android:viewportWidth="36"
-    android:viewportHeight="36">
-
-    <path
-        android:fillColor="#000000"
-        android:pathData="m 18.000001,24.339682 c 3.501309,0 6.339682,-2.838372 6.339682,-6.339683 0,-3.501309 -2.838373,-6.339682 -6.339682,-6.339682 -3.501311,0 -6.339683,2.838373 -6.339683,6.339682 0,3.501311 2.838372,6.339683 6.339683,6.339683 z M 18,29.384397 C 11.712571,29.384397 6.6156025,24.287429 6.6156025,18 6.6156025,11.712573 11.712571,6.6156032 18,6.6156032 c 6.287429,0 11.384397,5.0969678 11.384397,11.3843968 0,6.287429 -5.096968,11.384397 -11.384397,11.384397 z m 0,-3.252685 v 0 c 4.49102,0 8.131712,-3.640691 8.131712,-8.131712 0,-4.49102 -3.640692,-8.1317116 -8.131712,-8.1317116 -4.491021,0 -8.1317115,3.6406906 -8.1317115,8.1317116 0,4.491021 3.6406905,8.131712 8.1317115,8.131712 z" />
-
-</vector>
diff --git a/res/drawable/ic_eos_fling_land.xml b/res/drawable/ic_eos_fling_land.xml
deleted file mode 100644
index b3e0258..0000000
--- a/res/drawable/ic_eos_fling_land.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="36dp"
-    android:height="36dp"
-    android:viewportWidth="36"
-    android:viewportHeight="36">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="m 18.000001,24.339682 c 3.501309,0 6.339682,-2.838372 6.339682,-6.339683 0,-3.501309 -2.838373,-6.339682 -6.339682,-6.339682 -3.501311,0 -6.339683,2.838373 -6.339683,6.339682 0,3.501311 2.838372,6.339683 6.339683,6.339683 z M 18,29.384397 C 11.712571,29.384397 6.6156025,24.287429 6.6156025,18 6.6156025,11.712573 11.712571,6.6156032 18,6.6156032 c 6.287429,0 11.384397,5.0969678 11.384397,11.3843968 0,6.287429 -5.096968,11.384397 -11.384397,11.384397 z m 0,-3.252685 v 0 c 4.49102,0 8.131712,-3.640691 8.131712,-8.131712 0,-4.49102 -3.640692,-8.1317116 -8.131712,-8.1317116 -4.491021,0 -8.1317115,3.6406906 -8.1317115,8.1317116 0,4.491021 3.6406905,8.131712 8.1317115,8.131712 z" />
-
-</vector>
diff --git a/res/drawable/ic_eos_fling_land_dark.xml b/res/drawable/ic_eos_fling_land_dark.xml
deleted file mode 100644
index b3e0258..0000000
--- a/res/drawable/ic_eos_fling_land_dark.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="36dp"
-    android:height="36dp"
-    android:viewportWidth="36"
-    android:viewportHeight="36">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="m 18.000001,24.339682 c 3.501309,0 6.339682,-2.838372 6.339682,-6.339683 0,-3.501309 -2.838373,-6.339682 -6.339682,-6.339682 -3.501311,0 -6.339683,2.838373 -6.339683,6.339682 0,3.501311 2.838372,6.339683 6.339683,6.339683 z M 18,29.384397 C 11.712571,29.384397 6.6156025,24.287429 6.6156025,18 6.6156025,11.712573 11.712571,6.6156032 18,6.6156032 c 6.287429,0 11.384397,5.0969678 11.384397,11.3843968 0,6.287429 -5.096968,11.384397 -11.384397,11.384397 z m 0,-3.252685 v 0 c 4.49102,0 8.131712,-3.640691 8.131712,-8.131712 0,-4.49102 -3.640692,-8.1317116 -8.131712,-8.1317116 -4.491021,0 -8.1317115,3.6406906 -8.1317115,8.1317116 0,4.491021 3.6406905,8.131712 8.1317115,8.131712 z" />
-
-</vector>
diff --git a/res/drawable/ic_ime_switcher_smartbar.xml b/res/drawable/ic_ime_switcher_smartbar.xml
deleted file mode 100644
index 2e993fd..0000000
--- a/res/drawable/ic_ime_switcher_smartbar.xml
+++ /dev/null
@@ -1,25 +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
-  -->
-
-<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="M20.000000,5.000000L4.000000,5.000000C2.900000,5.000000 2.000000,5.900000 2.000000,7.000000l0.000000,10.000000c0.000000,1.100000 0.900000,2.000000 2.000000,2.000000l16.000000,0.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000L22.000000,7.000000C22.000000,5.900000 21.100000,5.000000 20.000000,5.000000zM11.000000,8.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,8.000000zM11.000000,11.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,11.000000zM8.000000,8.000000l2.000000,0.000000l0.000000,2.000000L8.000000,10.000000L8.000000,8.000000zM8.000000,11.000000l2.000000,0.000000l0.000000,2.000000L8.000000,13.000000L8.000000,11.000000zM7.000000,13.000000L5.000000,13.000000l0.000000,-2.000000l2.000000,0.000000L7.000000,13.000000zM7.000000,10.000000L5.000000,10.000000L5.000000,8.000000l2.000000,0.000000L7.000000,10.000000zM16.000000,17.000000L8.000000,17.000000l0.000000,-2.000000l8.000000,0.000000L16.000000,17.000000zM16.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L16.000000,13.000000zM16.000000,10.000000l-2.000000,0.000000L14.000000,8.000000l2.000000,0.000000L16.000000,10.000000zM19.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L19.000000,13.000000zM19.000000,10.000000l-2.000000,0.000000L17.000000,8.000000l2.000000,0.000000L19.000000,10.000000z"
-        android:fillColor="@color/icon_color_ime_switcher"/>
-</vector>
diff --git a/res/drawable/ic_ime_switcher_smartbar_dark.xml b/res/drawable/ic_ime_switcher_smartbar_dark.xml
deleted file mode 100644
index 3610600..0000000
--- a/res/drawable/ic_ime_switcher_smartbar_dark.xml
+++ /dev/null
@@ -1,25 +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
-  -->
-
-<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="M20.000000,5.000000L4.000000,5.000000C2.900000,5.000000 2.000000,5.900000 2.000000,7.000000l0.000000,10.000000c0.000000,1.100000 0.900000,2.000000 2.000000,2.000000l16.000000,0.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000L22.000000,7.000000C22.000000,5.900000 21.100000,5.000000 20.000000,5.000000zM11.000000,8.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,8.000000zM11.000000,11.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000L11.000000,11.000000zM8.000000,8.000000l2.000000,0.000000l0.000000,2.000000L8.000000,10.000000L8.000000,8.000000zM8.000000,11.000000l2.000000,0.000000l0.000000,2.000000L8.000000,13.000000L8.000000,11.000000zM7.000000,13.000000L5.000000,13.000000l0.000000,-2.000000l2.000000,0.000000L7.000000,13.000000zM7.000000,10.000000L5.000000,10.000000L5.000000,8.000000l2.000000,0.000000L7.000000,10.000000zM16.000000,17.000000L8.000000,17.000000l0.000000,-2.000000l8.000000,0.000000L16.000000,17.000000zM16.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L16.000000,13.000000zM16.000000,10.000000l-2.000000,0.000000L14.000000,8.000000l2.000000,0.000000L16.000000,10.000000zM19.000000,13.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L19.000000,13.000000zM19.000000,10.000000l-2.000000,0.000000L17.000000,8.000000l2.000000,0.000000L19.000000,10.000000z"
-        android:fillColor="@color/icon_color_dark"/>
-</vector>
diff --git a/res/drawable/ic_skip_next.xml b/res/drawable/ic_skip_next.xml
deleted file mode 100644
index b5c2025..0000000
--- a/res/drawable/ic_skip_next.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="22dp"
-    android:height="22dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z" />
-</vector>
diff --git a/res/drawable/ic_skip_next_dark.xml b/res/drawable/ic_skip_next_dark.xml
deleted file mode 100644
index dde6ad9..0000000
--- a/res/drawable/ic_skip_next_dark.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2017 The Dirty Unicorns 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="22dp"
-        android:height="22dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z" />
-</vector>
diff --git a/res/drawable/ic_skip_previous.xml b/res/drawable/ic_skip_previous.xml
deleted file mode 100644
index 5f126d7..0000000
--- a/res/drawable/ic_skip_previous.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="22dp"
-    android:height="22dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z" />
-</vector>
diff --git a/res/drawable/ic_skip_previous_dark.xml b/res/drawable/ic_skip_previous_dark.xml
deleted file mode 100644
index f79fae8..0000000
--- a/res/drawable/ic_skip_previous_dark.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2017 The Dirty Unicorns 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="22dp"
-        android:height="22dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M6 6h2v12H6zm3.5 6l8.5 6V6z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_actions.xml b/res/drawable/ic_smartbar_editor_actions.xml
deleted file mode 100644
index 86722fd..0000000
--- a/res/drawable/ic_smartbar_editor_actions.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/flag_checkered.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M14.4,6H20V16H13L12.6,14H7V21H5V4H14L14.4,6M14,14H16V12H18V10H16V8H14V10L13,8V6H11V8H9V6H7V8H9V10H7V12H9V10H11V12H13V10L14,12V14M11,10V8H13V10H11M14,10H16V12H14V10Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_add.xml b/res/drawable/ic_smartbar_editor_add.xml
deleted file mode 100644
index 28a135a..0000000
--- a/res/drawable/ic_smartbar_editor_add.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/plus.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_cancel.xml b/res/drawable/ic_smartbar_editor_cancel.xml
deleted file mode 100644
index 16e0a8d..0000000
--- a/res/drawable/ic_smartbar_editor_cancel.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/block_helper.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M12,0A12,12 0 0,1 24,12A12,12 0 0,1 12,24A12,12 0 0,1 0,12A12,12 0 0,1 12,0M12,2A10,10 0 0,0 2,12C2,14.4 2.85,16.6 4.26,18.33L18.33,4.26C16.6,2.85 14.4,2 12,2M12,22A10,10 0 0,0 22,12C22,9.6 21.15,7.4 19.74,5.67L5.67,19.74C7.4,21.15 9.6,22 12,22Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_double_tap.xml b/res/drawable/ic_smartbar_editor_double_tap.xml
deleted file mode 100644
index 4380ae5..0000000
--- a/res/drawable/ic_smartbar_editor_double_tap.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/view_stream.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M4,5V11H21V5M4,18H21V12H4V18Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_finish.xml b/res/drawable/ic_smartbar_editor_finish.xml
deleted file mode 100644
index 9a4500d..0000000
--- a/res/drawable/ic_smartbar_editor_finish.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/window_close.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M13.46,12L19,17.54V19H17.54L12,13.46L6.46,19H5V17.54L10.54,12L5,6.46V5H6.46L12,10.54L17.54,5H19V6.46L13.46,12Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_icon.xml b/res/drawable/ic_smartbar_editor_icon.xml
deleted file mode 100644
index 24065d8..0000000
--- a/res/drawable/ic_smartbar_editor_icon.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/eyedropper.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M19.35,11.72L17.22,13.85L15.81,12.43L8.1,20.14L3.5,22L2,20.5L3.86,15.9L11.57,8.19L10.15,6.78L12.28,4.65L19.35,11.72M16.76,3C17.93,1.83 19.83,1.83 21,3C22.17,4.17 22.17,6.07 21,7.24L19.08,9.16L14.84,4.92L16.76,3M5.56,17.03L4.5,19.5L6.97,18.44L14.4,11L13,9.6L5.56,17.03Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_icon_color.xml b/res/drawable/ic_smartbar_editor_icon_color.xml
deleted file mode 100644
index 1bd0f22..0000000
--- a/res/drawable/ic_smartbar_editor_icon_color.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/format_color_fill.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M19,11.5C19,11.5 17,13.67 17,15A2,2 0 0,0 19,17A2,2 0 0,0 21,15C21,13.67 19,11.5 19,11.5M5.21,10L10,5.21L14.79,10M16.56,8.94L7.62,0L6.21,1.41L8.59,3.79L3.44,8.94C2.85,9.5 2.85,10.47 3.44,11.06L8.94,16.56C9.23,16.85 9.62,17 10,17C10.38,17 10.77,16.85 11.06,16.56L16.56,11.06C17.15,10.47 17.15,9.5 16.56,8.94Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_icon_gallery.xml b/res/drawable/ic_smartbar_editor_icon_gallery.xml
deleted file mode 100644
index 4239cb6..0000000
--- a/res/drawable/ic_smartbar_editor_icon_gallery.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/harddisk.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M12,4A6,6 0 0,0 6,10C6,13.31 8.69,16 12.1,16L11.22,13.77C10.95,13.29 11.11,12.68 11.59,12.4L12.45,11.9C12.93,11.63 13.54,11.79 13.82,12.27L15.74,14.69C17.12,13.59 18,11.9 18,10A6,6 0 0,0 12,4M12,9A1,1 0 0,1 13,10A1,1 0 0,1 12,11A1,1 0 0,1 11,10A1,1 0 0,1 12,9M7,18A1,1 0 0,0 6,19A1,1 0 0,0 7,20A1,1 0 0,0 8,19A1,1 0 0,0 7,18M12.09,13.27L14.58,19.58L17.17,18.08L12.95,12.77L12.09,13.27Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_icon_pack.xml b/res/drawable/ic_smartbar_editor_icon_pack.xml
deleted file mode 100644
index 6eed2d9..0000000
--- a/res/drawable/ic_smartbar_editor_icon_pack.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/image_multiple.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M22,16V4A2,2 0 0,0 20,2H8A2,2 0 0,0 6,4V16A2,2 0 0,0 8,18H20A2,2 0 0,0 22,16M11,12L13.03,14.71L16,11L20,16H8M2,6V20A2,2 0 0,0 4,22H18V20H4V6" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_icon_reset.xml b/res/drawable/ic_smartbar_editor_icon_reset.xml
deleted file mode 100644
index 34df500..0000000
--- a/res/drawable/ic_smartbar_editor_icon_reset.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/undo.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M12.5,8C9.85,8 7.45,9 5.6,10.6L2,7V16H11L7.38,12.38C8.77,11.22 10.54,10.5 12.5,10.5C16.04,10.5 19.05,12.81 20.1,16L22.47,15.22C21.08,11.03 17.15,8 12.5,8Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_long_press.xml b/res/drawable/ic_smartbar_editor_long_press.xml
deleted file mode 100644
index 69f91b2..0000000
--- a/res/drawable/ic_smartbar_editor_long_press.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/view_week.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M13,5H10A1,1 0 0,0 9,6V18A1,1 0 0,0 10,19H13A1,1 0 0,0 14,18V6A1,1 0 0,0 13,5M20,5H17A1,1 0 0,0 16,6V18A1,1 0 0,0 17,19H20A1,1 0 0,0 21,18V6A1,1 0 0,0 20,5M6,5H3A1,1 0 0,0 2,6V18A1,1 0 0,0 3,19H6A1,1 0 0,0 7,18V6A1,1 0 0,0 6,5Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_remove.xml b/res/drawable/ic_smartbar_editor_remove.xml
deleted file mode 100644
index 048d891..0000000
--- a/res/drawable/ic_smartbar_editor_remove.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/content_cut.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M19,3L13,9L15,11L22,4V3M12,12.5A0.5,0.5 0 0,1 11.5,12A0.5,0.5 0 0,1 12,11.5A0.5,0.5 0 0,1 12.5,12A0.5,0.5 0 0,1 12,12.5M6,20A2,2 0 0,1 4,18C4,16.89 4.9,16 6,16A2,2 0 0,1 8,18C8,19.11 7.1,20 6,20M6,8A2,2 0 0,1 4,6C4,4.89 4.9,4 6,4A2,2 0 0,1 8,6C8,7.11 7.1,8 6,8M9.64,7.64C9.87,7.14 10,6.59 10,6A4,4 0 0,0 6,2A4,4 0 0,0 2,6A4,4 0 0,0 6,10C6.59,10 7.14,9.87 7.64,9.64L10,12L7.64,14.36C7.14,14.13 6.59,14 6,14A4,4 0 0,0 2,18A4,4 0 0,0 6,22A4,4 0 0,0 10,18C10,17.41 9.87,16.86 9.64,16.36L12,14L19,21H22V20L9.64,7.64Z" />
-</vector>
diff --git a/res/drawable/ic_smartbar_editor_single_tap.xml b/res/drawable/ic_smartbar_editor_single_tap.xml
deleted file mode 100644
index 18a7833..0000000
--- a/res/drawable/ic_smartbar_editor_single_tap.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/window_minimize.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/smartbar_editor_popup_icon_fill" android:pathData="M20,14H4V10H20" />
-</vector>
diff --git a/res/drawable/ic_smartbar_screen_pinning_off.xml b/res/drawable/ic_smartbar_screen_pinning_off.xml
deleted file mode 100644
index 112ce8b..0000000
--- a/res/drawable/ic_smartbar_screen_pinning_off.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/pin_off.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="#fff" android:pathData="M2,5.27L3.28,4L20,20.72L18.73,22L12.8,16.07V22H11.2V16H6V14L8,12V11.27L2,5.27M16,12L18,14V16H17.82L8,6.18V4H7V2H17V4H16V12Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_assist.xml b/res/drawable/ic_sysbar_assist.xml
deleted file mode 100644
index 19d5725..0000000
--- a/res/drawable/ic_sysbar_assist.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/assistant.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_search_assistant" android:pathData="M19,2H5A2,2 0 0,0 3,4V18A2,2 0 0,0 5,20H9L12,23L15,20H19A2,2 0 0,0 21,18V4A2,2 0 0,0 19,2M13.88,12.88L12,17L10.12,12.88L6,11L10.12,9.12L12,5L13.88,9.12L18,11" />
-</vector>
diff --git a/res/drawable/ic_sysbar_assist_dark.xml b/res/drawable/ic_sysbar_assist_dark.xml
deleted file mode 100644
index e2bb940..0000000
--- a/res/drawable/ic_sysbar_assist_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/assistant.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M19,2H5A2,2 0 0,0 3,4V18A2,2 0 0,0 5,20H9L12,23L15,20H19A2,2 0 0,0 21,18V4A2,2 0 0,0 19,2M13.88,12.88L12,17L10.12,12.88L6,11L10.12,9.12L12,5L13.88,9.12L18,11" />
-</vector>
diff --git a/res/drawable/ic_sysbar_back.xml b/res/drawable/ic_sysbar_back.xml
deleted file mode 100644
index 5847002..0000000
--- a/res/drawable/ic_sysbar_back.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="21dp"
-    android:height="21dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_back"
-        android:pathData="M64.55,12.62C67.66,10.72 72.05,13.33 71.99,16.94C72.12,35 72.01,53.07 72.05,71.13C71.97,73.99 69.63,75.84 67.01,76.34C64.39,75.81 62.34,74.16 60.02,72.95C46.32,65.08 32.64,57.17 18.9,49.36C15.15,47.63 15.09,41.57 18.78,39.72C34.03,30.68 49.26,21.61 64.55,12.62Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_back_dark.xml b/res/drawable/ic_sysbar_back_dark.xml
deleted file mode 100644
index 8be7ed6..0000000
--- a/res/drawable/ic_sysbar_back_dark.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="20dp"
-    android:height="20dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M64.55,12.62C67.66,10.72 72.05,13.33 71.99,16.94C72.12,35 72.01,53.07 72.05,71.13C71.97,73.99 69.63,75.84 67.01,76.34C64.39,75.81 62.34,74.16 60.02,72.95C46.32,65.08 32.64,57.17 18.9,49.36C15.15,47.63 15.09,41.57 18.78,39.72C34.03,30.68 49.26,21.61 64.55,12.62Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_back_ime.xml b/res/drawable/ic_sysbar_back_ime.xml
deleted file mode 100644
index d7d1e54..0000000
--- a/res/drawable/ic_sysbar_back_ime.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="21dp"
-    android:height="21dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_back"
-        android:pathData="M16.11,16.11C34.41,15.87 52.74,16.05 71.05,16.02C74.76,15.94 77.25,20.45 75.4,23.61C66.61,39.03 57.76,54.44 48.87,69.8C46.91,72.92 42.05,72.85 39.97,69.88C30.84,54.46 21.66,39.05 12.58,23.61C10.99,20.69 12.76,16.63 16.11,16.11Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_back_ime_dark.xml b/res/drawable/ic_sysbar_back_ime_dark.xml
deleted file mode 100644
index 9a7b28f..0000000
--- a/res/drawable/ic_sysbar_back_ime_dark.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="20dp"
-    android:height="20dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M16.11,16.11C34.41,15.87 52.74,16.05 71.05,16.02C74.76,15.94 77.25,20.45 75.4,23.61C66.61,39.03 57.76,54.44 48.87,69.8C46.91,72.92 42.05,72.85 39.97,69.88C30.84,54.46 21.66,39.05 12.58,23.61C10.99,20.69 12.76,16.63 16.11,16.11Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_back_land.xml b/res/drawable/ic_sysbar_back_land.xml
deleted file mode 100644
index d7d1e54..0000000
--- a/res/drawable/ic_sysbar_back_land.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="21dp"
-    android:height="21dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_back"
-        android:pathData="M16.11,16.11C34.41,15.87 52.74,16.05 71.05,16.02C74.76,15.94 77.25,20.45 75.4,23.61C66.61,39.03 57.76,54.44 48.87,69.8C46.91,72.92 42.05,72.85 39.97,69.88C30.84,54.46 21.66,39.05 12.58,23.61C10.99,20.69 12.76,16.63 16.11,16.11Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_back_land_dark.xml b/res/drawable/ic_sysbar_back_land_dark.xml
deleted file mode 100644
index 9a7b28f..0000000
--- a/res/drawable/ic_sysbar_back_land_dark.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="20dp"
-    android:height="20dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M16.11,16.11C34.41,15.87 52.74,16.05 71.05,16.02C74.76,15.94 77.25,20.45 75.4,23.61C66.61,39.03 57.76,54.44 48.87,69.8C46.91,72.92 42.05,72.85 39.97,69.88C30.84,54.46 21.66,39.05 12.58,23.61C10.99,20.69 12.76,16.63 16.11,16.11Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_bt.xml b/res/drawable/ic_sysbar_bt.xml
deleted file mode 100644
index d06d1d3..0000000
--- a/res/drawable/ic_sysbar_bt.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/bluetooth.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_bluetooth" android:pathData="M14.88,16.29L13,18.17V14.41M13,5.83L14.88,7.71L13,9.58M17.71,7.71L12,2H11V9.58L6.41,5L5,6.41L10.59,12L5,17.58L6.41,19L11,14.41V22H12L17.71,16.29L13.41,12L17.71,7.71Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_bt_dark.xml b/res/drawable/ic_sysbar_bt_dark.xml
deleted file mode 100644
index 81679e1..0000000
--- a/res/drawable/ic_sysbar_bt_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/bluetooth.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M14.88,16.29L13,18.17V14.41M13,5.83L14.88,7.71L13,9.58M17.71,7.71L12,2H11V9.58L6.41,5L5,6.41L10.59,12L5,17.58L6.41,19L11,14.41V22H12L17.71,16.29L13.41,12L17.71,7.71Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_clear_notifications.xml b/res/drawable/ic_sysbar_clear_notifications.xml
deleted file mode 100644
index 2a1fbc6..0000000
--- a/res/drawable/ic_sysbar_clear_notifications.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/clear_notifications.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_clear_notifications" android:pathData="M5,13H19V11H5M3,17H17V15H3M7,7V9H21V7" />
-</vector>
diff --git a/res/drawable/ic_sysbar_clear_notifications_dark.xml b/res/drawable/ic_sysbar_clear_notifications_dark.xml
deleted file mode 100644
index d8480e8..0000000
--- a/res/drawable/ic_sysbar_clear_notifications_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/clear_notifications.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M5,13H19V11H5M3,17H17V15H3M7,7V9H21V7" />
-</vector>
diff --git a/res/drawable/ic_sysbar_docked.xml b/res/drawable/ic_sysbar_docked.xml
deleted file mode 100644
index d11fb18..0000000
--- a/res/drawable/ic_sysbar_docked.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="21dp"
-    android:width="21dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_split_screen" android:pathData="M20,3H3A1,1 0 0,0 2,4V10A1,1 0 0,0 3,11H20A1,1 0 0,0 21,10V4A1,1 0 0,0 20,3M20,13H3A1,1 0 0,0 2,14V20A1,1 0 0,0 3,21H20A1,1 0 0,0 21,20V14A1,1 0 0,0 20,13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_docked_dark.xml b/res/drawable/ic_sysbar_docked_dark.xml
deleted file mode 100644
index 7dd39a5..0000000
--- a/res/drawable/ic_sysbar_docked_dark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="19dp"
-    android:width="19dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M20,3H3A1,1 0 0,0 2,4V10A1,1 0 0,0 3,11H20A1,1 0 0,0 21,10V4A1,1 0 0,0 20,3M20,13H3A1,1 0 0,0 2,14V20A1,1 0 0,0 3,21H20A1,1 0 0,0 21,20V14A1,1 0 0,0 20,13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_editing_smartbar.xml b/res/drawable/ic_sysbar_editing_smartbar.xml
deleted file mode 100644
index 5d66834..0000000
--- a/res/drawable/ic_sysbar_editing_smartbar.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/editing_smartbar.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_editing_smartbar" android:pathData="M4,2H20A2,2 0 0,1 22,4V16A2,2 0 0,1 20,18H16L12,22L8,18H4A2,2 0 0,1 2,16V4A2,2 0 0,1 4,2M18,14V12H12.5L10.5,14H18M6,14H8.5L15.35,7.12C15.55,6.93 15.55,6.61 15.35,6.41L13.59,4.65C13.39,4.45 13.07,4.45 12.88,4.65L6,11.53V14Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_editing_smartbar_dark.xml b/res/drawable/ic_sysbar_editing_smartbar_dark.xml
deleted file mode 100644
index 60b5ee8..0000000
--- a/res/drawable/ic_sysbar_editing_smartbar_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/editing_smartbar.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M4,2H20A2,2 0 0,1 22,4V16A2,2 0 0,1 20,18H16L12,22L8,18H4A2,2 0 0,1 2,16V4A2,2 0 0,1 4,2M18,14V12H12.5L10.5,14H18M6,14H8.5L15.35,7.12C15.55,6.93 15.55,6.61 15.35,6.41L13.59,4.65C13.39,4.45 13.07,4.45 12.88,4.65L6,11.53V14Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_expanded_desktop.xml b/res/drawable/ic_sysbar_expanded_desktop.xml
deleted file mode 100644
index 4c4344f..0000000
--- a/res/drawable/ic_sysbar_expanded_desktop.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/arrow_expand.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_expanded_desktop" android:pathData="M9.5,13.09L10.91,14.5L6.41,19H10V21H3V14H5V17.59L9.5,13.09M10.91,9.5L9.5,10.91L5,6.41V10H3V3H10V5H6.41L10.91,9.5M14.5,13.09L19,17.59V14H21V21H14V19H17.59L13.09,14.5L14.5,13.09M13.09,9.5L17.59,5H14V3H21V10H19V6.41L14.5,10.91L13.09,9.5Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_expanded_desktop_dark.xml b/res/drawable/ic_sysbar_expanded_desktop_dark.xml
deleted file mode 100644
index 045ade2..0000000
--- a/res/drawable/ic_sysbar_expanded_desktop_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/arrow_expand.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M9.5,13.09L10.91,14.5L6.41,19H10V21H3V14H5V17.59L9.5,13.09M10.91,9.5L9.5,10.91L5,6.41V10H3V3H10V5H6.41L10.91,9.5M14.5,13.09L19,17.59V14H21V21H14V19H17.59L13.09,14.5L14.5,13.09M13.09,9.5L17.59,5H14V3H21V10H19V6.41L14.5,10.91L13.09,9.5Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_google_now_on_tap.xml b/res/drawable/ic_sysbar_google_now_on_tap.xml
deleted file mode 100644
index 638f04f..0000000
--- a/res/drawable/ic_sysbar_google_now_on_tap.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/google-glass.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_google_now_on_tap" android:pathData="M13,11V13.5H18.87C18.26,17 15.5,19.5 12,19.5A7.5,7.5 0 0,1 4.5,12A7.5,7.5 0 0,1 12,4.5C14.09,4.5 15.9,5.39 17.16,6.84L18.93,5.06C17.24,3.18 14.83,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22C17.5,22 21.5,17.5 21.5,12V11H13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_google_now_on_tap_dark.xml b/res/drawable/ic_sysbar_google_now_on_tap_dark.xml
deleted file mode 100644
index b12a923..0000000
--- a/res/drawable/ic_sysbar_google_now_on_tap_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/google-glass.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M13,11V13.5H18.87C18.26,17 15.5,19.5 12,19.5A7.5,7.5 0 0,1 4.5,12A7.5,7.5 0 0,1 12,4.5C14.09,4.5 15.9,5.39 17.16,6.84L18.93,5.06C17.24,3.18 14.83,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22C17.5,22 21.5,17.5 21.5,12V11H13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_home.xml b/res/drawable/ic_sysbar_home.xml
deleted file mode 100644
index b8a5e15..0000000
--- a/res/drawable/ic_sysbar_home.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="23dp"
-    android:height="23dp"
-    android:viewportWidth="132"
-    android:viewportHeight="132">
-
-    <path
-        android:fillColor="@color/icon_color_home"
-        android:strokeWidth="1"
-        android:pathData="M55.5,22.4 C47.1,24.5,40.8,28.1,34.5,34.5 C16.7,52.2,16.7,79.8,34.5,97.5
-C48.1,111.2,67.9,114.6,85.7,106.3 C93.3,102.8,102.8,93.3,106.3,85.7
-C114.6,67.9,111.2,48.1,97.5,34.5 C86.2,23.1,70.6,18.6,55.5,22.4 Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_home_dark.xml b/res/drawable/ic_sysbar_home_dark.xml
deleted file mode 100644
index 10091ac..0000000
--- a/res/drawable/ic_sysbar_home_dark.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="23dp"
-    android:height="23dp"
-    android:viewportWidth="132"
-    android:viewportHeight="132">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:strokeWidth="1"
-        android:pathData="M55.5,22.4 C47.1,24.5,40.8,28.1,34.5,34.5 C16.7,52.2,16.7,79.8,34.5,97.5
-C48.1,111.2,67.9,114.6,85.7,106.3 C93.3,102.8,102.8,93.3,106.3,85.7
-C114.6,67.9,111.2,48.1,97.5,34.5 C86.2,23.1,70.6,18.6,55.5,22.4 Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_home_land.xml b/res/drawable/ic_sysbar_home_land.xml
deleted file mode 100644
index b8a5e15..0000000
--- a/res/drawable/ic_sysbar_home_land.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="23dp"
-    android:height="23dp"
-    android:viewportWidth="132"
-    android:viewportHeight="132">
-
-    <path
-        android:fillColor="@color/icon_color_home"
-        android:strokeWidth="1"
-        android:pathData="M55.5,22.4 C47.1,24.5,40.8,28.1,34.5,34.5 C16.7,52.2,16.7,79.8,34.5,97.5
-C48.1,111.2,67.9,114.6,85.7,106.3 C93.3,102.8,102.8,93.3,106.3,85.7
-C114.6,67.9,111.2,48.1,97.5,34.5 C86.2,23.1,70.6,18.6,55.5,22.4 Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_home_land_dark.xml b/res/drawable/ic_sysbar_home_land_dark.xml
deleted file mode 100644
index 10091ac..0000000
--- a/res/drawable/ic_sysbar_home_land_dark.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="23dp"
-    android:height="23dp"
-    android:viewportWidth="132"
-    android:viewportHeight="132">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:strokeWidth="1"
-        android:pathData="M55.5,22.4 C47.1,24.5,40.8,28.1,34.5,34.5 C16.7,52.2,16.7,79.8,34.5,97.5
-C48.1,111.2,67.9,114.6,85.7,106.3 C93.3,102.8,102.8,93.3,106.3,85.7
-C114.6,67.9,111.2,48.1,97.5,34.5 C86.2,23.1,70.6,18.6,55.5,22.4 Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_hotspot.xml b/res/drawable/ic_sysbar_hotspot.xml
deleted file mode 100644
index c7df50f..0000000
--- a/res/drawable/ic_sysbar_hotspot.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/access_point_network.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_hotspot" android:pathData="M4.93,2.93C3.12,4.74 2,7.24 2,10C2,12.76 3.12,15.26 4.93,17.07L6.34,15.66C4.89,14.22 4,12.22 4,10C4,7.79 4.89,5.78 6.34,4.34L4.93,2.93M19.07,2.93L17.66,4.34C19.11,5.78 20,7.79 20,10C20,12.22 19.11,14.22 17.66,15.66L19.07,17.07C20.88,15.26 22,12.76 22,10C22,7.24 20.88,4.74 19.07,2.93M7.76,5.76C6.67,6.85 6,8.35 6,10C6,11.65 6.67,13.15 7.76,14.24L9.17,12.83C8.45,12.11 8,11.11 8,10C8,8.89 8.45,7.89 9.17,7.17L7.76,5.76M16.24,5.76L14.83,7.17C15.55,7.89 16,8.89 16,10C16,11.11 15.55,12.11 14.83,12.83L16.24,14.24C17.33,13.15 18,11.65 18,10C18,8.35 17.33,6.85 16.24,5.76M12,8A2,2 0 0,0 10,10A2,2 0 0,0 12,12A2,2 0 0,0 14,10A2,2 0 0,0 12,8M11,14V18H10A1,1 0 0,0 9,19H2V21H9A1,1 0 0,0 10,22H14A1,1 0 0,0 15,21H22V19H15A1,1 0 0,0 14,18H13V14H11Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_hotspot_dark.xml b/res/drawable/ic_sysbar_hotspot_dark.xml
deleted file mode 100644
index 4347813..0000000
--- a/res/drawable/ic_sysbar_hotspot_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/access_point_network.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M4.93,2.93C3.12,4.74 2,7.24 2,10C2,12.76 3.12,15.26 4.93,17.07L6.34,15.66C4.89,14.22 4,12.22 4,10C4,7.79 4.89,5.78 6.34,4.34L4.93,2.93M19.07,2.93L17.66,4.34C19.11,5.78 20,7.79 20,10C20,12.22 19.11,14.22 17.66,15.66L19.07,17.07C20.88,15.26 22,12.76 22,10C22,7.24 20.88,4.74 19.07,2.93M7.76,5.76C6.67,6.85 6,8.35 6,10C6,11.65 6.67,13.15 7.76,14.24L9.17,12.83C8.45,12.11 8,11.11 8,10C8,8.89 8.45,7.89 9.17,7.17L7.76,5.76M16.24,5.76L14.83,7.17C15.55,7.89 16,8.89 16,10C16,11.11 15.55,12.11 14.83,12.83L16.24,14.24C17.33,13.15 18,11.65 18,10C18,8.35 17.33,6.85 16.24,5.76M12,8A2,2 0 0,0 10,10A2,2 0 0,0 12,12A2,2 0 0,0 14,10A2,2 0 0,0 12,8M11,14V18H10A1,1 0 0,0 9,19H2V21H9A1,1 0 0,0 10,22H14A1,1 0 0,0 15,21H22V19H15A1,1 0 0,0 14,18H13V14H11Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_down.xml b/res/drawable/ic_sysbar_ime_down.xml
deleted file mode 100644
index 9a50429..0000000
--- a/res/drawable/ic_sysbar_ime_down.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_down.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_ime_down" android:pathData="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_down_dark.xml b/res/drawable/ic_sysbar_ime_down_dark.xml
deleted file mode 100644
index baf30f1..0000000
--- a/res/drawable/ic_sysbar_ime_down_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_down.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_left.xml b/res/drawable/ic_sysbar_ime_left.xml
deleted file mode 100644
index 31e8388..0000000
--- a/res/drawable/ic_sysbar_ime_left.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_left.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_ime_left" android:pathData="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_left_dark.xml b/res/drawable/ic_sysbar_ime_left_dark.xml
deleted file mode 100644
index 5aec8da..0000000
--- a/res/drawable/ic_sysbar_ime_left_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_left.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_right.xml b/res/drawable/ic_sysbar_ime_right.xml
deleted file mode 100644
index 65822ec..0000000
--- a/res/drawable/ic_sysbar_ime_right.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_right.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_ime_right" android:pathData="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_right_dark.xml b/res/drawable/ic_sysbar_ime_right_dark.xml
deleted file mode 100644
index 359993c..0000000
--- a/res/drawable/ic_sysbar_ime_right_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_right.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_up.xml b/res/drawable/ic_sysbar_ime_up.xml
deleted file mode 100644
index a4c7b3d..0000000
--- a/res/drawable/ic_sysbar_ime_up.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_up.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_ime_up" android:pathData="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_ime_up_dark.xml b/res/drawable/ic_sysbar_ime_up_dark.xml
deleted file mode 100644
index be23773..0000000
--- a/res/drawable/ic_sysbar_ime_up_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/chevron_up.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_in_app_search.xml b/res/drawable/ic_sysbar_in_app_search.xml
deleted file mode 100644
index e5168f0..0000000
--- a/res/drawable/ic_sysbar_in_app_search.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/binoculars.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_in_app_search" android:pathData="M11,6H13V13H11V6M9,20A1,1 0 0,1 8,21H5A1,1 0 0,1 4,20V15L6,6H10V13A1,1 0 0,1 9,14V20M10,5H7V3H10V5M15,20V14A1,1 0 0,1 14,13V6H18L20,15V20A1,1 0 0,1 19,21H16A1,1 0 0,1 15,20M14,5V3H17V5H14Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_in_app_search_dark.xml b/res/drawable/ic_sysbar_in_app_search_dark.xml
deleted file mode 100644
index d3accff..0000000
--- a/res/drawable/ic_sysbar_in_app_search_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/binoculars.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M11,6H13V13H11V6M9,20A1,1 0 0,1 8,21H5A1,1 0 0,1 4,20V15L6,6H10V13A1,1 0 0,1 9,14V20M10,5H7V3H10V5M15,20V14A1,1 0 0,1 14,13V6H18L20,15V20A1,1 0 0,1 19,21H16A1,1 0 0,1 15,20M14,5V3H17V5H14Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_killtask.xml b/res/drawable/ic_sysbar_killtask.xml
deleted file mode 100644
index 8aa0a21..0000000
--- a/res/drawable/ic_sysbar_killtask.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/close_circle_outline.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_force_close_app" android:pathData="M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_killtask_dark.xml b/res/drawable/ic_sysbar_killtask_dark.xml
deleted file mode 100644
index 9792c72..0000000
--- a/res/drawable/ic_sysbar_killtask_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/close_circle_outline.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_lastapp.xml b/res/drawable/ic_sysbar_lastapp.xml
deleted file mode 100644
index b89f0a1..0000000
--- a/res/drawable/ic_sysbar_lastapp.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/arrange_bring_forward.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_last_app" android:pathData="M21,19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3H19C20.11,3 21,3.9 21,5V19M13,18V9.5L16.5,13L17.92,11.58L12,5.66L6.08,11.58L7.5,13L11,9.5V18H13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_lastapp_dark.xml b/res/drawable/ic_sysbar_lastapp_dark.xml
deleted file mode 100644
index a704626..0000000
--- a/res/drawable/ic_sysbar_lastapp_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/arrange_bring_forward.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M21,19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3H19C20.11,3 21,3.9 21,5V19M13,18V9.5L16.5,13L17.92,11.58L12,5.66L6.08,11.58L7.5,13L11,9.5V18H13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_menu.xml b/res/drawable/ic_sysbar_menu.xml
deleted file mode 100644
index 342bf08..0000000
--- a/res/drawable/ic_sysbar_menu.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_menu" android:pathData="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_menu_dark.xml b/res/drawable/ic_sysbar_menu_dark.xml
deleted file mode 100644
index 2c8f87f..0000000
--- a/res/drawable/ic_sysbar_menu_dark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_menu_land.xml b/res/drawable/ic_sysbar_menu_land.xml
deleted file mode 100644
index 342bf08..0000000
--- a/res/drawable/ic_sysbar_menu_land.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_menu" android:pathData="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_menu_land_dark.xml b/res/drawable/ic_sysbar_menu_land_dark.xml
deleted file mode 100644
index 2c8f87f..0000000
--- a/res/drawable/ic_sysbar_menu_land_dark.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_no_action.xml b/res/drawable/ic_sysbar_no_action.xml
deleted file mode 100644
index 3ac1eeb..0000000
--- a/res/drawable/ic_sysbar_no_action.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/block_helper.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_no_action" android:pathData="M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_no_action_dark.xml b/res/drawable/ic_sysbar_no_action_dark.xml
deleted file mode 100644
index 29cb262..0000000
--- a/res/drawable/ic_sysbar_no_action_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/block_helper.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_notification_panel.xml b/res/drawable/ic_sysbar_notification_panel.xml
deleted file mode 100644
index cec27ae..0000000
--- a/res/drawable/ic_sysbar_notification_panel.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/format_list_bulleted_type.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_notification_panel" android:pathData="M5,9.5L7.5,14H2.5L5,9.5M3,4H7V8H3V4M5,20A2,2 0 0,0 7,18A2,2 0 0,0 5,16A2,2 0 0,0 3,18A2,2 0 0,0 5,20M9,5V7H21V5H9M9,19H21V17H9V19M9,13H21V11H9V13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_notification_panel_dark.xml b/res/drawable/ic_sysbar_notification_panel_dark.xml
deleted file mode 100644
index 0517921..0000000
--- a/res/drawable/ic_sysbar_notification_panel_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/format_list_bulleted_type.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M5,9.5L7.5,14H2.5L5,9.5M3,4H7V8H3V4M5,20A2,2 0 0,0 7,18A2,2 0 0,0 5,16A2,2 0 0,0 3,18A2,2 0 0,0 5,20M9,5V7H21V5H9M9,19H21V17H9V19M9,13H21V11H9V13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_one_handed_mode_left.xml b/res/drawable/ic_sysbar_one_handed_mode_left.xml
deleted file mode 100644
index 322cbfa..0000000
--- a/res/drawable/ic_sysbar_one_handed_mode_left.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-     Copyright (C) 2017 Flash ROM
-
-     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="21dp"
-    android:height="21dp"
-    android:viewportWidth="512"
-    android:viewportHeight="512">
-
-    <group
-        android:translateY="512"
-        android:scaleX="0.1"
-        android:scaleY="-0.1">
-        <path
-            android:fillColor="@color/icon_color_one_handed_mode"
-            android:strokeWidth="1"
-            android:pathData="M3910 4305 c-311 -311 -569 -564 -575 -562 -6 2 -11 159 -13 438 -2 239 -5 440 -7
-447 -4 10 -59 12 -252 10 l-248 -3 -3 -897 -2 -898 895 0 895 0 0 255 0 255 -445 0
-c-322 0 -445 3 -445 11 0 6 227 239 504 518 493 496 607 613 615 633 3 9 -337 358
--349 358 -3 0 -259 -254 -570 -565z" />
-        <path
-            android:fillColor="@color/icon_color_one_handed_mode"
-            android:strokeWidth="1"
-            android:pathData="M500 2065 l0 -255 445 0 c245 0 445 -4 445 -9 0 -11 6 -5 -602 -618 -285 -287 -518
--527 -518 -535 0 -7 79 -92 175 -188 l175 -175 569 569 c313 313 573 566 578 563 4
--3 10 -203 11 -444 2 -241 7 -441 11 -446 4 -4 117 -6 252 -5 l244 3 3 898 2 897
--895 0 -895 0 0 -255z" />
-    </group>
-</vector>
diff --git a/res/drawable/ic_sysbar_one_handed_mode_left_dark.xml b/res/drawable/ic_sysbar_one_handed_mode_left_dark.xml
deleted file mode 100644
index de2d964..0000000
--- a/res/drawable/ic_sysbar_one_handed_mode_left_dark.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-     Copyright (C) 2017 Flash ROM
-     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="21dp"
-    android:height="21dp"
-    android:viewportWidth="512"
-    android:viewportHeight="512">
-
-    <group
-        android:translateY="512"
-        android:scaleX="0.1"
-        android:scaleY="-0.1">
-        <path
-            android:fillColor="@color/icon_color_dark"
-            android:strokeWidth="1"
-            android:pathData="M3910 4305 c-311 -311 -569 -564 -575 -562 -6 2 -11 159 -13 438 -2 239 -5 440 -7
-447 -4 10 -59 12 -252 10 l-248 -3 -3 -897 -2 -898 895 0 895 0 0 255 0 255 -445 0
-c-322 0 -445 3 -445 11 0 6 227 239 504 518 493 496 607 613 615 633 3 9 -337 358
--349 358 -3 0 -259 -254 -570 -565z" />
-        <path
-            android:fillColor="@color/icon_color_dark"
-            android:strokeWidth="1"
-            android:pathData="M500 2065 l0 -255 445 0 c245 0 445 -4 445 -9 0 -11 6 -5 -602 -618 -285 -287 -518
--527 -518 -535 0 -7 79 -92 175 -188 l175 -175 569 569 c313 313 573 566 578 563 4
--3 10 -203 11 -444 2 -241 7 -441 11 -446 4 -4 117 -6 252 -5 l244 3 3 898 2 897
--895 0 -895 0 0 -255z" />
-    </group>
-</vector>
diff --git a/res/drawable/ic_sysbar_one_handed_mode_right.xml b/res/drawable/ic_sysbar_one_handed_mode_right.xml
deleted file mode 100644
index 1c479a5..0000000
--- a/res/drawable/ic_sysbar_one_handed_mode_right.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-     Copyright (C) 2017 Flash ROM
-
-     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="21dp"
-    android:height="21dp"
-    android:viewportWidth="512"
-    android:viewportHeight="512">
-
-    <group
-        android:translateY="512"
-        android:scaleX="0.1"
-        android:scaleY="-0.1">
-        <path
-            android:fillColor="@color/icon_color_one_handed_mode"
-            android:strokeWidth="1"
-            android:pathData="M441 4696 c-95 -95 -172 -178 -170 -184 8 -20 122 -137 615 -633 277 -279 504 -512
-504 -518 0 -8 -123 -11 -445 -11 l-445 0 0 -255 0 -255 895 0 895 0 -2 898 -3 897
--244 3 c-135 1 -248 -1 -252 -5 -4 -5 -9 -205 -11 -446 -1 -241 -7 -441 -11 -444
--5 -3 -264 249 -576 561 -311 311 -568 566 -571 566 -3 0 -83 -78 -179 -174z" />
-        <path
-            android:fillColor="@color/icon_color_one_handed_mode"
-            android:strokeWidth="1"
-            android:pathData="M2812 1423 l3 -898 244 -3 c135 -1 248 1 252 5 4 5 9 205 11 446 1 241 7 441 11
-444 5 3 265 -250 578 -563 l569 -569 175 175 c96 96 175 181 175 188 0 8 -233 248
--517 535 -609 613 -603 607 -603 618 0 5 200 9 445 9 l445 0 0 255 0 255 -895 0
--895 0 2 -897z" />
-    </group>
-</vector>
diff --git a/res/drawable/ic_sysbar_one_handed_mode_right_dark.xml b/res/drawable/ic_sysbar_one_handed_mode_right_dark.xml
deleted file mode 100644
index c7c8a37..0000000
--- a/res/drawable/ic_sysbar_one_handed_mode_right_dark.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-     Copyright (C) 2017 Flash ROM
-     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="21dp"
-    android:height="21dp"
-    android:viewportWidth="512"
-    android:viewportHeight="512">
-
-    <group
-        android:translateY="512"
-        android:scaleX="0.1"
-        android:scaleY="-0.1">
-        <path
-            android:fillColor="@color/icon_color_dark"
-            android:strokeWidth="1"
-            android:pathData="M441 4696 c-95 -95 -172 -178 -170 -184 8 -20 122 -137 615 -633 277 -279 504 -512
-504 -518 0 -8 -123 -11 -445 -11 l-445 0 0 -255 0 -255 895 0 895 0 -2 898 -3 897
--244 3 c-135 1 -248 -1 -252 -5 -4 -5 -9 -205 -11 -446 -1 -241 -7 -441 -11 -444
--5 -3 -264 249 -576 561 -311 311 -568 566 -571 566 -3 0 -83 -78 -179 -174z" />
-        <path
-            android:fillColor="@color/icon_color_dark"
-            android:strokeWidth="1"
-            android:pathData="M2812 1423 l3 -898 244 -3 c135 -1 248 1 252 5 4 5 9 205 11 446 1 241 7 441 11
-444 5 3 265 -250 578 -563 l569 -569 175 175 c96 96 175 181 175 188 0 8 -233 248
--517 535 -609 613 -603 607 -603 618 0 5 200 9 445 9 l445 0 0 255 0 255 -895 0
--895 0 2 -897z" />
-    </group>
-</vector>
diff --git a/res/drawable/ic_sysbar_opa_blue.xml b/res/drawable/ic_sysbar_opa_blue.xml
deleted file mode 100644
index a3df91c..0000000
--- a/res/drawable/ic_sysbar_opa_blue.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape android:shape="oval"
-  xmlns:android="http://schemas.android.com/apk/res/android">
-    <size android:height="@dimen/opa_dot_diam" android:width="@dimen/opa_dot_diam" />
-    <solid android:color="#ff4285f4" />
-</shape>
\ No newline at end of file
diff --git a/res/drawable/ic_sysbar_opa_green.xml b/res/drawable/ic_sysbar_opa_green.xml
deleted file mode 100644
index 6814ba1..0000000
--- a/res/drawable/ic_sysbar_opa_green.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape android:shape="oval"
-  xmlns:android="http://schemas.android.com/apk/res/android">
-    <size android:height="@dimen/opa_dot_diam" android:width="@dimen/opa_dot_diam" />
-    <solid android:color="#ff34a853" />
-</shape>
\ No newline at end of file
diff --git a/res/drawable/ic_sysbar_opa_red.xml b/res/drawable/ic_sysbar_opa_red.xml
deleted file mode 100644
index 5d44c61..0000000
--- a/res/drawable/ic_sysbar_opa_red.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape android:shape="oval"
-  xmlns:android="http://schemas.android.com/apk/res/android">
-    <size android:height="@dimen/opa_dot_diam" android:width="@dimen/opa_dot_diam" />
-    <solid android:color="#ffea4335" />
-</shape>
\ No newline at end of file
diff --git a/res/drawable/ic_sysbar_opa_yellow.xml b/res/drawable/ic_sysbar_opa_yellow.xml
deleted file mode 100644
index e56b8c8..0000000
--- a/res/drawable/ic_sysbar_opa_yellow.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape android:shape="oval"
-  xmlns:android="http://schemas.android.com/apk/res/android">
-    <size android:height="@dimen/opa_dot_diam" android:width="@dimen/opa_dot_diam" />
-    <solid android:color="#fffbbc05" />
-</shape>
\ No newline at end of file
diff --git a/res/drawable/ic_sysbar_power_menu.xml b/res/drawable/ic_sysbar_power_menu.xml
deleted file mode 100644
index 591b2ac..0000000
--- a/res/drawable/ic_sysbar_power_menu.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/power.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_power_menu" android:pathData="M16.56,5.44L15.11,6.89C16.84,7.94 18,9.83 18,12A6,6 0 0,1 12,18A6,6 0 0,1 6,12C6,9.83 7.16,7.94 8.88,6.88L7.44,5.44C5.36,6.88 4,9.28 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12C20,9.28 18.64,6.88 16.56,5.44M13,3H11V13H13" />
-</vector>
diff --git a/res/drawable/ic_sysbar_power_menu_dark.xml b/res/drawable/ic_sysbar_power_menu_dark.xml
deleted file mode 100644
index e355b03..0000000
--- a/res/drawable/ic_sysbar_power_menu_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/power.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M16.56,5.44L15.11,6.89C16.84,7.94 18,9.83 18,12A6,6 0 0,1 12,18A6,6 0 0,1 6,12C6,9.83 7.16,7.94 8.88,6.88L7.44,5.44C5.36,6.88 4,9.28 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12C20,9.28 18.64,6.88 16.56,5.44M13,3H11V13H13" />
-</vector>
diff --git a/res/drawable/ic_sysbar_recent.xml b/res/drawable/ic_sysbar_recent.xml
deleted file mode 100644
index 626b2d7..0000000
--- a/res/drawable/ic_sysbar_recent.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="21dp"
-    android:height="21dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_overview"
-        android:pathData="M14.01,19.99C13.73,16.72 16.63,13.75 19.92,14.03C35.29,13.94 50.66,14.06 66.03,13.97C68.2,14.01 70.73,13.86 72.33,15.61C74.13,17.21 74.01,19.77 74.06,21.97C74.03,36.98 74.05,52 74.06,67.02C73.99,68.58 73.87,70.18 73.32,71.65C71.62,73.28 69.39,74.21 67.01,74.02C51.66,73.99 36.3,73.99 20.95,74.02C18.54,74.22 16.33,73.23 14.61,71.59C13.88,69.13 13.9,66.54 13.93,64.01C14.03,49.34 13.86,34.66 14.01,19.99Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_recent_dark.xml b/res/drawable/ic_sysbar_recent_dark.xml
deleted file mode 100644
index abcc52d..0000000
--- a/res/drawable/ic_sysbar_recent_dark.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (c) 2016 AICP
-
-    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="20dp"
-    android:height="20dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M14.01,19.99C13.73,16.72 16.63,13.75 19.92,14.03C35.29,13.94 50.66,14.06 66.03,13.97C68.2,14.01 70.73,13.86 72.33,15.61C74.13,17.21 74.01,19.77 74.06,21.97C74.03,36.98 74.05,52 74.06,67.02C73.99,68.58 73.87,70.18 73.32,71.65C71.62,73.28 69.39,74.21 67.01,74.02C51.66,73.99 36.3,73.99 20.95,74.02C18.54,74.22 16.33,73.23 14.61,71.59C13.88,69.13 13.9,66.54 13.93,64.01C14.03,49.34 13.86,34.66 14.01,19.99Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_recent_land.xml b/res/drawable/ic_sysbar_recent_land.xml
deleted file mode 100644
index 626b2d7..0000000
--- a/res/drawable/ic_sysbar_recent_land.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="21dp"
-    android:height="21dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_overview"
-        android:pathData="M14.01,19.99C13.73,16.72 16.63,13.75 19.92,14.03C35.29,13.94 50.66,14.06 66.03,13.97C68.2,14.01 70.73,13.86 72.33,15.61C74.13,17.21 74.01,19.77 74.06,21.97C74.03,36.98 74.05,52 74.06,67.02C73.99,68.58 73.87,70.18 73.32,71.65C71.62,73.28 69.39,74.21 67.01,74.02C51.66,73.99 36.3,73.99 20.95,74.02C18.54,74.22 16.33,73.23 14.61,71.59C13.88,69.13 13.9,66.54 13.93,64.01C14.03,49.34 13.86,34.66 14.01,19.99Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_recent_land_dark.xml b/res/drawable/ic_sysbar_recent_land_dark.xml
deleted file mode 100644
index abcc52d..0000000
--- a/res/drawable/ic_sysbar_recent_land_dark.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (c) 2016 AICP
-
-    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="20dp"
-    android:height="20dp"
-    android:viewportWidth="88"
-    android:viewportHeight="88">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M14.01,19.99C13.73,16.72 16.63,13.75 19.92,14.03C35.29,13.94 50.66,14.06 66.03,13.97C68.2,14.01 70.73,13.86 72.33,15.61C74.13,17.21 74.01,19.77 74.06,21.97C74.03,36.98 74.05,52 74.06,67.02C73.99,68.58 73.87,70.18 73.32,71.65C71.62,73.28 69.39,74.21 67.01,74.02C51.66,73.99 36.3,73.99 20.95,74.02C18.54,74.22 16.33,73.23 14.61,71.59C13.88,69.13 13.9,66.54 13.93,64.01C14.03,49.34 13.86,34.66 14.01,19.99Z"/>
-</vector>
diff --git a/res/drawable/ic_sysbar_record_screen.xml b/res/drawable/ic_sysbar_record_screen.xml
deleted file mode 100644
index 0a42e80..0000000
--- a/res/drawable/ic_sysbar_record_screen.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- drawable/file_video.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_screenrecord" android:pathData="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z" /></vector>
diff --git a/res/drawable/ic_sysbar_record_screen_dark.xml b/res/drawable/ic_sysbar_record_screen_dark.xml
deleted file mode 100644
index 0e7ae89..0000000
--- a/res/drawable/ic_sysbar_record_screen_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/file_video.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_region_screenshot.xml b/res/drawable/ic_sysbar_region_screenshot.xml
deleted file mode 100644
index 57594d0..0000000
--- a/res/drawable/ic_sysbar_region_screenshot.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- drawable/image_filter.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="22dp"
-    android:height="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-
-    <path
-        android:fillColor="@color/icon_color_region_screenshot"
-        android:pathData="M1,5H3V19H1V5M5,5H7V19H5V5M22,5H10A1,1 0 0,0 9,6V18A1,1 0 0,0 10,19H22A1,1 0 0,0 23,18V6A1,1 0 0,0 22,5M11,17L13.5,13.85L15.29,16L17.79,12.78L21,17H11Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_region_screenshot_dark.xml b/res/drawable/ic_sysbar_region_screenshot_dark.xml
deleted file mode 100644
index bc0d337..0000000
--- a/res/drawable/ic_sysbar_region_screenshot_dark.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- drawable/image_filter.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-
-    <path
-        android:fillColor="@color/icon_color_dark"
-        android:pathData="M1,5H3V19H1V5M5,5H7V19H5V5M22,5H10A1,1 0 0,0 9,6V18A1,1 0 0,0 10,19H22A1,1 0 0,0 23,18V6A1,1 0 0,0 22,5M11,17L13.5,13.85L15.29,16L17.79,12.78L21,17H11Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_rotate_button.xml b/res/drawable/ic_sysbar_rotate_button.xml
deleted file mode 100644
index 20b80c1..0000000
--- a/res/drawable/ic_sysbar_rotate_button.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/format_list_bulleted_type.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="#FFFFFFFF" android:pathData="m 10.015,9.8169748 -2.77,-1.9075587 2.77,-1.9075586 1.12,0.7712872 -0.85,0.5922385 h 5.16 c 0.72,0 1.31,0.3856436 1.31,0.8676981 V 14.54111 l -1.58,-1.088066 V 8.4534491 h -4.89 l 0.86,0.5922384 z m 3.96,4.3660372 -1.12,0.771287 0.85,0.592238 H 8.825 V 10.546943 L 7.245,9.4519906 v 6.3149144 c 0,0.482055 0.59,0.867698 1.31,0.867698 h 5.16 v 0.0069 l -0.85,0.585352 1.12,0.771287 2.77,-1.907558 z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_rotate_button_dark.xml b/res/drawable/ic_sysbar_rotate_button_dark.xml
deleted file mode 100644
index 33a2b7f..0000000
--- a/res/drawable/ic_sysbar_rotate_button_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/format_list_bulleted_type.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="m 10.015,9.8169748 -2.77,-1.9075587 2.77,-1.9075586 1.12,0.7712872 -0.85,0.5922385 h 5.16 c 0.72,0 1.31,0.3856436 1.31,0.8676981 V 14.54111 l -1.58,-1.088066 V 8.4534491 h -4.89 l 0.86,0.5922384 z m 3.96,4.3660372 -1.12,0.771287 0.85,0.592238 H 8.825 V 10.546943 L 7.245,9.4519906 v 6.3149144 c 0,0.482055 0.59,0.867698 1.31,0.867698 h 5.16 v 0.0069 l -0.85,0.585352 1.12,0.771287 2.77,-1.907558 z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_screen_off.xml b/res/drawable/ic_sysbar_screen_off.xml
deleted file mode 100644
index 79d435b..0000000
--- a/res/drawable/ic_sysbar_screen_off.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/sleep.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_screen_off" android:pathData="M23,12H17V10L20.39,6H17V4H23V6L19.62,10H23V12M15,16H9V14L12.39,10H9V8H15V10L11.62,14H15V16M7,20H1V18L4.39,14H1V12H7V14L3.62,18H7V20Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_screen_off_dark.xml b/res/drawable/ic_sysbar_screen_off_dark.xml
deleted file mode 100644
index 4908ed5..0000000
--- a/res/drawable/ic_sysbar_screen_off_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/sleep.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M23,12H17V10L20.39,6H17V4H23V6L19.62,10H23V12M15,16H9V14L12.39,10H9V8H15V10L11.62,14H15V16M7,20H1V18L4.39,14H1V12H7V14L3.62,18H7V20Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_screenshot.xml b/res/drawable/ic_sysbar_screenshot.xml
deleted file mode 100644
index b74d24d..0000000
--- a/res/drawable/ic_sysbar_screenshot.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<!-- drawable/image_filter.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_screenshot"
-          android:pathData="M8.5,13.5L11,16.5L14.5,12L19,18H5M21,19V5C21,3.89 20.1,3 19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19Z" />
- 	</vector>
diff --git a/res/drawable/ic_sysbar_screenshot_dark.xml b/res/drawable/ic_sysbar_screenshot_dark.xml
deleted file mode 100644
index 3ef81c7..0000000
--- a/res/drawable/ic_sysbar_screenshot_dark.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<!-- drawable/image_filter.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark"
-          android:pathData="M8.5,13.5L11,16.5L14.5,12L19,18H5M21,19V5C21,3.89 20.1,3 19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_search.xml b/res/drawable/ic_sysbar_search.xml
deleted file mode 100644
index 5daf744..0000000
--- a/res/drawable/ic_sysbar_search.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/file_find.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_voice_search" android:pathData="M9,13A3,3 0 0,0 12,16A3,3 0 0,0 15,13A3,3 0 0,0 12,10A3,3 0 0,0 9,13M20,19.59V8L14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18C18.45,22 18.85,21.85 19.19,21.6L14.76,17.17C13.96,17.69 13,18 12,18A5,5 0 0,1 7,13A5,5 0 0,1 12,8A5,5 0 0,1 17,13C17,14 16.69,14.96 16.17,15.75L20,19.59Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_search_dark.xml b/res/drawable/ic_sysbar_search_dark.xml
deleted file mode 100644
index 62c185b..0000000
--- a/res/drawable/ic_sysbar_search_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/file_find.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M9,13A3,3 0 0,0 12,16A3,3 0 0,0 15,13A3,3 0 0,0 12,10A3,3 0 0,0 9,13M20,19.59V8L14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18C18.45,22 18.85,21.85 19.19,21.6L14.76,17.17C13.96,17.69 13,18 12,18A5,5 0 0,1 7,13A5,5 0 0,1 12,8A5,5 0 0,1 17,13C17,14 16.69,14.96 16.17,15.75L20,19.59Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_settings_panel.xml b/res/drawable/ic_sysbar_settings_panel.xml
deleted file mode 100644
index 192c40f..0000000
--- a/res/drawable/ic_sysbar_settings_panel.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/settings_box.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_settings_panel" android:pathData="M17.25,12C17.25,12.23 17.23,12.46 17.2,12.68L18.68,13.84C18.81,13.95 18.85,14.13 18.76,14.29L17.36,16.71C17.27,16.86 17.09,16.92 16.93,16.86L15.19,16.16C14.83,16.44 14.43,16.67 14,16.85L13.75,18.7C13.72,18.87 13.57,19 13.4,19H10.6C10.43,19 10.28,18.87 10.25,18.7L10,16.85C9.56,16.67 9.17,16.44 8.81,16.16L7.07,16.86C6.91,16.92 6.73,16.86 6.64,16.71L5.24,14.29C5.15,14.13 5.19,13.95 5.32,13.84L6.8,12.68C6.77,12.46 6.75,12.23 6.75,12C6.75,11.77 6.77,11.54 6.8,11.32L5.32,10.16C5.19,10.05 5.15,9.86 5.24,9.71L6.64,7.29C6.73,7.13 6.91,7.07 7.07,7.13L8.81,7.84C9.17,7.56 9.56,7.32 10,7.15L10.25,5.29C10.28,5.13 10.43,5 10.6,5H13.4C13.57,5 13.72,5.13 13.75,5.29L14,7.15C14.43,7.32 14.83,7.56 15.19,7.84L16.93,7.13C17.09,7.07 17.27,7.13 17.36,7.29L18.76,9.71C18.85,9.86 18.81,10.05 18.68,10.16L17.2,11.32C17.23,11.54 17.25,11.77 17.25,12M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3M12,10C10.89,10 10,10.89 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12C14,10.89 13.1,10 12,10Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_settings_panel_dark.xml b/res/drawable/ic_sysbar_settings_panel_dark.xml
deleted file mode 100644
index 9f00066..0000000
--- a/res/drawable/ic_sysbar_settings_panel_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/settings_box.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M17.25,12C17.25,12.23 17.23,12.46 17.2,12.68L18.68,13.84C18.81,13.95 18.85,14.13 18.76,14.29L17.36,16.71C17.27,16.86 17.09,16.92 16.93,16.86L15.19,16.16C14.83,16.44 14.43,16.67 14,16.85L13.75,18.7C13.72,18.87 13.57,19 13.4,19H10.6C10.43,19 10.28,18.87 10.25,18.7L10,16.85C9.56,16.67 9.17,16.44 8.81,16.16L7.07,16.86C6.91,16.92 6.73,16.86 6.64,16.71L5.24,14.29C5.15,14.13 5.19,13.95 5.32,13.84L6.8,12.68C6.77,12.46 6.75,12.23 6.75,12C6.75,11.77 6.77,11.54 6.8,11.32L5.32,10.16C5.19,10.05 5.15,9.86 5.24,9.71L6.64,7.29C6.73,7.13 6.91,7.07 7.07,7.13L8.81,7.84C9.17,7.56 9.56,7.32 10,7.15L10.25,5.29C10.28,5.13 10.43,5 10.6,5H13.4C13.57,5 13.72,5.13 13.75,5.29L14,7.15C14.43,7.32 14.83,7.56 15.19,7.84L16.93,7.13C17.09,7.07 17.27,7.13 17.36,7.29L18.76,9.71C18.85,9.86 18.81,10.05 18.68,10.16L17.2,11.32C17.23,11.54 17.25,11.77 17.25,12M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3M12,10C10.89,10 10,10.89 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12C14,10.89 13.1,10 12,10Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_torch.xml b/res/drawable/ic_sysbar_torch.xml
deleted file mode 100644
index 6ded73f..0000000
--- a/res/drawable/ic_sysbar_torch.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/flashlight.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_flashlight" android:pathData="M9,10L6,5H18L15,10H9M18,4H6V2H18V4M9,22V11H15V22H9M12,13A1,1 0 0,0 11,14A1,1 0 0,0 12,15A1,1 0 0,0 13,14A1,1 0 0,0 12,13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_torch_dark.xml b/res/drawable/ic_sysbar_torch_dark.xml
deleted file mode 100644
index 62bcb74..0000000
--- a/res/drawable/ic_sysbar_torch_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/flashlight.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M9,10L6,5H18L15,10H9M18,4H6V2H18V4M9,22V11H15V22H9M12,13A1,1 0 0,0 11,14A1,1 0 0,0 12,15A1,1 0 0,0 13,14A1,1 0 0,0 12,13Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_volume_panel.xml b/res/drawable/ic_sysbar_volume_panel.xml
deleted file mode 100644
index c02ebba..0000000
--- a/res/drawable/ic_sysbar_volume_panel.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/volume_panel.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_volume_panel" android:pathData="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_volume_panel_dark.xml b/res/drawable/ic_sysbar_volume_panel_dark.xml
deleted file mode 100644
index 266ddc1..0000000
--- a/res/drawable/ic_sysbar_volume_panel_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/volume_panel.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_wifi.xml b/res/drawable/ic_sysbar_wifi.xml
deleted file mode 100644
index 796780e..0000000
--- a/res/drawable/ic_sysbar_wifi.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/wifi.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_wifi" android:pathData="M12,21L15.6,16.2C14.6,15.45 13.35,15 12,15C10.65,15 9.4,15.45 8.4,16.2L12,21M12,3C7.95,3 4.21,4.34 1.2,6.6L3,9C5.5,7.12 8.62,6 12,6C15.38,6 18.5,7.12 21,9L22.8,6.6C19.79,4.34 16.05,3 12,3M12,9C9.3,9 6.81,9.89 4.8,11.4L6.6,13.8C8.1,12.67 9.97,12 12,12C14.03,12 15.9,12.67 17.4,13.8L19.2,11.4C17.19,9.89 14.7,9 12,9Z" />
-</vector>
diff --git a/res/drawable/ic_sysbar_wifi_dark.xml b/res/drawable/ic_sysbar_wifi_dark.xml
deleted file mode 100644
index 2c4d014..0000000
--- a/res/drawable/ic_sysbar_wifi_dark.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- drawable/wifi.xml -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="22dp"
-    android:width="22dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@color/icon_color_dark" android:pathData="M12,21L15.6,16.2C14.6,15.45 13.35,15 12,15C10.65,15 9.4,15.45 8.4,16.2L12,21M12,3C7.95,3 4.21,4.34 1.2,6.6L3,9C5.5,7.12 8.62,6 12,6C15.38,6 18.5,7.12 21,9L22.8,6.6C19.79,4.34 16.05,3 12,3M12,9C9.3,9 6.81,9.89 4.8,11.4L6.6,13.8C8.1,12.67 9.97,12 12,12C14.03,12 15.9,12.67 17.4,13.8L19.2,11.4C17.19,9.89 14.7,9 12,9Z" />
-</vector>
diff --git a/res/drawable/smartbar_editmode_color.xml b/res/drawable/smartbar_editmode_color.xml
deleted file mode 100644
index 3e7b298..0000000
--- a/res/drawable/smartbar_editmode_color.xml
+++ /dev/null
@@ -1,20 +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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="rectangle">
-    <solid android:color="@*android:color/accent_device_default_light" />
-</shape>
diff --git a/res/layout-sw600dp/fling_bar.xml b/res/layout-sw600dp/fling_bar.xml
deleted file mode 100644
index ac6fbda..0000000
--- a/res/layout-sw600dp/fling_bar.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
--->
-
-<!--  navigation bar for sw600dp (small tablets) -->
-<com.android.systemui.navigation.fling.FlingView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:prvandroid="http://schemas.android.com/apk/prv/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background" >
-
-    <FrameLayout android:id="@+id/rot0"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        >
-
-        <LinearLayout
-            android:id="@+id/nav_buttons"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:animateLayoutChanges="true"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:orientation="horizontal" >
-
-            <Space
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_weight="1"/>
-
-            <!-- navigation controls -->
-            <com.android.systemui.navigation.fling.FlingLogoView
-                android:id="@+id/fling_console"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:layout_weight="0"
-                android:src="@drawable/ic_eos_fling" />
-
-            <ImageView
-                android:id="@+id/rotationLogo"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:src="@drawable/ic_sysbar_rotate_button"
-                android:layout_weight="1"
-                android:visibility="invisible" />
-
-        </LinearLayout>
-    </FrameLayout>
-
-    <FrameLayout android:id="@+id/rot90"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:visibility="gone"
-        android:paddingTop="0dp"
-        >
-
-        <LinearLayout
-            android:layout_height="match_parent"
-            android:layout_width="match_parent"
-            android:orientation="horizontal"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:id="@+id/nav_buttons"
-            android:animateLayoutChanges="true"
-            >
-
-            <ImageView
-                android:id="@+id/rotationLogo"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:src="@drawable/ic_sysbar_rotate_button"
-                android:layout_weight="1"
-                android:visibility="invisible" />
-
-            <!-- navigation controls -->
-            <com.android.systemui.navigation.fling.FlingLogoView
-                android:id="@+id/fling_console"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:layout_weight="0"
-                android:src="@drawable/ic_eos_fling_land" />
-
-            <Space
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_weight="1"/>
-
-        </LinearLayout>
-    </FrameLayout>
-</com.android.systemui.navigation.fling.FlingView>
diff --git a/res/layout/action_item_vertical.xml b/res/layout/action_item_vertical.xml
deleted file mode 100644
index 93f9d85..0000000
--- a/res/layout/action_item_vertical.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="horizontal"
-    android:layout_width="fill_parent"
-    android:layout_height="96dp"
-    android:clickable="true"
-    android:focusable="true"
-    android:background="@drawable/action_item_btn">
-
-    <ImageView
-        android:id="@+id/iv_icon"
-        android:layout_width="32dp"
-        android:layout_height="32dp"
-        android:scaleType="center" />
-
-    <TextView
-        android:id="@+id/tv_title"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:gravity="center_vertical"
-        android:paddingStart="12dp"
-        android:paddingEnd="10dp"
-        android:textSize="18dp"
-        android:textColor="@color/smartbar_editor_popup_text"/>
-
-</LinearLayout>
diff --git a/res/layout/edit_hint.xml b/res/layout/edit_hint.xml
deleted file mode 100644
index f83877f..0000000
--- a/res/layout/edit_hint.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" >
-
-    <ImageView
-        android:id="@+id/imageView"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:layout_alignParentEnd="true"
-        android:padding="5dp"
-        android:src="@drawable/edit_mode" />
-
-</RelativeLayout>
diff --git a/res/layout/fling_bar.xml b/res/layout/fling_bar.xml
deleted file mode 100644
index 851ffc8..0000000
--- a/res/layout/fling_bar.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
--->
-
-<com.android.systemui.navigation.fling.FlingView xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:prvandroid="http://schemas.android.com/apk/prv/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/system_bar_background" >
-
-    <FrameLayout
-        android:id="@+id/rot0"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" >
-
-        <LinearLayout
-            android:id="@+id/nav_buttons"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_gravity="center"
-            android:animateLayoutChanges="true"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:orientation="horizontal" >
-
-            <Space
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_weight="1"
-                android:visibility="invisible" />
-
-            <com.android.systemui.navigation.fling.FlingLogoView
-                android:id="@+id/fling_console"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:layout_gravity="center"
-                android:layout_weight="0"
-                android:src="@drawable/ic_eos_fling" />
-
-            <ImageView
-                android:id="@+id/rotationLogo"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:src="@drawable/ic_sysbar_rotate_button"
-                android:layout_weight="1"
-                android:visibility="invisible" />
-        </LinearLayout>
-    </FrameLayout>
-
-    <FrameLayout
-        android:id="@+id/rot90"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingTop="0dp"
-        android:visibility="gone" >
-
-        <LinearLayout
-            android:id="@+id/nav_buttons"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_gravity="center"
-            android:animateLayoutChanges="true"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:orientation="vertical" >
-
-            <ImageView
-                android:id="@+id/rotationLogo"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:src="@drawable/ic_sysbar_rotate_button"
-                android:layout_weight="1"
-                android:visibility="invisible" />
-
-            <com.android.systemui.navigation.fling.FlingLogoView
-                android:id="@+id/fling_console"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:layout_weight="0"
-                android:src="@drawable/ic_eos_fling_land" />
-
-            <Space
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_weight="1"
-                android:visibility="invisible" />
-
-        </LinearLayout>
-    </FrameLayout>
-</com.android.systemui.navigation.fling.FlingView>
diff --git a/res/layout/opa_smartbutton.xml b/res/layout/opa_smartbutton.xml
deleted file mode 100644
index aa27da7..0000000
--- a/res/layout/opa_smartbutton.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<com.android.systemui.navigation.OpaLayout android:id="@+id/opa_smartbutton"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    android:clipChildren="false"
-    android:clipToPadding="false"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent" >
-
-    <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent">
-        <ImageView android:id="@+id/red" android:src="@drawable/ic_sysbar_opa_red" android:importantForAccessibility="no" style="@style/DotStyle" />
-        <ImageView android:id="@+id/blue" android:src="@drawable/ic_sysbar_opa_blue" android:importantForAccessibility="no" style="@style/DotStyle" />
-        <ImageView android:id="@+id/green" android:src="@drawable/ic_sysbar_opa_green" android:importantForAccessibility="no" style="@style/DotStyle" />
-        <ImageView android:id="@+id/yellow" android:src="@drawable/ic_sysbar_opa_yellow" android:importantForAccessibility="no" style="@style/DotStyle" />
-    </RelativeLayout>
-
-    <com.android.systemui.navigation.smartbar.SmartButtonView
-        android:layout_gravity="center"
-        android:id="@+id/smartbutton"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:scaleType="center" />
-
-</com.android.systemui.navigation.OpaLayout>
diff --git a/res/layout/popup_vertical.xml b/res/layout/popup_vertical.xml
deleted file mode 100644
index 6396d69..0000000
--- a/res/layout/popup_vertical.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout 
-	xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    >
-	    
-
-	<ScrollView
-	    android:id="@+id/scroller"
-	    android:layout_width="wrap_content"
-	    android:layout_height="wrap_content"
-	    android:layout_marginTop="16dip"
-	    android:background="@color/smartbar_editor_popup_background"
-	    android:fadingEdgeLength="5dip"
-	    android:scrollbars="none" >
-        
-    	<LinearLayout
-	    	android:id="@+id/tracks"
-	    	android:orientation="vertical"
-	        android:layout_width="wrap_content"
-	        android:layout_height="wrap_content"
-	        android:layout_weight="1"
-	        android:padding="10dip"/>
-       
-	</ScrollView >
- 	
- 	<ImageView
-        android:id="@+id/arrow_up"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="@drawable/arrow_up" />
-        
- 	<ImageView
-        android:id="@+id/arrow_down"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-    	android:layout_below="@id/scroller"
-      	android:layout_marginTop="-4dip"
-        android:src="@drawable/arrow_down" />
-
-</RelativeLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-af/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-ar/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
deleted file mode 100644
index aac8ec3..0000000
--- a/res/values-ca/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Cap acció</string>
-  <string name="label_action_settings_panel">Panell QS</string>
-  <string name="label_action_notification_panel">Panell de notificacions</string>
-  <string name="label_action_screenshot">Captura de pantalla</string>
-  <string name="label_action_screenrecord">Enregistra la pantalla</string>
-  <string name="label_action_expanded_desktop">Escriptori ampliat</string>
-  <string name="label_action_screen_off">Apaga la pantalla</string>
-  <string name="label_action_force_close_app">Força el tancament de l\'aplicació</string>
-  <string name="label_action_search_assistant">Assistent de cerca</string>
-  <string name="label_action_google_now_on_tap">Google Assistent</string>
-  <string name="label_action_voice_search">Cerca per veu</string>
-  <string name="label_action_in_app_search">Cerca dins l\'aplicació</string>
-  <string name="label_action_flashlight">Llanterna</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">Wi-Fi</string>
-  <string name="label_action_hotspot">Punt d\'accés</string>
-  <string name="label_action_last_app">Darrera aplicació</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Menú d\'apagat</string>
-  <string name="label_action_menu">Menú</string>
-  <string name="label_action_back">Enrere</string>
-  <string name="label_action_home">Inici</string>
-  <string name="label_action_ime_switcher">IME canviador</string>
-  <string name="label_action_stop_screenpinning">Atura la fixació de pantalla</string>
-  <string name="label_action_ime_down">Mètode d\'entrada cursor cap avall</string>
-  <string name="label_action_ime_left">Mètode d\'entrada cursor cap a l\'esquerra</string>
-  <string name="label_action_ime_right">Mètode d\'entrada cursor cap a la dreta</string>
-  <string name="label_action_ime_up">Mètode d\'entrada cursor cap dalt</string>
-  <string name="label_action_volume_panel">Panell de volum</string>
-  <string name="label_action_clear_notifications">Esborra les notificacions</string>
-  <string name="label_action_editing_smartbar">Editor de la Smartbar</string>
-  <string name="label_action_split_screen">Pantalla dividida</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Accions</string>
-  <string name="label_smartbar_icon">Icona</string>
-  <string name="label_smartbar_add">Afegeix</string>
-  <string name="label_smartbar_remove">Elimina</string>
-  <string name="label_smartbar_cancel">Cancel·la</string>
-  <string name="label_smartbar_finish">Finalitza</string>
-  <string name="label_smartbar_single_tap">Un toc</string>
-  <string name="label_smartbar_double_tap">Doble toc</string>
-  <string name="label_smartbar_long_press">Pulsació perllongada</string>
-  <string name="label_smartbar_icon_pack">Paquet d\'icones</string>
-  <string name="label_smartbar_icon_gallery">Galeria</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reinicia</string>
-  <string name="smartbar_editor_toast_starting">S\'està iniciant l\'edició del navegador</string>
-  <string name="smartbar_editor_toast_stopping">S\'està aturant l\'edició del navegador</string>
-  <string name="smartbar_editor_toast_unavailable">L\'edició del navegador no es troba disponible</string>
-  <string name="edit_mode">Mode d\'edició</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s finalitzades</string>
-</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
deleted file mode 100644
index 4aca5db..0000000
--- a/res/values-cs/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Žádné akce</string>
-  <string name="label_action_settings_panel">Panel QS</string>
-  <string name="label_action_notification_panel">Notifikační panel</string>
-  <string name="label_action_screenshot">Snímek obrazovky</string>
-  <string name="label_action_screenrecord">Záznam obrazovky</string>
-  <string name="label_action_expanded_desktop">Rozšířená plocha</string>
-  <string name="label_action_screen_off">Vypnout obrazovku</string>
-  <string name="label_action_force_close_app">Vynutit ukončení aplikace</string>
-  <string name="label_action_search_assistant">Vyhledávací asistent</string>
-  <string name="label_action_google_now_on_tap">Google asistent</string>
-  <string name="label_action_voice_search">Hlasové vyhledávání</string>
-  <string name="label_action_in_app_search">Hledat v aplikacích</string>
-  <string name="label_action_flashlight">Svítilna</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Poslední aplikace</string>
-  <string name="label_action_overview">Nedávné</string>
-  <string name="label_action_power_menu">Nabídka Vypnout</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Zpět</string>
-  <string name="label_action_home">Domovská stránka</string>
-  <string name="label_action_ime_switcher">Editor IME</string>
-  <string name="label_action_stop_screenpinning">Vypnout připnutí obrazovky</string>
-  <string name="label_action_ime_down">Vstupní metoda kurzor dolů</string>
-  <string name="label_action_ime_left">Vstupní metoda kurzor doleva</string>
-  <string name="label_action_ime_right">Vstupní metoda kurzor vpravo</string>
-  <string name="label_action_ime_up">Vstupní metoda kurzor nahoru</string>
-  <string name="label_action_volume_panel">Panel hlasitosti</string>
-  <string name="label_action_clear_notifications">Vymazat oznámení</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Akce</string>
-  <string name="label_smartbar_icon">Ikona</string>
-  <string name="label_smartbar_add">Přidat</string>
-  <string name="label_smartbar_remove">Odebrat</string>
-  <string name="label_smartbar_cancel">Storno</string>
-  <string name="label_smartbar_finish">Dokončit</string>
-  <string name="label_smartbar_single_tap">Jediným klepnutím</string>
-  <string name="label_smartbar_double_tap">Dvojité poklepání</string>
-  <string name="label_smartbar_long_press">Dlouhý stisk</string>
-  <string name="label_smartbar_icon_pack">Balík ikon</string>
-  <string name="label_smartbar_icon_gallery">Galerie</string>
-  <string name="label_smartbar_icon_color">Barva</string>
-  <string name="label_smartbar_icon_reset">Resetovat</string>
-  <string name="smartbar_editor_toast_starting">Výchozí navigační editor</string>
-  <string name="smartbar_editor_toast_stopping">Zastavující navigační editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigační editor není k dispozici</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-da/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
deleted file mode 100644
index bf7b4ec..0000000
--- a/res/values-de/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Keine Aktion</string>
-  <string name="label_action_settings_panel">Schnelleinstellungen</string>
-  <string name="label_action_notification_panel">Benachrichtigungsfeld</string>
-  <string name="label_action_screenshot">Bildschirmfoto</string>
-  <string name="label_action_screenrecord">Bildschirmaufnahme</string>
-  <string name="label_action_expanded_desktop">Erweiterter Desktop</string>
-  <string name="label_action_screen_off">Bildschirm ausschalten</string>
-  <string name="label_action_force_close_app">App beenden</string>
-  <string name="label_action_search_assistant">Suchassistent</string>
-  <string name="label_action_google_now_on_tap">Google assistent</string>
-  <string name="label_action_voice_search">Sprachsuche</string>
-  <string name="label_action_in_app_search">In-App-Suche</string>
-  <string name="label_action_flashlight">Taschenlampe</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WLAN</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Letzte App</string>
-  <string name="label_action_overview">Anwendungsverlauf</string>
-  <string name="label_action_power_menu">Startmenü</string>
-  <string name="label_action_menu">Menü</string>
-  <string name="label_action_back">Zurück</string>
-  <string name="label_action_home">Startbildschirm</string>
-  <string name="label_action_ime_switcher">IME-wechsler</string>
-  <string name="label_action_stop_screenpinning">Bildschirm anheften stoppen</string>
-  <string name="label_action_ime_down">Eingabemethode Cursor unten</string>
-  <string name="label_action_ime_left">Eingabemethode Cursor links</string>
-  <string name="label_action_ime_right">Eingabemethode Cursor rechts</string>
-  <string name="label_action_ime_up">Eingabemethode Cursor oben</string>
-  <string name="label_action_volume_panel">Lautstärkeregler</string>
-  <string name="label_action_clear_notifications">Benachrichtigungen löschen</string>
-  <string name="label_action_editing_smartbar">SmartBar-Editor</string>
-  <string name="label_action_split_screen">Geteilter Bildschirm</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Aktionen</string>
-  <string name="label_smartbar_icon">Symbol</string>
-  <string name="label_smartbar_add">Hinzufügen</string>
-  <string name="label_smartbar_remove">Entfernen</string>
-  <string name="label_smartbar_cancel">Abbrechen</string>
-  <string name="label_smartbar_finish">Beenden</string>
-  <string name="label_smartbar_single_tap">Einmal tippen</string>
-  <string name="label_smartbar_double_tap">Doppelt tippen</string>
-  <string name="label_smartbar_long_press">Lang drücken</string>
-  <string name="label_smartbar_icon_pack">Symbol-Paket</string>
-  <string name="label_smartbar_icon_gallery">Galerie</string>
-  <string name="label_smartbar_icon_color">Farbe</string>
-  <string name="label_smartbar_icon_reset">Zurücksetzen</string>
-  <string name="smartbar_editor_toast_starting">Navigation-Editor starten</string>
-  <string name="smartbar_editor_toast_stopping">Navigation-Editor stoppen</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation-Editor nicht verfügbar</string>
-  <string name="edit_mode">Bearbeitungsmodus</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s beendet</string>
-</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-el/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
deleted file mode 100644
index 3c4131d..0000000
--- a/res/values-es/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Sin acción</string>
-  <string name="label_action_settings_panel">Panel QS</string>
-  <string name="label_action_notification_panel">Panel de notificaciones</string>
-  <string name="label_action_screenshot">Captura de pantalla</string>
-  <string name="label_action_screenrecord">Grabar Pantalla</string>
-  <string name="label_action_expanded_desktop">Escritorio extendido</string>
-  <string name="label_action_screen_off">Apagar pantalla</string>
-  <string name="label_action_force_close_app">Forzar cierre de app</string>
-  <string name="label_action_search_assistant">Asistente de búsqueda</string>
-  <string name="label_action_google_now_on_tap">Google asistente</string>
-  <string name="label_action_voice_search">Búsqueda por voz</string>
-  <string name="label_action_in_app_search">Búsqueda en la aplicación</string>
-  <string name="label_action_flashlight">Linterna</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">Wi-Fi</string>
-  <string name="label_action_hotspot">Zona Wi-Fi</string>
-  <string name="label_action_last_app">Última aplicación</string>
-  <string name="label_action_overview">Recientes</string>
-  <string name="label_action_power_menu">Menú de apagado</string>
-  <string name="label_action_menu">Menú</string>
-  <string name="label_action_back">Volver</string>
-  <string name="label_action_home">Inicio</string>
-  <string name="label_action_ime_switcher">Selector IME</string>
-  <string name="label_action_stop_screenpinning">Detener fijado de pantalla</string>
-  <string name="label_action_ime_down">Método de entrada el cursor hacia abajo</string>
-  <string name="label_action_ime_left">Método de entrada el cursor hacia izquierda</string>
-  <string name="label_action_ime_right">Método de entrada el cursor hacia derecha</string>
-  <string name="label_action_ime_up">Método de entrada el cursor hacia arriba</string>
-  <string name="label_action_volume_panel">Panel de volumen</string>
-  <string name="label_action_clear_notifications">Borrar notificaciones</string>
-  <string name="label_action_editing_smartbar">Editor de Smartbar</string>
-  <string name="label_action_split_screen">Pantalla dividida</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Acciones</string>
-  <string name="label_smartbar_icon">Icono</string>
-  <string name="label_smartbar_add">Agregar</string>
-  <string name="label_smartbar_remove">Eliminar</string>
-  <string name="label_smartbar_cancel">Cancelar</string>
-  <string name="label_smartbar_finish">Finalizar</string>
-  <string name="label_smartbar_single_tap">Un toque</string>
-  <string name="label_smartbar_double_tap">Doble toque</string>
-  <string name="label_smartbar_long_press">Pulsación larga</string>
-  <string name="label_smartbar_icon_pack">Paquete de iconos</string>
-  <string name="label_smartbar_icon_gallery">Galería</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Restablecer</string>
-  <string name="smartbar_editor_toast_starting">Empezar editor de barra de navegacion</string>
-  <string name="smartbar_editor_toast_stopping">Terminando editor de barra de navegacion</string>
-  <string name="smartbar_editor_toast_unavailable">Editor de barra de navegacion no disponible</string>
-  <string name="edit_mode">Modo de edición</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s finalizada</string>
-</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
deleted file mode 100644
index 466a7ce..0000000
--- a/res/values-fi/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Ei toimintoa</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Laajennettu työpöytä</string>
-  <string name="label_action_screen_off">Näyttö pois päältä</string>
-  <string name="label_action_force_close_app">Pakota sovelluksen sulkeminen</string>
-  <string name="label_action_search_assistant">Haku</string>
-  <string name="label_action_google_now_on_tap">Google avustaja</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Taskulamppu</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Mobiilitukiasema</string>
-  <string name="label_action_last_app">Viimeisin sovellus</string>
-  <string name="label_action_overview">Viimeaikaiset</string>
-  <string name="label_action_power_menu">Virtanappi-valikko</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Syöttötavan valitsimen osoitin, vasen</string>
-  <string name="label_action_ime_right">Syöttötavan valitsimen osoitin, oikea</string>
-  <string name="label_action_ime_up">Syöttötavan valitsimen osoitin, ylös</string>
-  <string name="label_action_volume_panel">Äänenvoimakkuus paneeli</string>
-  <string name="label_action_clear_notifications">Tyhjennä ilmoitukset</string>
-  <string name="label_action_editing_smartbar">Smartbar editori</string>
-  <string name="label_action_split_screen">Jaettu näyttö</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
deleted file mode 100644
index 25cc357..0000000
--- a/res/values-fr/strings.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <!-- Bindable action labels -->
-    <string name="label_action_no_action">Aucune action</string>
-    <string name="label_action_settings_panel">Panneau de configuration rapide</string>
-    <string name="label_action_notification_panel">Volet de notification</string>
-    <string name="label_action_screenshot">Capture d\'écran</string>
-    <string name="label_action_region_screenshot">Capture d\'écran partielle</string>
-    <string name="label_action_screenrecord">Capture vidéo</string>
-    <string name="label_action_expanded_desktop">Bureau étendu</string>
-    <string name="label_action_screen_off">Mise en veille</string>
-    <string name="label_action_force_close_app">Forcer l\'arrêt de l\'application</string>
-    <string name="label_action_search_assistant">Recherche</string>
-    <string name="label_action_google_now_on_tap">Assistant Google</string>
-    <string name="label_action_voice_search">Recherche vocale</string>
-    <string name="label_action_in_app_search">Recherche dans l\'application</string>
-    <string name="label_action_flashlight">Lampe de poche</string>
-    <string name="label_action_bluetooth">Bluetooth</string>
-    <string name="label_action_wifi">Wi-Fi</string>
-    <string name="label_action_hotspot">Partage de connexion</string>
-    <string name="label_action_last_app">Dernière application</string>
-    <string name="label_action_overview">Applications récentes</string>
-    <string name="label_action_power_menu">Menu marche/arrêt</string>
-    <string name="label_action_menu">Menu</string>
-    <string name="label_action_back">Retour</string>
-    <string name="label_action_home">Accueil</string>
-    <string name="label_action_ime_switcher">Sélecteur de clavier</string>
-    <string name="label_action_stop_screenpinning">Annuler l\'épinglage de l\'écran</string>
-    <string name="label_action_ime_down">Curseur bas</string>
-    <string name="label_action_ime_left">Curseur gauche</string>
-    <string name="label_action_ime_right">Curseur droit</string>
-    <string name="label_action_ime_up">Curseur haut</string>
-    <string name="label_action_volume_panel">Panneau de volume</string>
-    <string name="label_action_clear_notifications">Supprimer les notifications</string>
-    <string name="label_action_editing_smartbar">Menu d\'édition</string>
-    <string name="label_action_split_screen">Écran partagé</string>
-    <string name="label_action_one_handed_mode_left">Utilisation à une main (gaucher)</string>
-    <string name="label_action_one_handed_mode_right">Utilisation à une main (droitier)</string>
-    <string name="label_action_media_left">Titre musical précédent</string>
-    <string name="label_action_media_right">Titre musical suivant</string>
-
-    <!-- Smartbar -->
-    <string name="label_smartbar_actions">Actions</string>
-    <string name="label_smartbar_icon">Icône</string>
-    <string name="label_smartbar_add">Ajouter</string>
-    <string name="label_smartbar_remove">Supprimer</string>
-    <string name="label_smartbar_cancel">Annuler</string>
-    <string name="label_smartbar_finish">Terminé</string>
-    <string name="label_smartbar_single_tap">Appui simple</string>
-    <string name="label_smartbar_double_tap">Double appui</string>
-    <string name="label_smartbar_long_press">Appui prolongé</string>
-    <string name="label_smartbar_icon_pack">Pack d\'icônes</string>
-    <string name="label_smartbar_icon_gallery">Galerie</string>
-    <string name="label_smartbar_icon_color">Couleur</string>
-    <string name="label_smartbar_icon_reset">Réinitialiser</string>
-    <string name="smartbar_editor_toast_starting">Démarrage du menu d\'édition de SmartBar</string>
-    <string name="smartbar_editor_toast_stopping">Arrêt du menu d\'édition de SmartBar</string>
-    <string name="smartbar_editor_toast_unavailable">Menu d\'édition de SmartBar non disponible</string>
-    <string name="edit_mode">Modifier</string>
-
-    <!-- App killed message -->
-    <string name="app_killed_message">Fermeture forcée de %s</string>
-
-</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
deleted file mode 100644
index 50e30de..0000000
--- a/res/values-hu/strings.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Nincs művelet</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Értesítési panel</string>
-  <string name="label_action_screenshot">Képernyőmentés</string>
-  <string name="label_action_region_screenshot">Részleges képernyőmentés</string>
-  <string name="label_action_screenrecord">Képernyő felvétel</string>
-  <string name="label_action_expanded_desktop">Kiterjesztett képernyő</string>
-  <string name="label_action_screen_off">Képernyő kikapcsolása</string>
-  <string name="label_action_force_close_app">Alkalmazás kényszerített bezárása</string>
-  <string name="label_action_search_assistant">Keresési segéd</string>
-  <string name="label_action_google_now_on_tap">Google helyettes</string>
-  <string name="label_action_voice_search">hangalapú keresés</string>
-  <string name="label_action_in_app_search">Alkalmazáson belüli keresés</string>
-  <string name="label_action_flashlight">Zseblámpa</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Utolsó alkalmazás</string>
-  <string name="label_action_overview">Előzmények</string>
-  <string name="label_action_power_menu">Kikapcsoló menü</string>
-  <string name="label_action_menu">Menü</string>
-  <string name="label_action_back">Vissza</string>
-  <string name="label_action_home">Kezdőlap</string>
-  <string name="label_action_ime_switcher">IME váltó</string>
-  <string name="label_action_stop_screenpinning">Képernyő rögzítés feloldása</string>
-  <string name="label_action_ime_down">Beviteli mód kurzor le</string>
-  <string name="label_action_ime_left">Beviteli mód kurzor balra</string>
-  <string name="label_action_ime_right">Beviteli mód kurzor jobbra</string>
-  <string name="label_action_ime_up">Beviteli mód kurzor fel</string>
-  <string name="label_action_volume_panel">Hangerő panel</string>
-  <string name="label_action_clear_notifications">Értesítés törlése</string>
-  <string name="label_action_editing_smartbar">Smartbar szerkesztő</string>
-  <string name="label_action_split_screen">Osztott képernyő</string>
-  <string name="label_action_one_handed_mode_left">Egykezes mód (bal oldalon)</string>
-  <string name="label_action_one_handed_mode_right">Egykezes mód (jobb oldalon)</string>
-  <string name="label_action_media_left">Előző szám</string>
-  <string name="label_action_media_right">Következő szám</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Műveletek</string>
-  <string name="label_smartbar_icon">Ikon</string>
-  <string name="label_smartbar_add">Hozzáadás</string>
-  <string name="label_smartbar_remove">Eltávolítás</string>
-  <string name="label_smartbar_cancel">Mégsem</string>
-  <string name="label_smartbar_finish">Befejezés</string>
-  <string name="label_smartbar_single_tap">Egyszerű érintés</string>
-  <string name="label_smartbar_double_tap">Dupla érintés</string>
-  <string name="label_smartbar_long_press">Hosszan nyomva</string>
-  <string name="label_smartbar_icon_pack">Ikon csomag</string>
-  <string name="label_smartbar_icon_gallery">Galéria</string>
-  <string name="label_smartbar_icon_color">Szín</string>
-  <string name="label_smartbar_icon_reset">Visszaállítás</string>
-  <string name="smartbar_editor_toast_starting">Navigációs sáv szerkesztő elindítva</string>
-  <string name="smartbar_editor_toast_stopping">Navigációs sáv szerkesztő megállítva</string>
-  <string name="smartbar_editor_toast_unavailable">Navigációs sáv szerkesztő nem érhető el</string>
-  <string name="edit_mode">Szerkesztési mód</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s kilőve</string>
-</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
deleted file mode 100644
index 8994815..0000000
--- a/res/values-it/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Nessuna azione</string>
-  <string name="label_action_settings_panel">Pannello QS</string>
-  <string name="label_action_notification_panel">Pannello delle Notifiche</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Registra schermo</string>
-  <string name="label_action_expanded_desktop">Desktop esteso</string>
-  <string name="label_action_screen_off">Spegni lo schermo</string>
-  <string name="label_action_force_close_app">Chiusura forzata app</string>
-  <string name="label_action_search_assistant">Assistente di ricerca</string>
-  <string name="label_action_google_now_on_tap">Google assistente</string>
-  <string name="label_action_voice_search">Ricerca vocale</string>
-  <string name="label_action_in_app_search">Ricerca in applicazioni</string>
-  <string name="label_action_flashlight">Torcia</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Switch all\'ultima applicazione</string>
-  <string name="label_action_overview">App Recenti</string>
-  <string name="label_action_power_menu">Menu tasto accensione</string>
-  <string name="label_action_menu">Menù</string>
-  <string name="label_action_back">Indietro</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">Metodo inserimento</string>
-  <string name="label_action_stop_screenpinning">Interrompi blocco sullo schermo</string>
-  <string name="label_action_ime_down">Metodo di input cursore giù</string>
-  <string name="label_action_ime_left">Metodo di input cursore sinistra</string>
-  <string name="label_action_ime_right">Metodo di input cursore destra</string>
-  <string name="label_action_ime_up">Metodo di input cursore sù</string>
-  <string name="label_action_volume_panel">Pannello volume</string>
-  <string name="label_action_clear_notifications">Cancella le notifiche</string>
-  <string name="label_action_editing_smartbar">Modifica SmartBar</string>
-  <string name="label_action_split_screen">Dividi schermo</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Azioni</string>
-  <string name="label_smartbar_icon">Icona</string>
-  <string name="label_smartbar_add">Aggiungi</string>
-  <string name="label_smartbar_remove">Rimuovi</string>
-  <string name="label_smartbar_cancel">Cancella</string>
-  <string name="label_smartbar_finish">Termina</string>
-  <string name="label_smartbar_single_tap">Tap singolo</string>
-  <string name="label_smartbar_double_tap">Doppio tap</string>
-  <string name="label_smartbar_long_press">Pressione prolungata</string>
-  <string name="label_smartbar_icon_pack">Pacchetto icone</string>
-  <string name="label_smartbar_icon_gallery">Galleria</string>
-  <string name="label_smartbar_icon_color">Colore</string>
-  <string name="label_smartbar_icon_reset">Ripristina</string>
-  <string name="smartbar_editor_toast_starting">Avvio editor di navigazione</string>
-  <string name="smartbar_editor_toast_stopping">Arresto editor di navigazione</string>
-  <string name="smartbar_editor_toast_unavailable">Editor di navigazione non disponibile</string>
-  <string name="edit_mode">Modalità modifica</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s terminata</string>
-</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-iw/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
deleted file mode 100644
index df695e6..0000000
--- a/res/values-ja/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">なし</string>
-  <string name="label_action_settings_panel">QSを設定する</string>
-  <string name="label_action_notification_panel">通知パネル</string>
-  <string name="label_action_screenshot">スクリーンショット</string>
-  <string name="label_action_screenrecord">画面を録画</string>
-  <string name="label_action_expanded_desktop">拡張デスクトップ</string>
-  <string name="label_action_screen_off">画面をオフにする</string>
-  <string name="label_action_force_close_app">アプリを強制終了</string>
-  <string name="label_action_search_assistant">検索アシスタント</string>
-  <string name="label_action_google_now_on_tap">Google アシスタント</string>
-  <string name="label_action_voice_search">音声検索</string>
-  <string name="label_action_in_app_search">アプリ内検索</string>
-  <string name="label_action_flashlight">フラッシュライト</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">最後に使用したアプリ</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">電源メニュー</string>
-  <string name="label_action_menu">メニュー</string>
-  <string name="label_action_back">戻る</string>
-  <string name="label_action_home">ホーム</string>
-  <string name="label_action_ime_switcher">IME Changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">音量パネル</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">スマートバーエディター</string>
-  <string name="label_action_split_screen">分割画面</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">アクション</string>
-  <string name="label_smartbar_icon">アイコン</string>
-  <string name="label_smartbar_add">追加</string>
-  <string name="label_smartbar_remove">削除</string>
-  <string name="label_smartbar_cancel">キャンセル</string>
-  <string name="label_smartbar_finish">終了</string>
-  <string name="label_smartbar_single_tap">シングルタップ</string>
-  <string name="label_smartbar_double_tap">ダブルタップ</string>
-  <string name="label_smartbar_long_press">長押しタップ</string>
-  <string name="label_smartbar_icon_pack">アイコンパック</string>
-  <string name="label_smartbar_icon_gallery">ギャラリー</string>
-  <string name="label_smartbar_icon_color">色</string>
-  <string name="label_smartbar_icon_reset">リセット</string>
-  <string name="smartbar_editor_toast_starting">ナビゲーションエディターを開始しました</string>
-  <string name="smartbar_editor_toast_stopping">ナビゲーションエディターを停止しました</string>
-  <string name="smartbar_editor_toast_unavailable">ナビゲーションエディターを使用できません</string>
-  <string name="edit_mode">編集モード</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-ko/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
deleted file mode 100644
index 36d9bde..0000000
--- a/res/values-nl/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Geen actie</string>
-  <string name="label_action_settings_panel">Instellingen QS</string>
-  <string name="label_action_notification_panel">Notificatie paneel</string>
-  <string name="label_action_screenshot">Schermafbeelding</string>
-  <string name="label_action_screenrecord">Scherm opnemen</string>
-  <string name="label_action_expanded_desktop">Uitgebreid bureaublad</string>
-  <string name="label_action_screen_off">Scherm uitschakelen</string>
-  <string name="label_action_force_close_app">App geforceerd afsluiten</string>
-  <string name="label_action_search_assistant">Zoekassistent</string>
-  <string name="label_action_google_now_on_tap">Google assistent</string>
-  <string name="label_action_voice_search">Gesproken zoekopdrachten</string>
-  <string name="label_action_in_app_search">Zoeken in apps</string>
-  <string name="label_action_flashlight">Zaklamp</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Vorige app</string>
-  <string name="label_action_overview">Recent</string>
-  <string name="label_action_power_menu">Power Menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Vorige</string>
-  <string name="label_action_home">Startpagina</string>
-  <string name="label_action_ime_switcher">Invoermethode</string>
-  <string name="label_action_stop_screenpinning">Stoppen met het scherm vastzetten</string>
-  <string name="label_action_ime_down">Invoermethode cursor omlaag</string>
-  <string name="label_action_ime_left">Invoermethode cursor links</string>
-  <string name="label_action_ime_right">Invoermethode cursor rechts</string>
-  <string name="label_action_ime_up">Invoermethode cursor omhoog</string>
-  <string name="label_action_volume_panel">Volume paneel</string>
-  <string name="label_action_clear_notifications">Melding wissen</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Scherm opsplitsen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Acties</string>
-  <string name="label_smartbar_icon">Pictogram</string>
-  <string name="label_smartbar_add">Toevoegen</string>
-  <string name="label_smartbar_remove">Verwijderen</string>
-  <string name="label_smartbar_cancel">Annuleren</string>
-  <string name="label_smartbar_finish">Voltooien</string>
-  <string name="label_smartbar_single_tap">Enkele klik</string>
-  <string name="label_smartbar_double_tap">Dubbel klikken</string>
-  <string name="label_smartbar_long_press">Lang indrukken</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallerij</string>
-  <string name="label_smartbar_icon_color">Kleur</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Navigatie editor aan het starten</string>
-  <string name="smartbar_editor_toast_stopping">Navigatie editor aan het stoppen</string>
-  <string name="smartbar_editor_toast_unavailable">Navigatie editor niet beschiktbaar</string>
-  <string name="edit_mode">Bewerkingsmodus</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%Applicatie gestopt</string>
-</resources>
diff --git a/res/values-no-rNO/strings.xml b/res/values-no-rNO/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-no-rNO/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
deleted file mode 100644
index 37ce078..0000000
--- a/res/values-pl/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Brak akcji</string>
-  <string name="label_action_settings_panel">Panel QS</string>
-  <string name="label_action_notification_panel">Panel powiadomień</string>
-  <string name="label_action_screenshot">Zrzut ekranu</string>
-  <string name="label_action_screenrecord">Nagrywaj ekran</string>
-  <string name="label_action_expanded_desktop">Rozszerzony pulpit</string>
-  <string name="label_action_screen_off">Wyłączanie ekranu</string>
-  <string name="label_action_force_close_app">Wymuś zamknięcie</string>
-  <string name="label_action_search_assistant">Asystent wyszukiwania</string>
-  <string name="label_action_google_now_on_tap">Google asystent</string>
-  <string name="label_action_voice_search">Wyszukiwanie głosowe</string>
-  <string name="label_action_in_app_search">Wyszukaj w aplikacji</string>
-  <string name="label_action_flashlight">Latarka</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Punkt dostępu</string>
-  <string name="label_action_last_app">Ostatnia aplikacja</string>
-  <string name="label_action_overview">Ostatnio uruchomione</string>
-  <string name="label_action_power_menu">Menu zasilania</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Wróć</string>
-  <string name="label_action_home">Strona Główna</string>
-  <string name="label_action_ime_switcher">Zmiana metody wprowadzania</string>
-  <string name="label_action_stop_screenpinning">Zatrzymaj przypinanie ekranu</string>
-  <string name="label_action_ime_down">Metoda wprowadzania kursor w dół</string>
-  <string name="label_action_ime_left">Metoda wprowadzania kursor w lewo</string>
-  <string name="label_action_ime_right">Metoda wprowadzania kursor w prawo</string>
-  <string name="label_action_ime_up">Metoda wprowadzania kursor w górę</string>
-  <string name="label_action_volume_panel">Panel głośności</string>
-  <string name="label_action_clear_notifications">Usuń powiadomienia</string>
-  <string name="label_action_editing_smartbar">Edycja SmartBar</string>
-  <string name="label_action_split_screen">Podzielony ekran</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Akcje</string>
-  <string name="label_smartbar_icon">Ikona</string>
-  <string name="label_smartbar_add">Dodaj</string>
-  <string name="label_smartbar_remove">Usuń</string>
-  <string name="label_smartbar_cancel">Anuluj</string>
-  <string name="label_smartbar_finish">Zakończ</string>
-  <string name="label_smartbar_single_tap">Pojedyncze dotknięcie</string>
-  <string name="label_smartbar_double_tap">Dwukrotne dotknięcie</string>
-  <string name="label_smartbar_long_press">Przytrzymanie</string>
-  <string name="label_smartbar_icon_pack">Pakiet ikon</string>
-  <string name="label_smartbar_icon_gallery">Galeria</string>
-  <string name="label_smartbar_icon_color">Kolor</string>
-  <string name="label_smartbar_icon_reset">Resetuj</string>
-  <string name="smartbar_editor_toast_starting">Rozpoczęto edycję paska nawigacji</string>
-  <string name="smartbar_editor_toast_stopping">Zakończono edycję paska nawigacji</string>
-  <string name="smartbar_editor_toast_unavailable">Edytor paska nawigacji jest niedostępny</string>
-  <string name="edit_mode">Tryb edycji</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s zabitych</string>
-</resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 70d7b32..0000000
--- a/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Sem ação</string>
-  <string name="label_action_settings_panel">Painel QS</string>
-  <string name="label_action_notification_panel">Painel de notificação</string>
-  <string name="label_action_screenshot">Captura de tela</string>
-  <string name="label_action_screenrecord">Tela de Gravação</string>
-  <string name="label_action_expanded_desktop">Área de trabalho expandida</string>
-  <string name="label_action_screen_off">Desligar a tela</string>
-  <string name="label_action_force_close_app">Forçar fechamento do app</string>
-  <string name="label_action_search_assistant">Assistente de busca</string>
-  <string name="label_action_google_now_on_tap">Google assistente</string>
-  <string name="label_action_voice_search">Pesquisa por voz</string>
-  <string name="label_action_in_app_search">Pesquisa dentro do app</string>
-  <string name="label_action_flashlight">Lanterna</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Ponto de acesso</string>
-  <string name="label_action_last_app">Último app</string>
-  <string name="label_action_overview">Recentes</string>
-  <string name="label_action_power_menu">Menu do botão Liga/Desliga</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Voltar</string>
-  <string name="label_action_home">Página inicial</string>
-  <string name="label_action_ime_switcher">Alterador de IME</string>
-  <string name="label_action_stop_screenpinning">Parar fixação da tela</string>
-  <string name="label_action_ime_down">Cursor método de entrada para baixo</string>
-  <string name="label_action_ime_left">Cursor método de entrada esquerda</string>
-  <string name="label_action_ime_right">Método de entrada cursor para a direita</string>
-  <string name="label_action_ime_up">Método de entrada cursor para cima</string>
-  <string name="label_action_volume_panel">Painel de volume</string>
-  <string name="label_action_clear_notifications">Limpar notificações</string>
-  <string name="label_action_editing_smartbar">Editor de Barra Inteligente</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Ações</string>
-  <string name="label_smartbar_icon">Ícone</string>
-  <string name="label_smartbar_add">Adicionar</string>
-  <string name="label_smartbar_remove">Excluir</string>
-  <string name="label_smartbar_cancel">Cancelar</string>
-  <string name="label_smartbar_finish">Concluir</string>
-  <string name="label_smartbar_single_tap">Toque único</string>
-  <string name="label_smartbar_double_tap">Toque duplo</string>
-  <string name="label_smartbar_long_press">Segurar</string>
-  <string name="label_smartbar_icon_pack">Pacote de ícones</string>
-  <string name="label_smartbar_icon_gallery">Galeria</string>
-  <string name="label_smartbar_icon_color">Cor</string>
-  <string name="label_smartbar_icon_reset">Redefinir</string>
-  <string name="smartbar_editor_toast_starting">Iniciando edição do navegador</string>
-  <string name="smartbar_editor_toast_stopping">Parando edição do navegador</string>
-  <string name="smartbar_editor_toast_unavailable">Editor de navegação não está disponível</string>
-  <string name="edit_mode">Modo de edição</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 1f0ae5e..0000000
--- a/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Sem ação</string>
-  <string name="label_action_settings_panel">Painel QS</string>
-  <string name="label_action_notification_panel">Painel de Notificações</string>
-  <string name="label_action_screenshot">Captura de ecrã</string>
-  <string name="label_action_screenrecord">Gravar ecrã</string>
-  <string name="label_action_expanded_desktop">Ambiente de trabalho expandido</string>
-  <string name="label_action_screen_off">Desligar o ecrã</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Assistente de pesquisa</string>
-  <string name="label_action_google_now_on_tap">Google assistente</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
deleted file mode 100644
index cd52381..0000000
--- a/res/values-ro/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Nicio acţiune</string>
-  <string name="label_action_settings_panel">Panoul QS</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
deleted file mode 100644
index 8426c99..0000000
--- a/res/values-ru/strings.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Нет действия</string>
-  <string name="label_action_settings_panel">Панель QS</string>
-  <string name="label_action_notification_panel">Панель уведомлений</string>
-  <string name="label_action_screenshot">Скриншот</string>
-  <string name="label_action_region_screenshot">Скриншот выбранной области экрана</string>
-  <string name="label_action_screenrecord">Запись экрана</string>
-  <string name="label_action_expanded_desktop">Расширенный экран</string>
-  <string name="label_action_screen_off">Выключить экран</string>
-  <string name="label_action_force_close_app">Принудительно закрыть приложение</string>
-  <string name="label_action_search_assistant">Поисковый помощник</string>
-  <string name="label_action_google_now_on_tap">Google помощник</string>
-  <string name="label_action_voice_search">Голосовой поиск</string>
-  <string name="label_action_in_app_search">Поиск в приложении</string>
-  <string name="label_action_flashlight">Фонарик</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">Wi-Fi</string>
-  <string name="label_action_hotspot">Точка доступа</string>
-  <string name="label_action_last_app">Последнее приложение</string>
-  <string name="label_action_overview">Недавние</string>
-  <string name="label_action_power_menu">Меню кнопки питания</string>
-  <string name="label_action_menu">Меню</string>
-  <string name="label_action_back">Назад</string>
-  <string name="label_action_home">Домой</string>
-  <string name="label_action_ime_switcher">Выбор способа ввода</string>
-  <string name="label_action_stop_screenpinning">Остановить закрепление экрана </string>
-  <string name="label_action_ime_down">Способ ввода курсор вниз</string>
-  <string name="label_action_ime_left">Способ ввода курсор влево</string>
-  <string name="label_action_ime_right">Способ ввода курсор вправо</string>
-  <string name="label_action_ime_up">Способ ввода курсор вверх</string>
-  <string name="label_action_volume_panel">Панель громкости</string>
-  <string name="label_action_clear_notifications">Удалить уведомления</string>
-  <string name="label_action_editing_smartbar">Редактор Smartbar</string>
-  <string name="label_action_split_screen">Разделение экрана</string>
-  <string name="label_action_one_handed_mode_left">Режим одной руки (слева)</string>
-  <string name="label_action_one_handed_mode_right">Режим одной руки (справа)</string>
-  <string name="label_action_media_left">Предыдущий трек</string>
-  <string name="label_action_media_right">Следующий трек</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Действия</string>
-  <string name="label_smartbar_icon">Значок</string>
-  <string name="label_smartbar_add">Добавить </string>
-  <string name="label_smartbar_remove">Удалить</string>
-  <string name="label_smartbar_cancel">Отмена</string>
-  <string name="label_smartbar_finish">Готово</string>
-  <string name="label_smartbar_single_tap">Одиночное нажатие</string>
-  <string name="label_smartbar_double_tap">Двойное нажатие</string>
-  <string name="label_smartbar_long_press">Долгое нажатие</string>
-  <string name="label_smartbar_icon_pack">Набор значков</string>
-  <string name="label_smartbar_icon_gallery">Галерея</string>
-  <string name="label_smartbar_icon_color">Цвет</string>
-  <string name="label_smartbar_icon_reset">Сброс</string>
-  <string name="smartbar_editor_toast_starting">Запуск редактора панели навигации</string>
-  <string name="smartbar_editor_toast_stopping">Остановка редактора панели навигации</string>
-  <string name="smartbar_editor_toast_unavailable">Редактор панели навигации недоступен</string>
-  <string name="edit_mode">Режим редактирования</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">Приложение %s закрыто</string>
-</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-sr/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
deleted file mode 100644
index 0144575..0000000
--- a/res/values-sv/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Ingen åtgärd</string>
-  <string name="label_action_settings_panel">QS Panel</string>
-  <string name="label_action_notification_panel">Notifieringspanel</string>
-  <string name="label_action_screenshot">Skärmbild</string>
-  <string name="label_action_screenrecord">Skärminspelning</string>
-  <string name="label_action_expanded_desktop">Utökat skrivbord</string>
-  <string name="label_action_screen_off">Stänga av skärmen</string>
-  <string name="label_action_force_close_app">Tvinga stängning av app</string>
-  <string name="label_action_search_assistant">Sökassistent</string>
-  <string name="label_action_google_now_on_tap">Google assistent</string>
-  <string name="label_action_voice_search">Röstsökning</string>
-  <string name="label_action_in_app_search">Sökning i app</string>
-  <string name="label_action_flashlight">Ficklampa</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Senaste app</string>
-  <string name="label_action_overview">Senaste</string>
-  <string name="label_action_power_menu">Avstängningsmeny</string>
-  <string name="label_action_menu">Meny</string>
-  <string name="label_action_back">Tillbaka</string>
-  <string name="label_action_home">Hem</string>
-  <string name="label_action_ime_switcher">IME-växlare</string>
-  <string name="label_action_stop_screenpinning">Stoppa fastlåsning av skärm</string>
-  <string name="label_action_ime_down">Inmatningsmetod nedre markören</string>
-  <string name="label_action_ime_left">Inmatningsmetod pil vänster</string>
-  <string name="label_action_ime_right">Inmatningsmetod markörknappen höger</string>
-  <string name="label_action_ime_up">Inmatningsmetod markören uppåt</string>
-  <string name="label_action_volume_panel">Volym panel</string>
-  <string name="label_action_clear_notifications">Ta bort meddelandet</string>
-  <string name="label_action_editing_smartbar">Redigera Smartbar</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Åtgärder</string>
-  <string name="label_smartbar_icon">Ikon</string>
-  <string name="label_smartbar_add">Lägg till</string>
-  <string name="label_smartbar_remove">Ta bort</string>
-  <string name="label_smartbar_cancel">Avbryt</string>
-  <string name="label_smartbar_finish">Slutför</string>
-  <string name="label_smartbar_single_tap">Enkeltryck</string>
-  <string name="label_smartbar_double_tap">Dubbeltryck</string>
-  <string name="label_smartbar_long_press">Långtryck</string>
-  <string name="label_smartbar_icon_pack">Ikonpaket</string>
-  <string name="label_smartbar_icon_gallery">Galleri</string>
-  <string name="label_smartbar_icon_color">Färg</string>
-  <string name="label_smartbar_icon_reset">Återställ</string>
-  <string name="smartbar_editor_toast_starting">Starta navigationseditor</string>
-  <string name="smartbar_editor_toast_stopping">Stoppa navigeringseditor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigeringseditor ej tillgänglig</string>
-  <string name="edit_mode">Redigeringsläge</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
deleted file mode 100644
index 4371bc8..0000000
--- a/res/values-tr/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Eylem yok</string>
-  <string name="label_action_settings_panel">QS paneli</string>
-  <string name="label_action_notification_panel">Bildirim paneli</string>
-  <string name="label_action_screenshot">Ekran görüntüsü</string>
-  <string name="label_action_screenrecord">Kayıt ekranı</string>
-  <string name="label_action_expanded_desktop">Genişletilmiş masaüstü</string>
-  <string name="label_action_screen_off">Ekranı kapat</string>
-  <string name="label_action_force_close_app">Kapatmaya zorla</string>
-  <string name="label_action_search_assistant">Arama asistanı</string>
-  <string name="label_action_google_now_on_tap">Google asistanı</string>
-  <string name="label_action_voice_search">Sesli arama</string>
-  <string name="label_action_in_app_search">Uygulama içi arama</string>
-  <string name="label_action_flashlight">El Feneri</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Son uygulama</string>
-  <string name="label_action_overview">Son İşlemler</string>
-  <string name="label_action_power_menu">Güç menüsü</string>
-  <string name="label_action_menu">Menü</string>
-  <string name="label_action_back">Geri</string>
-  <string name="label_action_home">Ana Ekran</string>
-  <string name="label_action_ime_switcher">IME değiştirici</string>
-  <string name="label_action_stop_screenpinning">Ekran sabitlemeyi durdur</string>
-  <string name="label_action_ime_down">Aşagı imleç giriş yöntemi</string>
-  <string name="label_action_ime_left">Sol imleç giriş yontemi</string>
-  <string name="label_action_ime_right">Sağ imleç giriş yöntemi</string>
-  <string name="label_action_ime_up">Yukarı imleç giriş yöntemi</string>
-  <string name="label_action_volume_panel">Ses paneli</string>
-  <string name="label_action_clear_notifications">Bildirimleri temizle</string>
-  <string name="label_action_editing_smartbar">Smartbar düzenleyici</string>
-  <string name="label_action_split_screen">Bölünmüş ekran</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Eylemler</string>
-  <string name="label_smartbar_icon">Ikon</string>
-  <string name="label_smartbar_add">Ekle</string>
-  <string name="label_smartbar_remove">Kaldır</string>
-  <string name="label_smartbar_cancel">İptal</string>
-  <string name="label_smartbar_finish">Bitti</string>
-  <string name="label_smartbar_single_tap">Tek dokunma</string>
-  <string name="label_smartbar_double_tap">Çift dokunma</string>
-  <string name="label_smartbar_long_press">Uzun basma</string>
-  <string name="label_smartbar_icon_pack">Simge Paketi</string>
-  <string name="label_smartbar_icon_gallery">Galeri</string>
-  <string name="label_smartbar_icon_color">Renk</string>
-  <string name="label_smartbar_icon_reset">Sıfırla</string>
-  <string name="smartbar_editor_toast_starting">Gezinti çubuğu düzenleyici başlatılıyor</string>
-  <string name="smartbar_editor_toast_stopping">Gezinti çubuğu düzenleyici durduruluyor</string>
-  <string name="smartbar_editor_toast_unavailable">Gezinti düzenleyici kullanılamaz</string>
-  <string name="edit_mode">Düzenleme modu</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s sonlandırıldı</string>
-</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
deleted file mode 100644
index 94e8a26..0000000
--- a/res/values-uk/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">Немає дій</string>
-  <string name="label_action_settings_panel">Група QS</string>
-  <string name="label_action_notification_panel">Панель сповіщень</string>
-  <string name="label_action_screenshot">Знімок екрану</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Пошуковий асистент</string>
-  <string name="label_action_google_now_on_tap">Google асистент</string>
-  <string name="label_action_voice_search">Голосовий пошук</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Точка доступу</string>
-  <string name="label_action_last_app">Останній додаток</string>
-  <string name="label_action_overview">Нещодавні</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Головна</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Панель гучності</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Дії</string>
-  <string name="label_smartbar_icon">Значок</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Готово</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Подвійне натискання</string>
-  <string name="label_smartbar_long_press">Довге натискання</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Скинути</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
deleted file mode 100644
index 9b587c5..0000000
--- a/res/values-vi/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">No action</string>
-  <string name="label_action_settings_panel">QS panel</string>
-  <string name="label_action_notification_panel">Notification panel</string>
-  <string name="label_action_screenshot">Screenshot</string>
-  <string name="label_action_screenrecord">Record screen</string>
-  <string name="label_action_expanded_desktop">Expanded desktop</string>
-  <string name="label_action_screen_off">Turn off screen</string>
-  <string name="label_action_force_close_app">Force close app</string>
-  <string name="label_action_search_assistant">Search assistant</string>
-  <string name="label_action_google_now_on_tap">Google assistant</string>
-  <string name="label_action_voice_search">Voice search</string>
-  <string name="label_action_in_app_search">In-app search</string>
-  <string name="label_action_flashlight">Flashlight</string>
-  <string name="label_action_bluetooth">Bluetooth</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">Hotspot</string>
-  <string name="label_action_last_app">Last app</string>
-  <string name="label_action_overview">Recents</string>
-  <string name="label_action_power_menu">Power menu</string>
-  <string name="label_action_menu">Menu</string>
-  <string name="label_action_back">Back</string>
-  <string name="label_action_home">Home</string>
-  <string name="label_action_ime_switcher">IME changer</string>
-  <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-  <string name="label_action_ime_down">Input method cursor down</string>
-  <string name="label_action_ime_left">Input method cursor left</string>
-  <string name="label_action_ime_right">Input method cursor right</string>
-  <string name="label_action_ime_up">Input method cursor up</string>
-  <string name="label_action_volume_panel">Volume panel</string>
-  <string name="label_action_clear_notifications">Clear notifications</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">Actions</string>
-  <string name="label_smartbar_icon">Icon</string>
-  <string name="label_smartbar_add">Add</string>
-  <string name="label_smartbar_remove">Remove</string>
-  <string name="label_smartbar_cancel">Cancel</string>
-  <string name="label_smartbar_finish">Finish</string>
-  <string name="label_smartbar_single_tap">Single tap</string>
-  <string name="label_smartbar_double_tap">Double tap</string>
-  <string name="label_smartbar_long_press">Long press</string>
-  <string name="label_smartbar_icon_pack">Icon pack</string>
-  <string name="label_smartbar_icon_gallery">Gallery</string>
-  <string name="label_smartbar_icon_color">Color</string>
-  <string name="label_smartbar_icon_reset">Reset</string>
-  <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-  <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-  <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 558ba9e..0000000
--- a/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">无动作</string>
-  <string name="label_action_settings_panel">QS面板</string>
-  <string name="label_action_notification_panel">通知面板</string>
-  <string name="label_action_screenshot">屏幕截图</string>
-  <string name="label_action_screenrecord">屏幕录像</string>
-  <string name="label_action_expanded_desktop">扩展桌面</string>
-  <string name="label_action_screen_off">关闭屏幕</string>
-  <string name="label_action_force_close_app">强制关闭应用</string>
-  <string name="label_action_search_assistant">搜索助手</string>
-  <string name="label_action_google_now_on_tap">Google 助理</string>
-  <string name="label_action_voice_search">语音搜索</string>
-  <string name="label_action_in_app_search">应用内搜索</string>
-  <string name="label_action_flashlight">手电筒</string>
-  <string name="label_action_bluetooth">蓝牙</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">热点</string>
-  <string name="label_action_last_app">上次运行应用</string>
-  <string name="label_action_overview">最近任务</string>
-  <string name="label_action_power_menu">电源菜单</string>
-  <string name="label_action_menu">菜单键</string>
-  <string name="label_action_back">返回键</string>
-  <string name="label_action_home">主页键</string>
-  <string name="label_action_ime_switcher">输入法切换</string>
-  <string name="label_action_stop_screenpinning">停止屏幕固定</string>
-  <string name="label_action_ime_down">输入法光标下</string>
-  <string name="label_action_ime_left">输入法光标左</string>
-  <string name="label_action_ime_right">输入法光标右</string>
-  <string name="label_action_ime_up">输入法光标上</string>
-  <string name="label_action_volume_panel">声音面板</string>
-  <string name="label_action_clear_notifications">清除通知</string>
-  <string name="label_action_editing_smartbar">Smartbar 编辑器</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">动作</string>
-  <string name="label_smartbar_icon">图标</string>
-  <string name="label_smartbar_add">添加</string>
-  <string name="label_smartbar_remove">移除</string>
-  <string name="label_smartbar_cancel">取消</string>
-  <string name="label_smartbar_finish">完成</string>
-  <string name="label_smartbar_single_tap">单击</string>
-  <string name="label_smartbar_double_tap">双击</string>
-  <string name="label_smartbar_long_press">长按</string>
-  <string name="label_smartbar_icon_pack">图标包</string>
-  <string name="label_smartbar_icon_gallery">图库</string>
-  <string name="label_smartbar_icon_color">颜色</string>
-  <string name="label_smartbar_icon_reset">重置</string>
-  <string name="smartbar_editor_toast_starting">开始编辑导航栏</string>
-  <string name="smartbar_editor_toast_stopping">停止编辑导航栏</string>
-  <string name="smartbar_editor_toast_unavailable">导航编辑器不可用</string>
-  <string name="edit_mode">编辑模式</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
deleted file mode 100644
index f751e5a..0000000
--- a/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--Generated by crowdin.com-->
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <!-- Bindable action labels -->
-  <string name="label_action_no_action">沒有動作</string>
-  <string name="label_action_settings_panel">QS面板</string>
-  <string name="label_action_notification_panel">通知面板</string>
-  <string name="label_action_screenshot">擷取螢幕畫面</string>
-  <string name="label_action_screenrecord">錄製螢幕</string>
-  <string name="label_action_expanded_desktop">擴展桌面</string>
-  <string name="label_action_screen_off">關閉螢幕</string>
-  <string name="label_action_force_close_app">強制關閉應用程式</string>
-  <string name="label_action_search_assistant">搜尋助手</string>
-  <string name="label_action_google_now_on_tap">Google 助理助理</string>
-  <string name="label_action_voice_search">語音搜尋</string>
-  <string name="label_action_in_app_search">應用程式內搜尋</string>
-  <string name="label_action_flashlight">手電筒</string>
-  <string name="label_action_bluetooth">藍芽</string>
-  <string name="label_action_wifi">WiFi</string>
-  <string name="label_action_hotspot">可攜式無線基地台</string>
-  <string name="label_action_last_app">最後使用的應用程式</string>
-  <string name="label_action_overview">總覽</string>
-  <string name="label_action_power_menu">電源功能表</string>
-  <string name="label_action_menu">選單</string>
-  <string name="label_action_back">返回</string>
-  <string name="label_action_home">主畫面</string>
-  <string name="label_action_ime_switcher">輸入法切換</string>
-  <string name="label_action_stop_screenpinning">停止螢幕固定</string>
-  <string name="label_action_ime_down">輸入游標向下</string>
-  <string name="label_action_ime_left">輸入游標向左</string>
-  <string name="label_action_ime_right">輸入游標向右</string>
-  <string name="label_action_ime_up">輸入游標向上</string>
-  <string name="label_action_volume_panel">音量面板</string>
-  <string name="label_action_clear_notifications">清除通知</string>
-  <string name="label_action_editing_smartbar">Smartbar editor</string>
-  <string name="label_action_split_screen">Split screen</string>
-  <!-- Smartbar -->
-  <string name="label_smartbar_actions">動作</string>
-  <string name="label_smartbar_icon">圖示</string>
-  <string name="label_smartbar_add">新增</string>
-  <string name="label_smartbar_remove">移除</string>
-  <string name="label_smartbar_cancel">取消</string>
-  <string name="label_smartbar_finish">完成</string>
-  <string name="label_smartbar_single_tap">單擊</string>
-  <string name="label_smartbar_double_tap">雙擊</string>
-  <string name="label_smartbar_long_press">長按</string>
-  <string name="label_smartbar_icon_pack">圖示包</string>
-  <string name="label_smartbar_icon_gallery">圖片庫</string>
-  <string name="label_smartbar_icon_color">顏色</string>
-  <string name="label_smartbar_icon_reset">重設</string>
-  <string name="smartbar_editor_toast_starting">開始導覽編輯器</string>
-  <string name="smartbar_editor_toast_stopping">停止導覽編輯器</string>
-  <string name="smartbar_editor_toast_unavailable">無法使用導覽編輯器</string>
-  <string name="edit_mode">Edit mode</string>
-  <!-- App killed message -->
-  <string name="app_killed_message">%s killed</string>
-</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
deleted file mode 100644
index 22f6402..0000000
--- a/res/values/colors.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2016 The DirtyUnicorns 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>
-
-    <!-- PopupWindows -->
-    <color name="smartbar_editor_popup_background">@android:color/white</color>
-    <color name="smartbar_editor_popup_text">@android:color/black</color>
-    <color name="smartbar_editor_popup_icon_fill">@*android:color/accent_device_default_light</color>
-    <color name="smartbar_editor_popup_horiz_separator">@*android:color/accent_device_default_light</color>
-
-    <!-- Edit mode -->
-    <color name="edit_mode_check_mark_color">@android:color/white</color>
-
-    <!-- SmartBar icon colors -->
-    <color name="icon_color_default">#fff</color>
-    <color name="icon_color_dark">#212121</color>
-    <color name="icon_color_no_action">@color/icon_color_default</color>
-    <color name="icon_color_settings_panel">@color/icon_color_default</color>
-    <color name="icon_color_notification_panel">@color/icon_color_default</color>
-    <color name="icon_color_screenshot">@color/icon_color_default</color>
-    <color name="icon_color_region_screenshot">@color/icon_color_default</color>
-    <color name="icon_color_screenrecord">@color/icon_color_default</color>
-    <color name="icon_color_expanded_desktop">@color/icon_color_default</color>
-    <color name="icon_color_screen_off">@color/icon_color_default</color>
-    <color name="icon_color_force_close_app">@color/icon_color_default</color>
-    <color name="icon_color_search_assistant">@color/icon_color_default</color>
-    <color name="icon_color_google_now_on_tap">@color/icon_color_default</color>
-    <color name="icon_color_voice_search">@color/icon_color_default</color>
-    <color name="icon_color_in_app_search">@color/icon_color_default</color>
-    <color name="icon_color_flashlight">@color/icon_color_default</color>
-    <color name="icon_color_bluetooth">@color/icon_color_default</color>
-    <color name="icon_color_wifi">@color/icon_color_default</color>
-    <color name="icon_color_hotspot">@color/icon_color_default</color>
-    <color name="icon_color_last_app">@color/icon_color_default</color>
-    <color name="icon_color_overview">@color/icon_color_default</color>
-    <color name="icon_color_power_menu">@color/icon_color_default</color>
-    <color name="icon_color_menu">@color/icon_color_default</color>
-    <color name="icon_color_back">@color/icon_color_default</color>
-    <color name="icon_color_home">@color/icon_color_default</color>
-    <color name="icon_color_ime_switcher">@color/icon_color_default</color>
-    <color name="icon_color_stop_screenpinning">@color/icon_color_default</color>
-    <color name="icon_color_ime_down">@color/icon_color_default</color>
-    <color name="icon_color_ime_left">@color/icon_color_default</color>
-    <color name="icon_color_ime_right">@color/icon_color_default</color>
-    <color name="icon_color_ime_up">@color/icon_color_default</color>
-    <color name="icon_color_volume_panel">@color/icon_color_default</color>
-    <color name="icon_color_clear_notifications">@color/icon_color_default</color>
-    <color name="icon_color_editing_smartbar">@color/icon_color_default</color>
-    <color name="icon_color_split_screen">@color/icon_color_default</color>
-    <color name="icon_color_one_handed_mode">@color/icon_color_default</color>
-    <color name="icon_color_sound_search">@color/icon_color_default</color>
-
-    <!-- Navigation button ripple color -->
-    <color name="navbutton_ripple_color">#FFFFFFFF</color>
-
-</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 202a4a1..6e5b502 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -15,17 +15,6 @@
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <!-- The factor to increase gesture touch slop. It seems the default values
-         from ViewConfiguration are too small for Fling. Often taps and long presses
-         are canceled when they shouldn't be. Applies only to Fling gesture detector
-
-         touchSlop = ViewConfiguration.getTouchSlop() * ((100 + increase_factor) / 100))
-
-         Default value is a 35% increase in allowed "sloppiness".
-         Adjust in overlay for device specific precision -->
-    <item name="config_fling_touchslop_increase_factor" format="float" type="dimen">1.35</item>
-
     <!-- Default bar fill
          User can define this in settings
          Here for reference-->
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
deleted file mode 100644
index 824260d..0000000
--- a/res/values/dimens.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2014 The CyanogenMod 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>
-
-    <!-- SmartBar -->
-    <dimen name="navigation_action_editor_width">120dp</dimen>
-    <dimen name="navigation_action_editor_height">160dp</dimen>
-    <dimen name="navigation_key_height">@dimen/navigation_key_width</dimen>
-    <dimen name="navigation_extra_key_height">@dimen/navigation_extra_key_width</dimen>
-    <dimen name="navigation_key_padding_start_port">25dp</dimen>
-    <dimen name="navigation_key_padding_end_port">25dp</dimen>
-    <dimen name="navigation_key_padding_start_land">42dp</dimen>
-    <dimen name="navigation_key_padding_end_land">42dp</dimen>
-    <dimen name="navigation_key_extra_margin_start">2dp</dimen>
-    <dimen name="navigation_key_extra_margin_end">2dp</dimen>
-    <dimen name="navigation_key_tablet_width_port">128dp</dimen>
-    <dimen name="navigation_key_tablet_width_land">162dp</dimen>
-
-    <!-- OPA home dimens -->
-    <dimen name="halo_inner_radius">10.0dip</dimen>
-    <dimen name="halo_thickness">1.0dip</dimen>
-    <dimen name="halo_diameter">22.0dip</dimen>
-    <dimen name="opa_dot_diam">10.0dip</dimen>
-    <dimen name="opa_diamond_translation">16.0dip</dimen>
-    <dimen name="opa_line_y_translation">16.0dip</dimen>
-    <dimen name="opa_line_x_trans_ry">15.0dip</dimen>
-    <dimen name="opa_line_x_trans_bg">30.0dip</dimen>
-    <dimen name="opa_line_x_collapse_bg">46.0dip</dimen>
-    <dimen name="opa_line_x_collapse_ry">15.0dip</dimen>
-    <dimen name="opa_overshoot_translation">8.0dip</dimen>
-    <dimen name="opa_return_translation">-1.0dip</dimen>
-    <dimen name="opa_rest_to_collapse">7.0dip</dimen>
-</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
deleted file mode 100644
index 3815e21..0000000
--- a/res/values/strings.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2014-2015 The Dirty Unicorns Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <!-- Bindable action labels -->
-    <string name="label_action_no_action">No action</string>
-    <string name="label_action_settings_panel">QS panel</string>
-    <string name="label_action_notification_panel">Notification panel</string>
-    <string name="label_action_screenshot">Screenshot</string>
-    <string name="label_action_region_screenshot">Partial screenshot</string>
-    <string name="label_action_screenrecord">Record screen</string>
-    <string name="label_action_expanded_desktop">Expanded desktop</string>
-    <string name="label_action_screen_off">Turn off screen</string>
-    <string name="label_action_force_close_app">Force close app</string>
-    <string name="label_action_search_assistant">Search assistant</string>
-    <string name="label_action_google_now_on_tap">Google assistant</string>
-    <string name="label_action_voice_search">Voice search</string>
-    <string name="label_action_in_app_search">In-app search</string>
-    <string name="label_action_flashlight">Flashlight</string>
-    <string name="label_action_bluetooth">Bluetooth</string>
-    <string name="label_action_wifi">WiFi</string>
-    <string name="label_action_hotspot">Hotspot</string>
-    <string name="label_action_last_app">Last app</string>
-    <string name="label_action_overview">Recents</string>
-    <string name="label_action_power_menu">Power menu</string>
-    <string name="label_action_menu">Menu</string>
-    <string name="label_action_back">Back</string>
-    <string name="label_action_home">Home</string>
-    <string name="label_action_ime_switcher">IME changer</string>
-    <string name="label_action_stop_screenpinning">Stop screen pinning</string>
-    <string name="label_action_ime_down">Input method cursor down</string>
-    <string name="label_action_ime_left">Input method cursor left</string>
-    <string name="label_action_ime_right">Input method cursor right</string>
-    <string name="label_action_ime_up">Input method cursor up</string>
-    <string name="label_action_volume_panel">Volume panel</string>
-    <string name="label_action_clear_notifications">Clear notifications</string>
-    <string name="label_action_editing_smartbar">Smartbar editor</string>
-    <string name="label_action_split_screen">Split screen</string>
-    <string name="label_action_one_handed_mode_left">One handed mode (left side)</string>
-    <string name="label_action_one_handed_mode_right">One handed mode (right side)</string>
-    <string name="label_action_media_left">Previous track</string>
-    <string name="label_action_media_right">Next track</string>
-    <string name="label_action_assistant_sound_search">Google sound search</string>
-    <string name="label_action_rotation">Rotation</string>
-
-    <!-- Smartbar -->
-    <string name="label_smartbar_actions">Actions</string>
-    <string name="label_smartbar_icon">Icon</string>
-    <string name="label_smartbar_add">Add</string>
-    <string name="label_smartbar_remove">Remove</string>
-    <string name="label_smartbar_cancel">Cancel</string>
-    <string name="label_smartbar_finish">Finish</string>
-    <string name="label_smartbar_single_tap">Single tap</string>
-    <string name="label_smartbar_double_tap">Double tap</string>
-    <string name="label_smartbar_long_press">Long press</string>
-    <string name="label_smartbar_icon_pack">Icon pack</string>
-    <string name="label_smartbar_icon_gallery">Gallery</string>
-    <string name="label_smartbar_icon_color">Color</string>
-    <string name="label_smartbar_icon_reset">Reset</string>
-    <string name="smartbar_editor_toast_starting">Starting navigation editor</string>
-    <string name="smartbar_editor_toast_stopping">Stopping navigation editor</string>
-    <string name="smartbar_editor_toast_unavailable">Navigation editor unavailable</string>
-    <string name="edit_mode">Edit mode</string>
-
-    <!-- App killed message -->
-    <string name="app_killed_message">%s killed</string>
-
-    <!-- Pulse and media arrows blacklist -->
-    <string name="navMediaArrowsExcludeList" translatable="false">
-        chrome,youtube,netflix,firefox,dolphin,opera,browser
-    </string>
-</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
deleted file mode 100644
index f0f9576..0000000
--- a/res/values/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<resources>
-     <style name="Animations" />
-	<!-- PopUpMenu -->
-	<style name="Animations.PopUpMenu" />
-	
-	<style name="Animations.PopUpMenu.Center">
-		<item name="android:windowEnterAnimation">@anim/grow_from_bottom</item>
-		<item name="android:windowExitAnimation">@anim/shrink_from_top</item>
-	</style>
-	
-	<style name="Animations.PopUpMenu.Left">
-		<item name="android:windowEnterAnimation">@anim/grow_from_bottomleft_to_topright</item>
-		<item name="android:windowExitAnimation">@anim/shrink_from_topright_to_bottomleft</item>
-	</style>
-	
-	<style name="Animations.PopUpMenu.Right">
-		<item name="android:windowEnterAnimation">@anim/grow_from_bottomright_to_topleft</item>
-		<item name="android:windowExitAnimation">@anim/shrink_from_topleft_to_bottomright</item>
-	</style>
-	
-	<style name="Animations.PopUpMenu.Reflect">
-		<item name="android:windowEnterAnimation">@anim/pump_bottom</item>
-		<item name="android:windowExitAnimation">@anim/disappear</item>
-	</style>
-    
-    <style name="DotStyle">
-        <item name="android:layout_width">wrap_content</item>
-        <item name="android:layout_height">wrap_content</item>
-        <item name="android:layout_centerHorizontal">true</item>
-        <item name="android:layout_centerVertical">true</item>
-    </style>
-
-</resources>
diff --git a/src/com/android/systemui/navigation/BaseEditor.java b/src/com/android/systemui/navigation/BaseEditor.java
deleted file mode 100644
index 476da32..0000000
--- a/src/com/android/systemui/navigation/BaseEditor.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * Copyright (C) 2016 The DirtyUnicorns Project
- *
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- *
- * Core implementation of a inline navigation editor. Respond to many of the
- * same events BaseNavigationBar does and provide subclasses with information
- * regarding state changes
- *
- */
-
-package com.android.systemui.navigation;
-
-import com.android.systemui.navigation.BaseNavigationBar;
-import com.android.systemui.navigation.Editor;
-import com.android.systemui.R;
-
-import com.android.internal.utils.du.Config.ActionConfig;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.Toast;
-
-public abstract class BaseEditor implements Editor {
-
-    public static final String INTENT_ACTION_EDIT_CLASS = "com.android.settings";
-    public static final String INTENT_ACTION_EDIT_COMPONENT = "com.abc.settings.ActionPickerDialogActivity";
-    public static final String INTENT_ACTION_ICON_PICKER_COMPONENT = "com.abc.settings.IconPickerActivity";
-    public static final String INTENT_ACTION_GALLERY_PICKER_COMPONENT = "com.abc.settings.IconPickerGallery";
-    public static final String INTENT_ICON_PICKER = "intent_icon_picker";
-    public static final String INTENT_GALLERY_PICKER = "intent_gallery_picker";
-    public static final String INTENT_ACTION_PICKER = "intent_action_action_picker";
-    public static final String INTENT_NAVBAR_EDIT_RESET_LAYOUT = "intent_navbar_edit_reset_layout";
-    public static int MODE_ON = 1;
-    public static int MODE_OFF = 2;
-
-    protected Context mContext;
-    protected FrameLayout mFrameLayout;
-    protected WindowManager mWindowManager;
-
-    // we want any incoming hints (menu/ime/disabled) to automatcally
-    // turn off editor. Except when we call these hint handling methods
-    // as part of the editing process
-    protected boolean mLockEditMode;
-    private int mMode = MODE_OFF;
-    private boolean mIsLandscape;
-    private boolean mScreenOn;
-    private boolean mKeyguardShowing;
-    private boolean mScreenPinningOn;
-    private BaseNavigationBar mHost;
-
-    public BaseEditor(BaseNavigationBar host) {
-        mHost = host;
-        mContext = host.getContext();
-        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
-    }
-
-    private void toastState(int state) {
-        if (state == MODE_ON) {
-            editHint();
-        } else if (state == MODE_OFF) {
-            mWindowManager.removeView(mFrameLayout);
-        } else {
-            Toast.makeText(mContext, R.string.smartbar_editor_toast_unavailable,
-            Toast.LENGTH_SHORT).show();
-        }
-    }
-
-    private void editHint() {
-        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
-                WindowManager.LayoutParams.WRAP_CONTENT,
-                WindowManager.LayoutParams.WRAP_CONTENT,
-                WindowManager.LayoutParams.TYPE_PHONE,
-                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
-                PixelFormat.TRANSLUCENT);
-        params.gravity = Gravity.TOP;
-
-        mFrameLayout = new FrameLayout(mContext);
-
-        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
-        mWindowManager.addView(mFrameLayout, params);
-
-        LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        layoutInflater.inflate(R.layout.edit_hint, mFrameLayout);
-
-        final ImageView imageView = (ImageView) mFrameLayout.findViewById(R.id.imageView);
-        imageView.setOnClickListener(new View.OnClickListener() {
-            public void onClick(View v) {
-                toggleNavigationEditor();
-            }
-        });
-    }
-
-    protected abstract void onEditModeChanged(int mode);
-
-    protected abstract void onPrepareToReorient();
-
-    protected abstract void onReorient();
-
-    protected void onActionPicked(String action, ActionConfig actionConfig) {}
-
-    protected void onIconPicked(String type, String packageName, String iconName) {}
-
-    protected void onImagePicked(String uri) {}
-
-    protected void updateResources(Resources res) {}
-
-    protected void onResetLayout() {}
-
-    @Override
-    public void dispatchNavigationEditorResults(Intent intent) {
-        if (intent != null) {
-            String action = intent.getAction();
-            if (TextUtils.equals(INTENT_NAVBAR_EDIT_RESET_LAYOUT, action)) {
-                onResetLayout();
-            } else if (TextUtils.equals(INTENT_ACTION_PICKER, action)) {
-                int result = intent.getIntExtra("result", Activity.RESULT_CANCELED);
-                if (result == Activity.RESULT_OK) {
-                    String actionString = intent.getStringExtra("action_string");
-                    ActionConfig config = intent.getParcelableExtra("action_config");
-                    onActionPicked(actionString, config);
-                }
-            } else if (TextUtils.equals(INTENT_ICON_PICKER, action)) {
-                int result = intent.getIntExtra("result", Activity.RESULT_CANCELED);
-                if (result == Activity.RESULT_OK) {
-                    String iconType = intent.getStringExtra("icon_data_type");
-                    String iconPackage = intent.getStringExtra("icon_data_package");
-                    String iconName = intent.getStringExtra("icon_data_name");
-                    onIconPicked(iconType, iconPackage, iconName);
-                }
-            } else if (TextUtils.equals(INTENT_GALLERY_PICKER, action)) {
-                Log.d("BASEEDITOR", "ICON SELECTED");
-                int result = intent.getIntExtra("result", Activity.RESULT_CANCELED);
-                if (result == Activity.RESULT_OK) {
-                    String uri = intent.getStringExtra("uri");
-                    onImagePicked(uri);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void toggleNavigationEditor() {
-        final int mode = mMode;
-        if (mode == MODE_ON) {
-            changeEditMode(MODE_OFF);
-            mHost.setSlippery(true);
-        } else {
-            if (isEditorAvailable()) {
-                changeEditMode(MODE_ON);
-                mHost.setSlippery(false);
-            } else {
-                toastState(69);
-            }
-        }
-    }
-
-    @Override
-    public final void changeEditMode(int mode) {
-        if (mLockEditMode || mMode == mode)
-            return;
-        mMode = mode;
-        toastState(mode);
-        onEditModeChanged(mode);
-    }
-
-    public boolean isEditorAvailable() {
-        return !mKeyguardShowing
-                && mScreenOn
-                && !mScreenPinningOn
-                && !mHost.mVertical
-                && !mHost.mPulse.shouldDrawPulse()
-                && !mHost.areAnyHintsActive();
-    }
-
-    @Override
-    public final void prepareToReorient() {
-        onPrepareToReorient();
-    }
-
-    @Override
-    public final void reorient(boolean isLandscape) {
-        mIsLandscape = isLandscape;
-        if (mHost.mVertical) {
-            changeEditMode(MODE_OFF);
-        }
-        onReorient();
-    }
-
-    @Override
-    public void setKeyguardShowing(boolean showing) {
-        mKeyguardShowing = showing;
-        if (mKeyguardShowing) {
-            changeEditMode(MODE_OFF);
-        }
-    }
-
-    @Override
-    public void notifyScreenOn(boolean screenOn) {
-        mScreenOn = screenOn;
-        if (!mScreenOn) {
-            changeEditMode(MODE_OFF);
-        }
-    }
-
-    @Override
-    public void screenPinningStateChanged(boolean enabled) {
-        mScreenPinningOn = enabled;
-        if (mScreenPinningOn) {
-            changeEditMode(MODE_OFF);
-        }
-    }
-
-    protected boolean isLandscape() {
-        return mIsLandscape;
-    }
-
-    public int getMode() {
-        return mMode;
-    }
-}
diff --git a/src/com/android/systemui/navigation/BaseNavigationBar.java b/src/com/android/systemui/navigation/BaseNavigationBar.java
deleted file mode 100644
index 0c4e649..0000000
--- a/src/com/android/systemui/navigation/BaseNavigationBar.java
+++ /dev/null
@@ -1,668 +0,0 @@
-/**
- * Copyright (C) 2008 The Android Open Source Project
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- * 
- * Base navigation bar abstraction for managing keyguard policy, internal
- * bar behavior, and everything else not feature implementation specific
- * 
- */
-
-package com.android.systemui.navigation;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-import com.android.systemui.Dependency;
-import com.android.systemui.navigation.Navigator;
-import com.android.systemui.navigation.Res;
-import com.android.systemui.navigation.NavbarOverlayResources;
-import com.android.systemui.navigation.pulse.PulseController;
-import com.android.systemui.navigation.pulse.PulseController.PulseObserver;
-import com.android.systemui.navigation.utils.SmartObserver;
-import com.android.systemui.plugins.statusbar.phone.NavGesture;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.policy.RotationLockController;
-import com.android.systemui.R;
-
-import com.android.internal.utils.du.DUActionUtils;
-import com.android.internal.utils.du.ImageHelper;
-
-import android.animation.LayoutTransition;
-import android.app.StatusBarManager;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PowerManager;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Display;
-import android.view.Surface;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-
-public abstract class BaseNavigationBar extends LinearLayout implements Navigator, PulseObserver {
-    final static String TAG = "PhoneStatusBar/BaseNavigationBar";
-    public final static boolean DEBUG = false;
-    public static final boolean NAVBAR_ALWAYS_AT_RIGHT = true;
-    // slippery nav bar when everything is disabled, e.g. during setup
-    final static boolean SLIPPERY_WHEN_DISABLED = true;
-
-    // workaround for LayoutTransitions leaving the nav buttons in a weird state (bug 5549288)
-    final static boolean WORKAROUND_INVALID_LAYOUT = true;
-    final static int MSG_CHECK_INVALID_LAYOUT = 8686;
-
-    public static final int MSG_SET_DISABLED_FLAGS = 101;
-    public static final int MSG_INVALIDATE = 102;
-    public static boolean sIsTablet;
-
-    private boolean mKeyguardShowing;
-
-    protected H mHandler = new H();
-    protected final Display mDisplay;
-    private final WindowManager mWm;
-    protected View[] mRotatedViews = new View[4];
-    protected View mCurrentView = null;
-    protected FrameLayout mRot0, mRot90;
-    protected int mDisabledFlags = 0;
-    protected int mNavigationIconHints = 0;
-    private int mCurrentRotation = -1;
-    protected boolean mVertical;
-    protected boolean mScreenOn;
-    protected boolean mLeftInLandscape;
-    protected boolean mLayoutTransitionsEnabled;
-    protected boolean mWakeAndUnlocking;
-    protected boolean mScreenPinningEnabled;
-    protected OnVerticalChangedListener mOnVerticalChangedListener;
-    protected SmartObserver mSmartObserver;
-    protected PulseController mPulse;
-
-    public NavbarOverlayResources mResourceMap;
-
-    protected boolean mCarMode = false;
-    protected boolean mDockedStackExists;
-
-    private RotationLockController mRotationLockController;
-
-    private class H extends Handler {
-        public void handleMessage(Message m) {
-            switch (m.what) {
-                case MSG_CHECK_INVALID_LAYOUT:
-                    final String how = "" + m.obj;
-                    final int w = getWidth();
-                    final int h = getHeight();
-                    final int vw = mCurrentView.getWidth();
-                    final int vh = mCurrentView.getHeight();
-
-                    if (h != vh || w != vw) {
-                        Log.w(TAG, String.format(
-                            "*** Invalid layout in navigation bar (%s this=%dx%d cur=%dx%d)",
-                            how, w, h, vw, vh));
-                        if (WORKAROUND_INVALID_LAYOUT) {
-                            requestLayout();
-                        }
-                    }
-                    break;
-                case MSG_SET_DISABLED_FLAGS:
-                    setDisabledFlags(mDisabledFlags, true);
-                    break;
-                case MSG_INVALIDATE:
-                    invalidate();
-                    break;
-            }
-        }
-    }
-
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            onReceivedIntent(intent);
-        }
-    };
-
-    private void onReceivedIntent(Intent intent) {
-        if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
-            notifyScreenStateChange(true);
-        } else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
-            notifyScreenStateChange(false);
-        } else if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
-            notifyBootCompleted();
-        } else {
-            onReceive(intent);
-            if (mPulse != null) {
-                mPulse.onReceive(intent);
-            }
-        }
-    }
-
-    public void onReceive(Intent intent) {
-    }
-
-    public BaseNavigationBar(Context context) {
-        this(context, null);
-    }
-
-    public BaseNavigationBar(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mDisplay = ((WindowManager) context.getSystemService(
-                Context.WINDOW_SERVICE)).getDefaultDisplay();
-        mWm = (WindowManager) context.getSystemService(
-                Context.WINDOW_SERVICE);
-        mSmartObserver = new SmartObserver(mHandler, context.getContentResolver());
-        sIsTablet = !DUActionUtils.navigationBarCanMove();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(AudioManager.STREAM_MUTE_CHANGED_ACTION);
-        filter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
-        filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
-        filter.addAction(Intent.ACTION_SCREEN_ON);
-        filter.addAction(Intent.ACTION_SCREEN_OFF);
-        filter.addAction(Intent.ACTION_BOOT_COMPLETED);
-        context.registerReceiver(mReceiver, filter);
-
-        mRotationLockController = Dependency.get(RotationLockController.class);
-    }
-
-    protected RotationLockController getRotationController() {
-        return mRotationLockController;
-    }
-
-    // require implementation
-    protected abstract void onDispose();
-    protected abstract void notifyBootCompleted();
-
-    // any implementation specific handling can be handled here
-    protected void onInflateFromUser() {}
-
-    protected void onKeyguardShowing(boolean showing){}
-
-    public void abortCurrentGesture(){}
-
-    public void setMenuVisibility(final boolean show) {}
-    public void setMenuVisibility(final boolean show, final boolean force) {} 
-    public void setNavigationIconHints(int hints) {}
-    public void setNavigationIconHints(int hints, boolean force) {}
-    public void onHandlePackageChanged(){}
-
-    public Editor getEditor() { return null; }
-
-    //public boolean isInEditMode() { return false; }
-
-    public void onRecreateStatusbar() {}
-
-    public void setResourceMap(NavbarOverlayResources resourceMap) {
-        mResourceMap = resourceMap;
-        getBarTransitions().updateResources(mResourceMap);
-    }
-
-    public void updateNavbarThemedResources(Resources res){
-        getBarTransitions().updateResources(mResourceMap);
-    }
-
-    public void setRotateSuggestionButtonState(boolean visible, boolean skipAnim) {}
-    public void setLastRotation(int rotation) {}
-
-    @Override
-    public void setControllers(PulseController pulseController) {
-        mPulse = pulseController;
-        mPulse.setPulseObserver(this);
-    }
-
-    protected PulseController getPulseController()  {
-        return mPulse;
-    }
-
-    protected static float alphaIntToFloat(int alpha) {
-        return (float) Math.max(0, Math.min(255, alpha)) / 255;
-    }
-
-    @Override
-    public void setWakeAndUnlocking(boolean wakeAndUnlocking) {
-        setUseFadingAnimations(wakeAndUnlocking);
-        mWakeAndUnlocking = wakeAndUnlocking;
-        updateLayoutTransitionsEnabled();
-    }
-
-    @Override
-    public boolean needsReorient(int rotation) {
-        return mCurrentRotation != rotation;
-    }
-
-    protected boolean areAnyHintsActive() {
-        return ((mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0)
-                || ((mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
-                || (((mDisabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0
-                && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0)));
-
-    }
-
-    private WindowManager.LayoutParams getParamsFromParent() {
-        // we need to get params from the parent container otherwise we'd get FrameLayout params
-        return  (WindowManager.LayoutParams) ((ViewGroup) getParent()).getLayoutParams();
-    }
-
-    protected void setUseFadingAnimations(boolean useFadingAnimations) {
-        WindowManager.LayoutParams lp = getParamsFromParent();
-        if (lp != null) {
-            boolean old = lp.windowAnimations != 0;
-            if (!old && useFadingAnimations) {
-                lp.windowAnimations = R.style.Animation_NavigationBarFadeIn;
-            } else if (old && !useFadingAnimations) {
-                lp.windowAnimations = 0;
-            } else {
-                return;
-            }
-            mWm.updateViewLayout((View) getParent(), lp);
-        }
-    }
-
-    protected void updateLayoutTransitionsEnabled() {
-        boolean enabled = !mWakeAndUnlocking && mLayoutTransitionsEnabled;
-        ViewGroup navButtons = (ViewGroup) getCurrentView().findViewById(R.id.nav_buttons);
-        if (navButtons == null) {
-            navButtons = (ViewGroup) mCurrentView.findViewWithTag(Res.Common.NAV_BUTTONS);
-        }
-        LayoutTransition lt = navButtons.getLayoutTransition();
-        if (lt != null) {
-            if (enabled) {
-                lt.enableTransitionType(LayoutTransition.APPEARING);
-                lt.enableTransitionType(LayoutTransition.DISAPPEARING);
-                lt.enableTransitionType(LayoutTransition.CHANGE_APPEARING);
-                lt.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
-            } else {
-                lt.disableTransitionType(LayoutTransition.APPEARING);
-                lt.disableTransitionType(LayoutTransition.DISAPPEARING);
-                lt.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
-                lt.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
-            }
-        }
-    }
-
-    @Override
-    public void setLayoutTransitionsEnabled(boolean enabled) {
-        mLayoutTransitionsEnabled = enabled;
-        updateLayoutTransitionsEnabled();
-    }
-
-    public int findViewByIdName(String name) {
-        return DUActionUtils.getId(getContext(), name,
-                DUActionUtils.PACKAGE_SYSTEMUI);
-    }
-
-    public void setBackgroundColor(Drawable drawable) {
-        // setBackground(drawable != null ? drawable : null);
-    }
-
-    public void setLeftInLandscape(boolean leftInLandscape) {
-        if (mLeftInLandscape != leftInLandscape) {
-            mLeftInLandscape = leftInLandscape;
-            if (mPulse != null) {
-                mPulse.setLeftInLandscape(leftInLandscape);
-            }
-        }
-    }
-
-    // keep keyguard methods final and use getter to access
-    public final void setKeyguardShowing(boolean showing) {
-        if (mKeyguardShowing != showing) {
-            mKeyguardShowing = showing;
-            if (mPulse != null) {
-                mPulse.setKeyguardShowing(showing);
-            }
-            onKeyguardShowing(showing);
-        }
-    }
-
-    public final boolean isKeyguardShowing() {
-        return mKeyguardShowing;
-    }
-
-    public boolean isLandscape() {
-        return mCurrentView == mRot90;
-    }
-
-    // if a bar instance is created from a user mode switch
-    // PhoneStatusBar should call this. This allows the view
-    // to make adjustments that are otherwise not needed when
-    // inflating on boot, such as setting proper transition flags
-    public final void notifyInflateFromUser() {
-        getBarTransitions().transitionTo(BarTransitions.MODE_TRANSPARENT, false);
-        mScreenOn = true;
-        if (mPulse != null) {
-            mPulse.notifyScreenOn(mScreenOn);
-        }
-        onInflateFromUser();
-    }
-
-    public View getCurrentView() {
-        return mCurrentView;
-    }
-
-    public View getHiddenView() {
-        if (mCurrentView.equals(mRot0)) {
-            return mRot90;
-        } else {
-            return mRot0;
-        }
-    }
-
-    public void setDisabledFlags(int disabledFlags) {
-        setDisabledFlags(disabledFlags, false);
-    }
-
-    public boolean isVertical() {
-        return mVertical;
-    }
-
-    public final void setOnVerticalChangedListener(OnVerticalChangedListener onVerticalChangedListener) {
-        mOnVerticalChangedListener = onVerticalChangedListener;
-        notifyVerticalChangedListener(mVertical);
-    }
-
-    public final void dispose() {
-        mSmartObserver.cleanUp();
-        if (mPulse != null) {
-            mPulse.doUnlinkVisualizer();
-        }
-        onDispose();
-        unsetListeners();
-    }
-
-    private void unsetListeners() {
-        getContext().unregisterReceiver(mReceiver);
-    }
-
-    private void notifyVerticalChangedListener(boolean newVertical) {
-        if (mOnVerticalChangedListener != null) {
-            mOnVerticalChangedListener.onVerticalChanged(mVertical);
-        }
-    }
-
-    public void notifyScreenStateChange(boolean screenOn) {
-        mScreenOn = screenOn;
-        if (mPulse != null) {
-            mPulse.notifyScreenOn(screenOn);
-        }
-        setDisabledFlags(mDisabledFlags, true);
-    }
-
-    public void reorient() {
-        final int rot = mDisplay.getRotation();
-        for (int i=0; i<4; i++) {
-            mRotatedViews[i].setVisibility(View.GONE);
-        }
-        mCurrentView = mRotatedViews[rot];
-        mCurrentView.setVisibility(View.VISIBLE);
-        mCurrentRotation = rot;
-
-        if (DEBUG) {
-            Log.d(TAG, "reorient(): rot=" + mDisplay.getRotation());
-        }
-    }
-
-    protected void setSlippery(boolean newSlippery) {
-        WindowManager.LayoutParams lp = getParamsFromParent();
-        if (lp != null) {
-            boolean oldSlippery = (lp.flags & WindowManager.LayoutParams.FLAG_SLIPPERY) != 0;
-            if (!oldSlippery && newSlippery) {
-                lp.flags |= WindowManager.LayoutParams.FLAG_SLIPPERY;
-            } else if (oldSlippery && !newSlippery) {
-                lp.flags &= ~WindowManager.LayoutParams.FLAG_SLIPPERY;
-            } else {
-                return;
-            }
-            mWm.updateViewLayout((View) getParent(), lp);
-        }
-    }
-
-    public void setNotificationPanelExpanded(boolean expanded) {
-    }
-
-    @Override
-    public void onFinishInflate() {
-        mRot0 = (FrameLayout) findViewById(R.id.rot0);
-        mRot90 = (FrameLayout) findViewById(R.id.rot90);
-        mRotatedViews[Surface.ROTATION_0] =
-        mRotatedViews[Surface.ROTATION_180] = mRot0;
-        mRotatedViews[Surface.ROTATION_90] = mRot90;
-        mRotatedViews[Surface.ROTATION_270] = mRotatedViews[Surface.ROTATION_90];
-        mCurrentView = mRotatedViews[Surface.ROTATION_0];
-    }
-
-    public void setDisabledFlags(int disabledFlags, boolean force) {
-        if (!force && mDisabledFlags == disabledFlags)
-            return;
-        mDisabledFlags = disabledFlags;
-
-        final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
-        final boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0);
-        final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)
-                && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0);
-        final boolean disableSearch = ((disabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0);
-    }
-
-    @Override
-    public final View getBaseView() {
-        return (View)this;
-    }
-
-    @Override
-    public void onPluginConnected(NavGesture plugin, Context context) {
-
-    }
-
-    @Override
-    public void onPluginDisconnected(NavGesture plugin) {
-
-    }
-
-    // for when we don't inflate xml
-    protected void createBaseViews() {
-        LinearLayout rot0NavButton = new LinearLayout(getContext());
-        rot0NavButton.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                LayoutParams.MATCH_PARENT));
-        rot0NavButton.setOrientation(LinearLayout.HORIZONTAL);
-        rot0NavButton.setClipChildren(false);
-        rot0NavButton.setClipToPadding(false);
-        rot0NavButton.setLayoutTransition(new LayoutTransition());
-        rot0NavButton.setTag(Res.Common.NAV_BUTTONS);
-
-        LinearLayout rot90NavButton = new LinearLayout(getContext());
-        rot90NavButton.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                LayoutParams.MATCH_PARENT));
-        rot90NavButton.setOrientation(sIsTablet ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
-        rot90NavButton.setClipChildren(false);
-        rot90NavButton.setClipToPadding(false);
-        rot90NavButton.setLayoutTransition(new LayoutTransition());
-        rot90NavButton.setTag(Res.Common.NAV_BUTTONS);
-
-        mRot0 = new FrameLayout(getContext());
-        mRot0.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                LayoutParams.MATCH_PARENT));
-
-        mRot90 = new FrameLayout(getContext());
-        mRot90.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                LayoutParams.MATCH_PARENT));
-        mRot90.setVisibility(View.GONE);
-        mRot90.setPadding(mRot90.getPaddingLeft(), 0, mRot90.getPaddingRight(),
-                mRot90.getPaddingBottom());
-
-//        addBatteryBarLayout(mRot0);
-        mRot0.addView(rot0NavButton);
-
-//        addBatteryBarLayout(mRot90);
-        mRot90.addView(rot90NavButton);
-
-        addView(mRot0);
-        addView(mRot90);
-
-        mRotatedViews[Surface.ROTATION_0] =
-                mRotatedViews[Surface.ROTATION_180] = mRot0;
-        mRotatedViews[Surface.ROTATION_90] = mRot90;
-        mRotatedViews[Surface.ROTATION_270] = mRotatedViews[Surface.ROTATION_90];
-        mCurrentView = mRotatedViews[Surface.ROTATION_0];
-    }
-/*
-    private void addBatteryBarLayout(ViewGroup parent) {
-        int which = -1;
-        if (parent.equals(mRot0)) {
-            which = R.layout.battery_bar_rot0;
-        } else if (parent.equals(mRot90)) {
-            which = R.layout.battery_bar_rot90;
-        } else {
-            return;
-        }
-        try {
-            View bar = View.inflate(getContext(), which, null);
-            parent.addView(bar);
-        } catch (Exception e) {
-            Log.e(TAG, "BatteryBarController failed to inflate");
-        }
-    }
-*/
-    protected void setVisibleOrGone(View view, boolean visible) {
-        if (view != null) {
-            view.setVisibility(visible ? VISIBLE : GONE);
-        }
-    }
-
-    private void postCheckForInvalidLayout(final String how) {
-        mHandler.obtainMessage(MSG_CHECK_INVALID_LAYOUT, 0, 0, how).sendToTarget();
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        if (DEBUG) Log.d(TAG, String.format(
-                    "onSizeChanged: (%dx%d) old: (%dx%d)", w, h, oldw, oldh));
-
-        final boolean newVertical = w > 0 && h > w;
-        if (newVertical != mVertical) {
-            mVertical = newVertical;
-            //Log.v(TAG, String.format("onSizeChanged: h=%d, w=%d, vert=%s", h, w, mVertical?"y":"n"));
-            reorient();
-            notifyVerticalChangedListener(newVertical);
-        }
-        postCheckForInvalidLayout("sizeChanged");
-        if (mPulse != null) {
-            mPulse.onSizeChanged(w, h, oldw, oldh);
-        }
-        super.onSizeChanged(w, h, oldw, oldh);
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-        if (mPulse != null) {
-            mPulse.onDraw(canvas);
-        }
-    }
-
-    @Override
-    public Handler getHandler() {
-        return mHandler;
-    }
-
-    protected String getResourceName(int resId) {
-        if (resId != 0) {
-            final android.content.res.Resources res = getContext().getResources();
-            try {
-                return res.getResourceName(resId);
-            } catch (android.content.res.Resources.NotFoundException ex) {
-                return "(unknown)";
-            }
-        } else {
-            return "(null)";
-        }
-    }
-
-    protected static String visibilityToString(int vis) {
-        switch (vis) {
-            case View.INVISIBLE:
-                return "INVISIBLE";
-            case View.GONE:
-                return "GONE";
-            default:
-                return "VISIBLE";
-        }
-    }
-
-    public Drawable getLocalDrawable(String resName, Resources res) {
-        int id = getDrawableId(resName);
-        Drawable icon = ImageHelper.getVector(res, id, false);
-        if (icon == null) {
-            icon = res.getDrawable(id);
-        }
-        return icon;
-    }
-
-    public int getDrawableId(String resName) {
-        try {
-            int ident = getContext().getResources().getIdentifier(resName, "drawable",
-                    getContext().getPackageName());
-            return ident;
-        } catch (Exception e) {
-            return -1;
-        }
-    }
-
-    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        pw.println("NavigationBarView {");
-        final Rect r = new Rect();
-        final Point size = new Point();
-        mDisplay.getRealSize(size);
-
-        pw.println(String.format("      this: " + viewInfo(this)
-                        + " " + visibilityToString(getVisibility())));
-
-        getWindowVisibleDisplayFrame(r);
-        final boolean offscreen = r.right > size.x || r.bottom > size.y;
-        pw.println("      window: "
-                + r.toShortString()
-                + " " + visibilityToString(getWindowVisibility())
-                + (offscreen ? " OFFSCREEN!" : ""));
-
-        pw.println(String.format("      mCurrentView: id=%s (%dx%d) %s",
-                        getResourceName(mCurrentView.getId()),
-                        mCurrentView.getWidth(), mCurrentView.getHeight(),
-                        visibilityToString(mCurrentView.getVisibility())));
-
-        pw.println("    }");
-    }
-
-    protected static String viewInfo(View v) {
-        return "[(" + v.getLeft() + "," + v.getTop() + ")(" + v.getRight() + "," + v.getBottom()
-                + ") " + v.getWidth() + "x" + v.getHeight() + "]";
-    }
-}
diff --git a/src/com/android/systemui/navigation/DarkIntensity.java b/src/com/android/systemui/navigation/DarkIntensity.java
deleted file mode 100644
index 99fc2ab..0000000
--- a/src/com/android/systemui/navigation/DarkIntensity.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Copyright (C) 2017-2018 The DirtyUnicorns 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.
- * 
- * DUI has about 4 different drawables with different inheritance which
- * needs this method
- * 
- */
-package com.android.systemui.navigation;
-
-public interface DarkIntensity {
-    public void setDarkIntensity(float intensity);
-}
diff --git a/src/com/android/systemui/navigation/Editor.java b/src/com/android/systemui/navigation/Editor.java
deleted file mode 100644
index f069024..0000000
--- a/src/com/android/systemui/navigation/Editor.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- * 
- * Define behaviors of a inline navigation editor
- *
- */
-
-package com.android.systemui.navigation;
-
-import android.content.Intent;
-
-public interface Editor {
-    public abstract void onCommitChanges();
-    public void changeEditMode(int mode);
-    public void prepareToReorient();
-    public void reorient(boolean isLandscape);
-    public void setKeyguardShowing(boolean showing);
-    public void notifyScreenOn(boolean screenOn);
-    public void screenPinningStateChanged(boolean enabled);
-    public void toggleNavigationEditor();
-    public void dispatchNavigationEditorResults(Intent intent);
-}
diff --git a/src/com/android/systemui/navigation/NavbarOverlayResources.java b/src/com/android/systemui/navigation/NavbarOverlayResources.java
deleted file mode 100644
index 9f7158c..0000000
--- a/src/com/android/systemui/navigation/NavbarOverlayResources.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2017 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.navigation;
-
-import com.android.internal.utils.du.ActionHandler.ActionIconResources;
-import com.android.systemui.R;
-import com.android.systemui.navigation.NavbarOverlayResources;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-
-    public class NavbarOverlayResources extends ActionIconResources {
-//      public int mOpaque;
-//      public int mSemiTransparent;
-//      public int mTransparent;
-//      public int mWarning;
-        public Drawable mGradient;
-        public Drawable mFlingLogo;
-        public Drawable mFlingLogoDark;
-        public Drawable mFlingRotationLogo;
-        public Drawable mFlingRotationLogoDark;
-        public Drawable mLightsOutLarge;
-
-    public NavbarOverlayResources(Context ctx, Resources res) {
-        super(res);
-//      mOpaque = res.getColor(R.color.navigation_bar_background_opaque);
-//      mSemiTransparent = res.getColor(R.color.navigation_bar_background_semi_transparent);
-//      mTransparent = res.getColor(R.color.navigation_bar_background_transparent);
-//      mWarning = res.getColor(com.android.internal.R.color.battery_saver_mode_color);
-        mGradient = res.getDrawable(R.drawable.nav_background);
-        mFlingLogo = res.getDrawable(R.drawable.ic_eos_fling);
-        mFlingLogoDark = res.getDrawable(R.drawable.ic_eos_fling_dark);
-        mFlingRotationLogo = res.getDrawable(R.drawable.ic_sysbar_rotate_button);
-        mFlingRotationLogoDark = res.getDrawable(R.drawable.ic_sysbar_rotate_button_dark);
-        mLightsOutLarge = res.getDrawable(R.drawable.ic_sysbar_lights_out_dot_large);
-    }
-
-    public void updateResources(Resources res) {
-        super.updateResources(res);
-//      mOpaque = res.getColor(R.color.navigation_bar_background_opaque);
-//      mSemiTransparent = res.getColor(R.color.navigation_bar_background_semi_transparent);
-//      mTransparent = res.getColor(R.color.navigation_bar_background_transparent);
-//      mWarning = res.getColor(com.android.internal.R.color.battery_saver_mode_color);
-        Rect bounds = mGradient.getBounds();
-        mGradient = res.getDrawable(R.drawable.nav_background);
-        mGradient.setBounds(bounds);
-        mFlingLogo = res.getDrawable(R.drawable.ic_eos_fling);
-        mFlingLogoDark = res.getDrawable(R.drawable.ic_eos_fling_dark);
-        mFlingRotationLogo = res.getDrawable(R.drawable.ic_sysbar_rotate_button);
-        mFlingRotationLogoDark = res.getDrawable(R.drawable.ic_sysbar_rotate_button_dark);
-        mLightsOutLarge = res.getDrawable(R.drawable.ic_sysbar_lights_out_dot_large);
-    }
-}
diff --git a/src/com/android/systemui/navigation/Navigator.java b/src/com/android/systemui/navigation/Navigator.java
deleted file mode 100644
index 148ea3e..0000000
--- a/src/com/android/systemui/navigation/Navigator.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- * 
- * Interface for all the things that go in that navigation window and do
- * amazing things. This is all the rest of the world needs to see ;D
- * 
- */
-
-package com.android.systemui.navigation;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-import com.android.systemui.RecentsComponent;
-import com.android.systemui.navigation.NavbarOverlayResources;
-import com.android.systemui.navigation.pulse.PulseController;
-import com.android.systemui.plugins.PluginListener;
-import com.android.systemui.plugins.statusbar.phone.NavGesture;
-import com.android.systemui.stackdivider.Divider;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.phone.ButtonDispatcher;
-import com.android.systemui.statusbar.phone.LightBarTransitionsController;
-
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.view.View;
-
-public interface Navigator extends PluginListener<NavGesture> {
-    public interface OnVerticalChangedListener {
-        void onVerticalChanged(boolean isVertical);
-    }
-
-    /*
-     * Public methods in NavigationBarView. Notice there are numerous other public methods,
-     * however, they are never called from anywhere or they are called by other classes that
-     * expect the NavigationBarView implementation (NavigationBarTransitions, etc)
-     */
-    public BarTransitions getBarTransitions();
-    public default LightBarTransitionsController getLightTransitionsController() { return null; }
-    public default void setComponents(RecentsComponent recentsComponent, Divider divider) {}
-    public default void setOnVerticalChangedListener(OnVerticalChangedListener onVerticalChangedListener) {}
-    public default void abortCurrentGesture() {}
-    public default void notifyScreenOn() {}
-    public default void setNavigationIconHints(int hints) {}
-    public default void setDisabledFlags(int disabledFlags) {}
-    public default void setDisabledFlags(int disabledFlags, boolean force) {}
-    public default void setLayoutTransitionsEnabled(boolean enabled) {}
-    public default void setWakeAndUnlocking(boolean wakeAndUnlocking) {}
-    public default void setMenuVisibility(boolean showMenu) {}
-    public default void setAccessibilityButtonState(final boolean visible, final boolean longClickable) {}
-    public default boolean needsReorient(int rotation) { return false; }
-    public default boolean isVertical() { return false; }
-    public default void reorient() {}
-    public default void onKeyguardOccludedChanged(boolean keyguardOccluded) {}
-    public default ButtonDispatcher getRecentsButton() { return null; }
-    public default ButtonDispatcher getBackButton() { return null; }
-    public default ButtonDispatcher getHomeButton() { return null; }
-    public default ButtonDispatcher getAccessibilityButton() { return null; }
-    public default void dump(FileDescriptor fd, PrintWriter pw, String[] args) {}
-    public default void setMediaPlaying(boolean playing) {}
-    public default void setNotificationPanelExpanded(boolean expanded) {}
-    public default void setPulseColors(boolean colorizedMedia, int[] colors) {}
-
-    /*
-     * DUI additional methods to support additional winning ;D
-     */
-    // Return a top level view of implementation. A time may come where not everything that implements
-    // this interface is actually a view
-    public View getBaseView();
-
-    // refresh buttons/drawables
-    public default void onHandlePackageChanged() {}
-
-    /*
-     * PIE support. It may come back someday.
-     */
-    public default void setForgroundColor(Drawable drawable) {}
-
-    /*
-     * get this event from PhoneWindowManager
-     */
-    public default void setLeftInLandscape(boolean isLeftInLandscape) {}
-
-    // enable/disable features as needed for security/sanity
-    public default void setKeyguardShowing(boolean showing) {}
-
-    // assist with settings states/flags that were set on boot
-    // but are not set with a user bar change
-    // let's find a better way to do this!
-    public default void notifyInflateFromUser() {}
-
-    // Theme change! Update all the things! Designed for CMTE
-    // but may be useful again someday
-    public default void updateNavbarThemedResources(Resources res) {}
-
-    // Designed for CMTE statusbar recreation events, mostly
-    // to catch a icon pack change. May be useful again someday
-    public default void onRecreateStatusbar() {}
-
-    // also designed to assist with CMTE. CMTE had very peculiar behavior
-    // in how navbar resources were "separated" from other SystemUI resources
-    public default void setResourceMap(NavbarOverlayResources resourceMap) {}
-
-    // shut down listeners/receivers/observers
-    public default void dispose() {}
-
-    // Pulse all the things!... that use it
-    public default void setControllers(PulseController pulseController) {}
-
-    // if bar uses custom editor, is it on?
-    //public default boolean isInEditMode() { return false; }
-
-    // get our editor and pipe commands directly to it
-    public default Editor getEditor() { return null; }
-
-    // rotation changes from SystemUI
-    public default void setRotateSuggestionButtonState(boolean visible, boolean skipAnim) {}
-    public default void setLastRotation(int rotation) {}
-}
diff --git a/src/com/android/systemui/navigation/OpaLayout.java b/src/com/android/systemui/navigation/OpaLayout.java
deleted file mode 100644
index bcf8363..0000000
--- a/src/com/android/systemui/navigation/OpaLayout.java
+++ /dev/null
@@ -1,489 +0,0 @@
-package com.android.systemui.navigation;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.SystemClock;
-import android.util.ArraySet;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.RenderNodeAnimator;
-import android.view.animation.Interpolator;
-import android.view.animation.PathInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-
-import com.android.systemui.Interpolators;
-import com.android.systemui.R;
-import com.android.systemui.navigation.smartbar.SmartButtonView;
-
-public class OpaLayout extends FrameLayout {
-
-    private static final int ANIMATION_STATE_NONE = 0;
-    private static final int ANIMATION_STATE_DIAMOND = 1;
-    private static final int ANIMATION_STATE_RETRACT = 2;
-    private static final int ANIMATION_STATE_OTHER = 3;
-
-    private static final int MIN_DIAMOND_DURATION = 100;
-    private static final int COLLAPSE_ANIMATION_DURATION_RY = 83;
-    private static final int COLLAPSE_ANIMATION_DURATION_BG = 100;
-    private static final int LINE_ANIMATION_DURATION_Y = 275;
-    private static final int LINE_ANIMATION_DURATION_X = 133;
-    private static final int RETRACT_ANIMATION_DURATION = 300;
-    private static final int DIAMOND_ANIMATION_DURATION = 200;
-    private static final int HALO_ANIMATION_DURATION = 100;
-
-    private static final int DOTS_RESIZE_DURATION = 200;
-    private static final int HOME_RESIZE_DURATION = 83;
-
-    private static final int HOME_REAPPEAR_ANIMATION_OFFSET = 33;
-    private static final int HOME_REAPPEAR_DURATION = 150;
-
-    private static final float DIAMOND_DOTS_SCALE_FACTOR = 0.8f;
-    private static final float DIAMOND_HOME_SCALE_FACTOR = 0.625f;
-    private static final float HALO_SCALE_FACTOR = 0.47619048f;
-
-    private int mAnimationState;
-    private final ArraySet<Animator> mCurrentAnimators;
-
-    private boolean mIsLandscape;
-    private boolean mIsPressed;
-    private boolean mLongClicked;
-    private boolean mOpaEnabled;
-    private boolean mEditMode;
-    private boolean mOpaHomeOnly;
-    private boolean mIsHomeButton;
-    private long mStartTime;
-
-    private View mRed;
-    private View mBlue;
-    private View mGreen;
-    private View mYellow;
-    private View mSmartButton;
-
-    private View mTop;
-    private View mRight;
-    private View mLeft;
-    private View mBottom;
-
-    private final Runnable mCheckLongPress;
-    private final Runnable mRetract;
-
-    private final Interpolator mRetractInterpolator;
-    private final Interpolator mCollapseInterpolator;
-    private final Interpolator mDiamondInterpolator;
-    private final Interpolator mDotsFullSizeInterpolator;
-    private final Interpolator mFastOutSlowInInterpolator;
-    private final Interpolator mHomeDisappearInterpolator;
-
-    public OpaLayout(Context context) {
-        this(context, null);
-    }
-
-    public OpaLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public OpaLayout(Context context, AttributeSet attrs, int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public OpaLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        mFastOutSlowInInterpolator = Interpolators.FAST_OUT_SLOW_IN;
-        mHomeDisappearInterpolator = new PathInterpolator(0.8f, 0f, 1f, 1f);
-        mCollapseInterpolator = Interpolators.FAST_OUT_LINEAR_IN;
-        mDotsFullSizeInterpolator = new PathInterpolator(0.4f, 0f, 0f, 1f);
-        mRetractInterpolator = new PathInterpolator(0.4f, 0f, 0f, 1f);
-        mDiamondInterpolator = new PathInterpolator(0.2f, 0f, 0.2f, 1f);
-        mCheckLongPress = new Runnable() {
-            @Override
-            public void run() {
-                if (mIsPressed) {
-                    mLongClicked = true;
-                }
-            }
-        };
-        mRetract = new Runnable() {
-            @Override
-            public void run() {
-                cancelCurrentAnimation();
-                startRetractAnimation();
-                setOpaVisibility(false);
-            }
-        };
-        mAnimationState = OpaLayout.ANIMATION_STATE_NONE;
-        mCurrentAnimators = new ArraySet<Animator>();
-    }
-
-    private void startAll(ArraySet<Animator> animators) {
-        setOpaVisibility(true);
-        for(int i=0; i < animators.size(); i++) {
-            Animator curAnim = (Animator) mCurrentAnimators.valueAt(i);
-            curAnim.start();
-        }
-    }
-
-    private void startCollapseAnimation() {
-        mCurrentAnimators.clear();
-        mCurrentAnimators.addAll(getCollapseAnimatorSet());
-        mAnimationState = OpaLayout.ANIMATION_STATE_OTHER;
-        startAll(mCurrentAnimators);
-    }
-
-    private void startDiamondAnimation() {
-        mCurrentAnimators.clear();
-        mCurrentAnimators.addAll(getDiamondAnimatorSet());
-        mAnimationState = OpaLayout.ANIMATION_STATE_DIAMOND;
-        startAll(mCurrentAnimators);
-    }
-
-    private void startLineAnimation() {
-        mCurrentAnimators.clear();
-        mCurrentAnimators.addAll(getLineAnimatorSet());
-        mAnimationState = OpaLayout.ANIMATION_STATE_OTHER;
-        startAll(mCurrentAnimators);
-    }
-
-    private void startRetractAnimation() {
-        mCurrentAnimators.clear();
-        mCurrentAnimators.addAll(getRetractAnimatorSet());
-        mAnimationState = OpaLayout.ANIMATION_STATE_RETRACT;
-        startAll(mCurrentAnimators);
-    }
-
-    private void cancelCurrentAnimation() {
-        if(mCurrentAnimators.isEmpty())
-            return;
-        for(int i=0; i < mCurrentAnimators.size(); i++) {
-            Animator curAnim = (Animator) mCurrentAnimators.valueAt(i);
-            curAnim.removeAllListeners();
-            curAnim.cancel();
-        }
-        mCurrentAnimators.clear();
-        mAnimationState = OpaLayout.ANIMATION_STATE_NONE;
-    }
-
-    private void endCurrentAnimation() {
-        if(mCurrentAnimators.isEmpty())
-            return;
-        for(int i=0; i < mCurrentAnimators.size(); i++) {
-            Animator curAnim = (Animator) mCurrentAnimators.valueAt(i);
-            curAnim.removeAllListeners();
-            curAnim.end();
-        }
-        mCurrentAnimators.clear();
-        mAnimationState = OpaLayout.ANIMATION_STATE_NONE;
-    }
-
-    private ArraySet<Animator> getCollapseAnimatorSet() {
-        final ArraySet<Animator> set = new ArraySet<Animator>();
-        Animator animator;
-        if (mIsLandscape) {
-            animator = getDeltaAnimatorY(mRed, mCollapseInterpolator, -getPxVal(R.dimen.opa_line_x_collapse_ry), OpaLayout.COLLAPSE_ANIMATION_DURATION_RY);
-        }
-        else {
-            animator = getDeltaAnimatorX(mRed, mCollapseInterpolator, getPxVal(R.dimen.opa_line_x_collapse_ry), OpaLayout.COLLAPSE_ANIMATION_DURATION_RY);
-        }
-        set.add(animator);
-        set.add(getScaleAnimatorX(mRed, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        set.add(getScaleAnimatorY(mRed, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        Animator animator2;
-        if (mIsLandscape) {
-            animator2 = getDeltaAnimatorY(mBlue, mCollapseInterpolator, -getPxVal(R.dimen.opa_line_x_collapse_bg), OpaLayout.COLLAPSE_ANIMATION_DURATION_BG);
-        }
-        else {
-            animator2 = getDeltaAnimatorX(mBlue, mCollapseInterpolator, getPxVal(R.dimen.opa_line_x_collapse_bg), OpaLayout.COLLAPSE_ANIMATION_DURATION_BG);
-        }
-        set.add(animator2);
-        set.add(getScaleAnimatorX(mBlue, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        set.add(getScaleAnimatorY(mBlue, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        Animator animator3;
-        if (mIsLandscape) {
-            animator3 = getDeltaAnimatorY(mYellow, mCollapseInterpolator, getPxVal(R.dimen.opa_line_x_collapse_ry), OpaLayout.COLLAPSE_ANIMATION_DURATION_RY);
-        }
-        else {
-            animator3 = getDeltaAnimatorX(mYellow, mCollapseInterpolator, -getPxVal(R.dimen.opa_line_x_collapse_ry), OpaLayout.COLLAPSE_ANIMATION_DURATION_RY);
-        }
-        set.add(animator3);
-        set.add(getScaleAnimatorX(mYellow, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        set.add(getScaleAnimatorY(mYellow, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        Animator animator4;
-        if (mIsLandscape) {
-            animator4 = getDeltaAnimatorY(mGreen, mCollapseInterpolator, getPxVal(R.dimen.opa_line_x_collapse_bg), OpaLayout.COLLAPSE_ANIMATION_DURATION_BG);
-        }
-        else {
-            animator4 = getDeltaAnimatorX(mGreen, mCollapseInterpolator, -getPxVal(R.dimen.opa_line_x_collapse_bg), OpaLayout.COLLAPSE_ANIMATION_DURATION_BG);
-        }
-        set.add(animator4);
-        set.add(getScaleAnimatorX(mGreen, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        set.add(getScaleAnimatorY(mGreen, 1.0f, OpaLayout.DOTS_RESIZE_DURATION, mDotsFullSizeInterpolator));
-        final Animator scaleAnimatorX = getScaleAnimatorX(mSmartButton, 1.0f, OpaLayout.HOME_REAPPEAR_DURATION, mFastOutSlowInInterpolator);
-        final Animator scaleAnimatorY = getScaleAnimatorY(mSmartButton, 1.0f, OpaLayout.HOME_REAPPEAR_DURATION, mFastOutSlowInInterpolator);
-        scaleAnimatorX.setStartDelay(OpaLayout.HOME_REAPPEAR_ANIMATION_OFFSET);
-        scaleAnimatorY.setStartDelay(OpaLayout.HOME_REAPPEAR_ANIMATION_OFFSET);
-        set.add(scaleAnimatorX);
-        set.add(scaleAnimatorY);
-        getLongestAnim((set)).addListener((Animator.AnimatorListener)new AnimatorListenerAdapter() {
-            public void onAnimationEnd(final Animator animator) {
-                mCurrentAnimators.clear();
-                mAnimationState = OpaLayout.ANIMATION_STATE_NONE;
-                setOpaVisibility(false);
-            }
-        });
-        return set;
-    }
-
-    private ArraySet<Animator> getDiamondAnimatorSet() {
-        final ArraySet<Animator> set = new ArraySet<Animator>();
-        set.add(getDeltaAnimatorY(mTop, mDiamondInterpolator, -getPxVal(R.dimen.opa_diamond_translation), OpaLayout.DIAMOND_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mTop, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getScaleAnimatorY(mTop, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getDeltaAnimatorY(mBottom, mDiamondInterpolator, getPxVal(R.dimen.opa_diamond_translation), OpaLayout.DIAMOND_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mBottom, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getScaleAnimatorY(mBottom, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getDeltaAnimatorX(mLeft, mDiamondInterpolator, -getPxVal(R.dimen.opa_diamond_translation), OpaLayout.DIAMOND_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mLeft, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getScaleAnimatorY(mLeft, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getDeltaAnimatorX(mRight, mDiamondInterpolator, getPxVal(R.dimen.opa_diamond_translation), OpaLayout.DIAMOND_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mRight, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getScaleAnimatorY(mRight, OpaLayout.DIAMOND_DOTS_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getScaleAnimatorX(mSmartButton, OpaLayout.DIAMOND_HOME_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        set.add(getScaleAnimatorY(mSmartButton, OpaLayout.DIAMOND_HOME_SCALE_FACTOR, OpaLayout.DIAMOND_ANIMATION_DURATION, mFastOutSlowInInterpolator));
-        getLongestAnim(set).addListener((Animator.AnimatorListener)new AnimatorListenerAdapter() {
-            public void onAnimationCancel(final Animator animator) {
-                mCurrentAnimators.clear();
-            }
-
-            public void onAnimationEnd(final Animator animator) {
-                startLineAnimation();
-            }
-        });
-        return set;
-    }
-
-    private ArraySet<Animator> getLineAnimatorSet() {
-        final ArraySet<Animator> set = new ArraySet<Animator>();
-        if (mIsLandscape) {
-            set.add(getDeltaAnimatorY(mRed, mFastOutSlowInInterpolator, getPxVal(R.dimen.opa_line_x_trans_ry), OpaLayout.LINE_ANIMATION_DURATION_Y));
-            set.add(getDeltaAnimatorX(mRed, mFastOutSlowInInterpolator, getPxVal(R.dimen.opa_line_y_translation), OpaLayout.LINE_ANIMATION_DURATION_X));
-            set.add(getDeltaAnimatorY(mBlue, mFastOutSlowInInterpolator, getPxVal(R.dimen.opa_line_x_trans_bg), OpaLayout.LINE_ANIMATION_DURATION_Y));
-            set.add(getDeltaAnimatorY(mYellow, mFastOutSlowInInterpolator, -getPxVal(R.dimen.opa_line_x_trans_ry), OpaLayout.LINE_ANIMATION_DURATION_Y));
-            set.add(getDeltaAnimatorX(mYellow, mFastOutSlowInInterpolator, -getPxVal(R.dimen.opa_line_y_translation), OpaLayout.LINE_ANIMATION_DURATION_X));
-            set.add(getDeltaAnimatorY(mGreen, mFastOutSlowInInterpolator, -getPxVal(R.dimen.opa_line_x_trans_bg), OpaLayout.LINE_ANIMATION_DURATION_Y));
-        }
-        else {
-            set.add(getDeltaAnimatorX(mRed, mFastOutSlowInInterpolator, -getPxVal(R.dimen.opa_line_x_trans_ry), OpaLayout.LINE_ANIMATION_DURATION_Y));
-            set.add(getDeltaAnimatorY(mRed, mFastOutSlowInInterpolator, getPxVal(R.dimen.opa_line_y_translation), OpaLayout.LINE_ANIMATION_DURATION_X));
-            set.add(getDeltaAnimatorX(mBlue, mFastOutSlowInInterpolator, -getPxVal(R.dimen.opa_line_x_trans_bg), OpaLayout.LINE_ANIMATION_DURATION_Y));
-            set.add(getDeltaAnimatorX(mYellow, mFastOutSlowInInterpolator, getPxVal(R.dimen.opa_line_x_trans_ry), OpaLayout.LINE_ANIMATION_DURATION_Y));
-            set.add(getDeltaAnimatorY(mYellow, mFastOutSlowInInterpolator, -getPxVal(R.dimen.opa_line_y_translation), OpaLayout.LINE_ANIMATION_DURATION_X));
-            set.add(getDeltaAnimatorX(mGreen, mFastOutSlowInInterpolator, getPxVal(R.dimen.opa_line_x_trans_bg), OpaLayout.LINE_ANIMATION_DURATION_Y));
-        }
-        set.add(getScaleAnimatorX(mSmartButton, 0.0f, OpaLayout.HOME_RESIZE_DURATION, mHomeDisappearInterpolator));
-        set.add(getScaleAnimatorY(mSmartButton, 0.0f, OpaLayout.HOME_RESIZE_DURATION, mHomeDisappearInterpolator));
-        getLongestAnim(set).addListener((Animator.AnimatorListener)new AnimatorListenerAdapter() {
-            public void onAnimationCancel(final Animator animator) {
-                mCurrentAnimators.clear();
-            }
-
-            public void onAnimationEnd(final Animator animator) {
-                startCollapseAnimation();
-            }
-        });
-        return set;
-    }
-
-    private ArraySet<Animator> getRetractAnimatorSet() {
-        final ArraySet<Animator> set = new ArraySet<Animator>();
-        set.add(getTranslationAnimatorX(mRed, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getTranslationAnimatorY(mRed, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mRed, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getScaleAnimatorY(mRed, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getTranslationAnimatorX(mBlue, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getTranslationAnimatorY(mBlue, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mBlue, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getScaleAnimatorY(mBlue, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getTranslationAnimatorX(mGreen, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getTranslationAnimatorY(mGreen, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mGreen, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getScaleAnimatorY(mGreen, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getTranslationAnimatorX(mYellow, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getTranslationAnimatorY(mYellow, mRetractInterpolator, OpaLayout.RETRACT_ANIMATION_DURATION));
-        set.add(getScaleAnimatorX(mYellow, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getScaleAnimatorY(mYellow, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getScaleAnimatorX(mSmartButton, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        set.add(getScaleAnimatorY(mSmartButton, 1.0f, OpaLayout.RETRACT_ANIMATION_DURATION, mRetractInterpolator));
-        getLongestAnim(set).addListener((Animator.AnimatorListener)new AnimatorListenerAdapter() {
-            public void onAnimationEnd(final Animator animator) {
-                mCurrentAnimators.clear();
-                mAnimationState = OpaLayout.ANIMATION_STATE_NONE;
-            }
-        });
-        return set;
-    }
-
-    private float getPxVal(int id) {
-        return getResources().getDimensionPixelOffset(id);
-    }
-
-    private Animator getDeltaAnimatorX(View v, Interpolator interpolator, float deltaX, int duration) {
-        RenderNodeAnimator anim = new RenderNodeAnimator(8, (int) (v.getX() + deltaX));
-        anim.setTarget(v);
-        anim.setInterpolator(interpolator);
-        anim.setDuration(duration);
-        return anim;
-    }
-
-    private Animator getDeltaAnimatorY(View v, Interpolator interpolator, float deltaY, int duration) {
-        RenderNodeAnimator anim = new RenderNodeAnimator(9, (int) (v.getY() + deltaY));
-        anim.setTarget(v);
-        anim.setInterpolator(interpolator);
-        anim.setDuration(duration);
-        return anim;
-    }
-
-    private Animator getScaleAnimatorX(View v, float factor, int duration, Interpolator interpolator) {
-        RenderNodeAnimator anim = new RenderNodeAnimator(3, factor);
-        anim.setTarget(v);
-        anim.setInterpolator(interpolator);
-        anim.setDuration(duration);
-        return anim;
-    }
-
-    private Animator getScaleAnimatorY(View v, float factor, int duration, Interpolator interpolator) {
-        RenderNodeAnimator anim = new RenderNodeAnimator(4, factor);
-        anim.setTarget(v);
-        anim.setInterpolator(interpolator);
-        anim.setDuration(duration);
-        return anim;
-    }
-
-    private Animator getTranslationAnimatorX(View v, Interpolator interpolator, int duration) {
-        RenderNodeAnimator anim = new RenderNodeAnimator(0, 0);
-        anim.setTarget(v);
-        anim.setInterpolator(interpolator);
-        anim.setDuration(duration);
-        return anim;
-    }
-
-    private Animator getTranslationAnimatorY(View v, Interpolator interpolator, int duration) {
-        RenderNodeAnimator anim = new RenderNodeAnimator(1, 0);
-        anim.setTarget(v);
-        anim.setInterpolator(interpolator);
-        anim.setDuration(duration);
-        return anim;
-    }
-
-    private Animator getLongestAnim(ArraySet<Animator> animators) {
-        long longestDuration = -1;
-        Animator longestAnim = null;
-
-        for(int i=0; i < animators.size(); i++) {
-            Animator a = (Animator) animators.valueAt(i);
-            if(a.getTotalDuration() > longestDuration) {
-                longestDuration = a.getTotalDuration();
-                longestAnim = a;
-            }
-        }
-        return longestAnim;
-    }
-
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        mRed = findViewById(R.id.red);
-        mBlue = findViewById(R.id.blue);
-        mYellow = findViewById(R.id.yellow);
-        mGreen = findViewById(R.id.green);
-        mSmartButton = findViewById(R.id.smartbutton);
-
-        setOpaVisibility(false);
-    }
-
-    public SmartButtonView getButton() {
-        return (SmartButtonView)mSmartButton;
-    }
-
-    public void setEditMode(boolean enabled){
-        mEditMode = enabled;
-    }
-
-    public void startDownAction() {
-        if (!mOpaEnabled || mEditMode) {
-            return;
-        }
-        if (!mCurrentAnimators.isEmpty()) {
-            if (mAnimationState != OpaLayout.ANIMATION_STATE_RETRACT) {
-                return;
-            }
-            endCurrentAnimation();
-        }
-        mStartTime = SystemClock.elapsedRealtime();
-        mLongClicked = false;
-        mIsPressed = true;
-        startDiamondAnimation();
-        removeCallbacks(mCheckLongPress);
-        postDelayed(mCheckLongPress, (long)ViewConfiguration.getLongPressTimeout());
-    }
-
-    public void startCancelAction() {
-        if (!mOpaEnabled || mEditMode) {
-            return;
-        }
-        if (mAnimationState == OpaLayout.ANIMATION_STATE_DIAMOND) {
-            final long elapsedRealtime = SystemClock.elapsedRealtime();
-            removeCallbacks(mRetract);
-            postDelayed(mRetract, 100L - (elapsedRealtime - mStartTime));
-            removeCallbacks(mCheckLongPress);
-            return;
-        }
-        int n;
-        if (!mIsPressed || mLongClicked) {
-            n = 0;
-        }
-        else {
-            n = 1;
-        }
-        mIsPressed = false;
-        if (n != 0) {
-            mRetract.run();
-            return;
-        }
-    }
-
-    public void setLandscape(boolean landscape) {
-        mIsLandscape = landscape;
-        if (mIsLandscape) {
-            mTop = mGreen;
-            mBottom = mBlue;
-            mRight = mYellow;
-            mLeft = mRed;
-            return;
-        }
-        mTop = mRed;
-        mBottom = mYellow;
-        mLeft = mBlue;
-        mRight = mGreen;
-    }
-
-    public void setOpaEnabled(boolean enabled) {
-        mOpaEnabled = enabled;
-    }
-
-    public void setOpaVisibility(boolean enabled) {
-        int visibility = enabled ? View.VISIBLE : View.INVISIBLE;
-        mBlue.setVisibility(((mOpaHomeOnly && mIsHomeButton) || !mOpaHomeOnly) ? visibility : View.INVISIBLE);
-        mRed.setVisibility(((mOpaHomeOnly && mIsHomeButton) || !mOpaHomeOnly) ? visibility : View.INVISIBLE);
-        mYellow.setVisibility(((mOpaHomeOnly && mIsHomeButton) || !mOpaHomeOnly) ? visibility : View.INVISIBLE);
-        mGreen.setVisibility(((mOpaHomeOnly && mIsHomeButton) || !mOpaHomeOnly) ? visibility : View.INVISIBLE);
-    }
-
-    public void setOpaVisibilityHome(boolean opaHomeOnly, boolean isHomeButton) {
-        mOpaHomeOnly = opaHomeOnly;
-        mIsHomeButton = isHomeButton;
-    }
-}
diff --git a/src/com/android/systemui/navigation/Res.java b/src/com/android/systemui/navigation/Res.java
deleted file mode 100644
index fc60e7f..0000000
--- a/src/com/android/systemui/navigation/Res.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- * 
- * Some resource constants
- *
- */
-package com.android.systemui.navigation;
-
-public class Res {
-    
-    public static final class Common {
-        public static final String LIGHTS_OUT = "lights_out";
-        public static final String LIGHTS_OUT_LARGE = "ic_sysbar_lights_out_dot_large";
-        public static final String LIGHTS_OUT_SMALL = "ic_sysbar_lights_out_dot_small";
-        public static final String NAV_BUTTONS = "nav_buttons";
-        public static final String NAV_BACKGROUND = "nav_background";
-        public static final String NAV_BACKGROUND_OPAQUE = "navigation_bar_background_opaque";
-        public static final String NAV_BACKGROUND_SEMI_TRANS = "navigation_bar_background_semi_transparent";
-        public static final String NAV_BACKGROUND_TRANS = "navigation_bar_background_transparent";
-        public static final String NAV_BACKGROUND_BATTERY_SAVER = "battery_saver_mode_color";
-        public static final String SYSTEM_BAR_BACKGROUND = "system_bar_background";
-        public static final String ROT_0 = "rot0";
-        public static final String ROT_90 = "rot90";
-    }
-
-    public static final class Softkey {
-        public static final String ACTION_EDITOR_WIDTH = "navigation_action_editor_width";
-        public static final String ACTION_EDITOR_HEIGHT = "navigation_action_editor_height";
-        public static final String KEY_WIDTH = "navigation_key_width";
-        public static final String KEY_HEIGHT = "navigation_key_height";
-        public static final String EXTRA_KEY_WIDTH = "navigation_extra_key_width";
-        public static final String EXTRA_KEY_HEIGHT = "navigation_extra_key_height";
-        public static final String TAB_KEY_PADDING_START_PORT = "navigation_key_padding_start_port";
-        public static final String TAB_KEY_PADDING_END_PORT = "navigation_key_padding_end_port";
-        public static final String TAB_KEY_PADDING_START_LAND = "navigation_key_padding_start_land";
-        public static final String TAB_KEY_PADDING_END_LAND = "navigation_key_padding_end_land";
-        public static final String TAB_EXTRA_KEY_MARGIN_START = "navigation_key_extra_margin_start";
-        public static final String TAB_EXTRA_KEY_MARGIN_END = "navigation_key_extra_margin_end";
-        public static final String IC_IME_SWITCHER_DEF = "ic_ime_switcher_default";
-        public static final String IC_SYSBAR_BACK = "ic_sysbar_back";
-        public static final String IC_SYSBAR_BACK_LAND = "ic_sysbar_back_land";
-        public static final String IC_SYSBAR_HOME = "ic_sysbar_home";
-        public static final String IC_SYSBAR_HOME_LAND = "ic_sysbar_home_land";
-        public static final String IC_SYSBAR_RECENT = "ic_sysbar_recent";
-        public static final String IC_SYSBAR_RECENT_LAND = "ic_sysbar_recent_land";
-        public static final String IC_SYSBAR_MENU = "ic_sysbar_menu";
-        public static final String IC_SYSBAR_MENU_LAND = "ic_sysbar_menu_land";
-        public static final String CONTEXT_VIEW_RIGHT = "context_view_right";
-        public static final String CONTEXT_VIEW_LEFT = "context_view_left";
-        public static final String MENU_BUTTON = "menu_button";
-        public static final String IME_SWITCHER = "ime_switcher";
-        public static final String IME_ARROW_LEFT = "ime_arrow_left";
-        public static final String IME_ARROW_RIGHT = "ime_arrow_right";
-        public static final String STOP_SCREENPINNING = "stop_screenpinning";
-        public static final String MENU_DESC = "accessibility_menu";
-        public static final String IME_DESC = "accessibility_ime_switch_button";
-        public static final String BUTTON_BACK = "smartbar_button_1";
-        public static final String BUTTON_HOME = "smartbar_button_2";
-        public static final String BUTTON_OVERVIEW = "smartbar_button_3";
-        public static final String MEDIA_ARROW_LEFT = "media_arrow_left";
-        public static final String MEDIA_ARROW_RIGHT = "media_arrow_right";
-        public static final String ROTATION_BUTTON = "rotation_button";
-    }
-
-    public static final class Fling {
-        
-    }
-
-}
diff --git a/src/com/android/systemui/navigation/editor/ActionItem.java b/src/com/android/systemui/navigation/editor/ActionItem.java
deleted file mode 100644
index 3ecda33..0000000
--- a/src/com/android/systemui/navigation/editor/ActionItem.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package com.android.systemui.navigation.editor;
-
-import android.graphics.drawable.Drawable;
-import android.graphics.Bitmap;
-
-/**
- *  @author Pontus Holmberg (EndLessMind)
- *  Email: the_mr_hb@hotmail.com
- **/
-public class ActionItem {
-    private Drawable icon;
-    private Bitmap thumb;
-    private String title;
-    private int actionId = -1;
-    private boolean selected;
-    private boolean sticky;
-    
-    /**
-     * Constructor
-     * 
-     * @param actionId  Action id for case statements
-     * @param title     Title
-     * @param icon      Icon to use
-     */
-    public ActionItem(int actionId, String title, Drawable icon) {
-        this.title = title;
-        this.icon = icon;
-        this.actionId = actionId;
-    }
-    
-    /**
-     * Constructor
-     */
-    public ActionItem() {
-        this(-1, null, null);
-    }
-    
-    /**
-     * Constructor
-     * 
-     * @param actionId  Action id of the item
-     * @param title     Text to show for the item
-     */
-    public ActionItem(int actionId, String title) {
-        this(actionId, title, null);
-    }
-    
-    /**
-     * Constructor
-     * 
-     * @param icon {@link Drawable} action icon
-     */
-    public ActionItem(Drawable icon) {
-        this(-1, null, icon);
-    }
-    
-    /**
-     * Constructor
-     * 
-     * @param actionId  Action ID of item
-     * @param icon      {@link Drawable} action icon
-     */
-    public ActionItem(int actionId, Drawable icon) {
-        this(actionId, null, icon);
-    }
-    
-    /**
-     * Set action title
-     * 
-     * @param title action title
-     */
-    public void setTitle(String title) {
-        this.title = title;
-    }
-    
-    /**
-     * Get action title
-     * 
-     * @return action title
-     */
-    public String getTitle() {
-        return this.title;
-    }
-    
-    /**
-     * Set action icon
-     * 
-     * @param icon {@link Drawable} action icon
-     */
-    public void setIcon(Drawable icon) {
-        this.icon = icon;
-    }
-    
-    /**
-     * Get action icon
-     * @return  {@link Drawable} action icon
-     */
-    public Drawable getIcon() {
-        return this.icon;
-    }
-    
-     /**
-     * Set action id
-     * 
-     * @param actionId  Action id for this action
-     */
-    public void setActionId(int actionId) {
-        this.actionId = actionId;
-    }
-    
-    /**
-     * @return  Our action id
-     */
-    public int getActionId() {
-        return actionId;
-    }
-    
-    /**
-     * Set sticky status of button
-     * 
-     * @param sticky  true for sticky, pop up sends event but does not disappear
-     */
-    public void setSticky(boolean sticky) {
-        this.sticky = sticky;
-    }
-    
-    /**
-     * @return  true if button is sticky, menu stays visible after press
-     */
-    public boolean isSticky() {
-        return sticky;
-    }
-    
-    /**
-     * Set selected flag;
-     * 
-     * @param selected Flag to indicate the item is selected
-     */
-    public void setSelected(boolean selected) {
-        this.selected = selected;
-    }
-    
-    /**
-     * Check if item is selected
-     * 
-     * @return true or false
-     */
-    public boolean isSelected() {
-        return this.selected;
-    }
-
-    /**
-     * Set thumb
-     * 
-     * @param thumb Thumb image
-     */
-    public void setThumb(Bitmap thumb) {
-        this.thumb = thumb;
-    }
-    
-    /**
-     * Get thumb image
-     * 
-     * @return Thumb image
-     */
-    public Bitmap getThumb() {
-        return this.thumb;
-    }
-}
diff --git a/src/com/android/systemui/navigation/editor/PopupWindows.java b/src/com/android/systemui/navigation/editor/PopupWindows.java
deleted file mode 100644
index 68ace18..0000000
--- a/src/com/android/systemui/navigation/editor/PopupWindows.java
+++ /dev/null
@@ -1,135 +0,0 @@
-
-package com.android.systemui.navigation.editor;
-
-import com.android.internal.utils.du.DUActionUtils;
-
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.View.OnTouchListener;
-import android.widget.PopupWindow;
-
-import android.content.Context;
-
-/**
- * @author Pontus Holmberg (EndLessMind) Email: the_mr_hb@hotmail.com
- **/
-public class PopupWindows {
-    protected Context mContext;
-    public PopupWindow mWindow;
-    protected View mRootView;
-    protected Drawable mBackground = null;
-    protected WindowManager mWindowManager;
-
-    /**
-     * Constructor.
-     * 
-     * @param context Context
-     */
-    public PopupWindows(Context context) {
-        mContext = context;
-        mWindow = new PopupWindow(context);
-        mWindow.setBackgroundDrawable(new BitmapDrawable());
-        mWindow.setTouchInterceptor(new OnTouchListener() {
-            public boolean onTouch(View v, MotionEvent event) {
-                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
-                    mWindow.dismiss();
-
-                    return true;
-                }
-
-                return false;
-            }
-        });
-
-        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
-    }
-
-    /**
-     * On dismiss
-     */
-    protected void onDismiss() {
-    }
-
-    /**
-     * On show
-     */
-    protected void onShow() {
-    }
-
-    /**
-     * On pre show
-     */
-    protected void preShow() {
-        if (mRootView == null)
-            throw new IllegalStateException("setContentView was not called with a view to display.");
-
-        onShow();
-
-        // if (mBackground == null)
-        // mwindow.setBackgroundDrawable(new BitmapDrawable());
-        // else
-        // mwindow.setBackgroundDrawable(new BitmapDrawable());
-
-        mWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
-        mWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
-        // mwindow.setTouchable(true);
-        // mwindow.setFocusable(true);
-        // mwindow.setOutsideTouchable(true);
-
-        mWindow.setContentView(mRootView);
-    }
-
-    /**
-     * Set background drawable.
-     * 
-     * @param background Background drawable
-     */
-    public void setBackgroundDrawable(Drawable background) {
-        mWindow.setBackgroundDrawable(background);
-    }
-
-    /**
-     * Set content view.
-     * 
-     * @param root Root view
-     */
-    public void setContentView(View root) {
-        mRootView = root;
-
-        mWindow.setContentView(root);
-    }
-
-    /**
-     * Set content view.
-     * 
-     * @param layoutResID Resource id
-     */
-    public void setContentView(int layoutResID) {
-        LayoutInflater inflator = (LayoutInflater) mContext
-                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
-        setContentView(inflator.inflate(layoutResID, null));
-    }
-
-    /**
-     * Set listener on window dismissed.
-     * 
-     * @param listener
-     */
-    public void setOnDismissListener(PopupWindow.OnDismissListener listener) {
-        mWindow.setOnDismissListener(listener);
-    }
-
-    /**
-     * Dismiss the popup window.
-     */
-    public void dismiss() {
-        mWindow.dismiss();
-    }
-}
diff --git a/src/com/android/systemui/navigation/editor/QuickAction.java b/src/com/android/systemui/navigation/editor/QuickAction.java
deleted file mode 100644
index e62298a..0000000
--- a/src/com/android/systemui/navigation/editor/QuickAction.java
+++ /dev/null
@@ -1,383 +0,0 @@
-
-package com.android.systemui.navigation.editor;
-
-import android.content.Context;
-
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-
-import android.widget.ImageView;
-import android.widget.PopupWindow;
-import android.widget.TextView;
-import android.widget.ScrollView;
-import android.widget.RelativeLayout;
-import android.widget.PopupWindow.OnDismissListener;
-
-import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewGroup;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import com.android.systemui.R;
-import com.android.systemui.navigation.editor.ActionItem;
-import com.android.systemui.navigation.editor.PopupWindows;
-import com.android.systemui.navigation.editor.QuickAction;
-
-/**
- * @author Pontus Holmberg (EndLessMind) Email: the_mr_hb@hotmail.com
- **/
-
-public class QuickAction extends PopupWindows implements OnDismissListener {
-    private View mRootView;
-    private ImageView mArrowUp;
-    private ImageView mArrowDown;
-    private LayoutInflater mInflater;
-    private ViewGroup mTrack;
-    private ScrollView mScroller;
-    private OnActionItemClickListener mItemClickListener;
-    private OnDismissListener mDismissListener;
-
-    private List<ActionItem> actionItems = new ArrayList<ActionItem>();
-
-    private boolean mDidAction;
-    public boolean isDismissed = false;
-
-    private int mChildPos;
-    private int mInsertPos;
-    private int rootWidth = 0;
-    private int mAnimStyle;
-    private int mXpos = 0;
-    private int mBtop;
-
-    public static final int HORIZONTAL = 0;
-    public static final int VERTICAL = 1;
-
-    public static final int ANIM_GROW_FROM_LEFT = 1;
-    public static final int ANIM_GROW_FROM_RIGHT = 2;
-    public static final int ANIM_GROW_FROM_CENTER = 3;
-    public static final int ANIM_REFLECT = 4;
-    public static final int ANIM_AUTO = 5;
-    public static final int ANIM_NONE = 6;
-
-    /**
-     * Constructor for default vertical layout
-     * 
-     * @param context Context
-     */
-    public QuickAction(Context context) {
-        this(context, VERTICAL);
-    }
-
-    /**
-     * Constructor allowing orientation override
-     * 
-     * @param context Context
-     * @param orientation Layout orientation, can be vartical or horizontal
-     */
-    public QuickAction(Context context, int orientation) {
-        super(context);
-        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        setRootViewId(R.layout.popup_vertical);
-        mChildPos = 0;
-        mAnimStyle = ANIM_AUTO;
-    }
-
-    /**
-     * Get action item at an index
-     * 
-     * @param index Index of item (position from callback)
-     * @return Action Item at the position
-     */
-    public ActionItem getActionItem(int index) {
-        return actionItems.get(index);
-    }
-
-    /**
-     * Set root view.
-     * 
-     * @param id Layout resource id
-     */
-    public void setRootViewId(int id) {
-        // setOutsideTouchable(true);
-        mRootView = (ViewGroup) mInflater.inflate(id, null);
-        mTrack = (ViewGroup) mRootView.findViewById(R.id.tracks);
-        mArrowDown = (ImageView) mRootView.findViewById(R.id.arrow_down);
-        mArrowUp = (ImageView) mRootView.findViewById(R.id.arrow_up);
-        mScroller = (ScrollView) mRootView.findViewById(R.id.scroller);
-
-        // This was previously defined on show() method, moved here to prevent force close that
-        // occured
-        // when tapping fastly on a view to show quickaction dialog.
-        // thanks to zammbi (github.com/zammbi)
-        mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
-                LayoutParams.WRAP_CONTENT));
-        setContentView(mRootView);
-    }
-
-    /**
-     * Set listener for action item clicked.
-     * 
-     * @param listener Listener
-     */
-    public void setOnActionItemClickListener(OnActionItemClickListener listener) {
-        mItemClickListener = listener;
-    }
-
-    /**
-     * Add action item
-     * 
-     * @param action {@link ActionItem}
-     */
-    public void addActionItem(ActionItem action) {
-        actionItems.add(action);
-
-        String title = action.getTitle();
-        Drawable icon = action.getIcon();
-        View container = mInflater.inflate(R.layout.action_item_vertical, null);
-        ImageView img = (ImageView) container.findViewById(R.id.iv_icon);
-        TextView text = (TextView) container.findViewById(R.id.tv_title);
-
-        if (icon != null) {
-            img.setImageDrawable(icon);
-        } else {
-            img.setVisibility(View.GONE);
-        }
-
-        if (title != null) {
-            text.setText(title);
-        } else {
-            text.setVisibility(View.GONE);
-        }
-
-        final int pos = mChildPos;
-        final int actionId = action.getActionId();
-
-        final boolean isActionSticky = action.isSticky();
-
-        container.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                if (mItemClickListener != null) {
-                    mItemClickListener.onItemClick(QuickAction.this, pos, actionId);
-                }
-
-                if (!isActionSticky) {
-                    mDidAction = true;
-                    dismiss();
-                }
-            }
-        });
-
-        container.setFocusable(true);
-        container.setClickable(true);
-
-        mTrack.addView(container, mInsertPos);
-
-        mChildPos++;
-        mInsertPos++;
-    }
-
-    public void clearViews() {
-        actionItems.clear();
-        mTrack.removeAllViews();
-        mChildPos = 0;
-        mInsertPos = 0;
-    }
-
-    /**
-     * Show quickaction popup. Popup is automatically positioned, on top or bottom of anchor view.
-     */
-    public void show(View anchor) {
-        preShow();
-        int xPos, yPos, arrowPos;
-
-        mDidAction = false;
-
-        int[] location = new int[2];
-
-        anchor.getLocationOnScreen(location);
-
-        Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.getWidth(),
-                location[1]
-                        + anchor.getHeight());
-
-        // mRootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
-        // LayoutParams.WRAP_CONTENT));
-
-        mRootView.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
-
-        int rootHeight = mRootView.getMeasuredHeight();
-
-        if (rootWidth == 0) {
-            rootWidth = mRootView.getMeasuredWidth();
-        }
-
-        int screenWidth = mWindowManager.getDefaultDisplay().getWidth();
-        int screenHeight = mWindowManager.getDefaultDisplay().getHeight();
-
-        // automatically get X coord of popup (top left)
-        if ((anchorRect.left + rootWidth) > screenWidth) {
-            xPos = anchorRect.left - (rootWidth - anchor.getWidth());
-            xPos = (xPos < 0) ? 0 : xPos;
-
-            arrowPos = anchorRect.centerX() - xPos;
-
-        } else {
-            if (anchor.getWidth() > rootWidth) {
-                xPos = anchorRect.centerX() - (rootWidth / 2);
-            } else {
-                xPos = anchorRect.left;
-            }
-
-            arrowPos = anchorRect.centerX() - xPos;
-        }
-
-        int dyTop = anchorRect.top;
-        mBtop = dyTop;
-        int dyBottom = screenHeight - anchorRect.bottom;
-
-        boolean onTop = (dyTop > dyBottom) ? true : false;
-
-        if (onTop) {
-            if (rootHeight > dyTop) {
-                yPos = 15;
-                LayoutParams l = mScroller.getLayoutParams();
-                l.height = dyTop - anchor.getHeight();
-            } else {
-                yPos = anchorRect.top - rootHeight;
-            }
-        } else {
-            yPos = anchorRect.bottom;
-
-            if (rootHeight > dyBottom) {
-                LayoutParams l = mScroller.getLayoutParams();
-                l.height = dyBottom;
-            }
-        }
-
-        showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), arrowPos);
-
-        setAnimationStyle(screenWidth, anchorRect.centerX());
-        mWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos);
-        mXpos = xPos;
-    }
-
-    public int getNavButtonTopY() {
-        return mBtop;
-    }
-
-    public int getXpos() {
-        return mXpos;
-    }
-
-    /**
-     * Set animation style
-     * 
-     * @param screenWidth screen width
-     * @param requestedX distance from left edge
-     * @param onTop flag to indicate where the popup should be displayed. Set TRUE if displayed on
-     *            top of anchor view and vice versa
-     */
-    private void setAnimationStyle(int screenWidth, int requestedX) {
-        int arrowPos = requestedX - mArrowUp.getMeasuredWidth() / 2;
-
-        switch (mAnimStyle) {
-            case ANIM_GROW_FROM_LEFT:
-                mWindow.setAnimationStyle(R.style.Animations_PopUpMenu_Left);
-                break;
-
-            case ANIM_GROW_FROM_RIGHT:
-                mWindow.setAnimationStyle(R.style.Animations_PopUpMenu_Right);
-                break;
-
-            case ANIM_GROW_FROM_CENTER:
-                mWindow.setAnimationStyle(R.style.Animations_PopUpMenu_Center);
-                break;
-
-            case ANIM_REFLECT:
-                mWindow.setAnimationStyle(R.style.Animations_PopUpMenu_Reflect);
-                break;
-
-            case ANIM_AUTO:
-                if (arrowPos <= screenWidth / 4) {
-                    mWindow.setAnimationStyle(R.style.Animations_PopUpMenu_Left);
-                } else if (arrowPos > screenWidth / 4 && arrowPos < 3 * (screenWidth / 4)) {
-                    mWindow.setAnimationStyle(R.style.Animations_PopUpMenu_Center);
-                } else {
-                    mWindow.setAnimationStyle(R.style.Animations_PopUpMenu_Right);
-                }
-                break;
-        }
-    }
-
-    /**
-     * Set animation style
-     * 
-     * @param mAnimStyle animation style, default is set to ANIM_AUTO
-     */
-    public void setAnimStyle(int mAnimStyle) {
-        this.mAnimStyle = mAnimStyle;
-    }
-
-    /**
-     * Show arrow
-     * 
-     * @param whichArrow arrow type resource id
-     * @param requestedX distance from left screen
-     */
-    private void showArrow(int whichArrow, int requestedX) {
-        final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp
-                : mArrowDown;
-        final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown
-                : mArrowUp;
-
-        final int arrowWidth = mArrowDown.getMeasuredWidth();
-
-        showArrow.setVisibility(View.VISIBLE);
-
-        ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams) showArrow
-                .getLayoutParams();
-
-        param.leftMargin = requestedX - arrowWidth / 2;
-
-        hideArrow.setVisibility(View.INVISIBLE);
-    }
-
-    /**
-     * Set listener for window dismissed. This listener will only be fired if the quicakction dialog
-     * is dismissed by clicking outside the dialog or clicking on sticky item.
-     */
-    public void setOnDismissListener(QuickAction.OnDismissListener listener) {
-        setOnDismissListener(this);
-
-        mDismissListener = listener;
-    }
-
-    @Override
-    public void onDismiss() {
-        if (!mDidAction && mDismissListener != null) {
-            isDismissed = true;
-            Log.d("Qick", "Dismissed-inside");
-            mDismissListener.onDismiss();
-        }
-    }
-
-    /**
-     * Listener for item click
-     */
-    public interface OnActionItemClickListener {
-        public abstract void onItemClick(QuickAction source, int pos, int actionId);
-    }
-
-    /**
-     * Listener for window dismiss
-     */
-    public interface OnDismissListener {
-        public abstract void onDismiss();
-    }
-}
diff --git a/src/com/android/systemui/navigation/fling/FlingActionHandler.java b/src/com/android/systemui/navigation/fling/FlingActionHandler.java
deleted file mode 100644
index 508d06d..0000000
--- a/src/com/android/systemui/navigation/fling/FlingActionHandler.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/**
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- * 
- * Handles binding actions to events, and a simple public api for firing
- * events. Also handles observing user changes to actions and a callback
- * that's called action pre-execution. Let's motion handler know if double
- * tap is enabled in case of different touch handling 
- *
- */
-
-package com.android.systemui.navigation.fling;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import com.android.systemui.navigation.fling.FlingGestureHandler.Swipeable;
-import com.android.systemui.navigation.utils.SmartObserver.SmartObservable;
-import com.android.internal.utils.du.ActionConstants;
-import com.android.internal.utils.du.ActionHandler;
-import com.android.internal.utils.du.Config;
-import com.android.internal.utils.du.ActionConstants.ConfigMap;
-import com.android.internal.utils.du.Config.ActionConfig;
-import com.android.internal.utils.du.Config.ButtonConfig;
-
-import android.content.Context;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Looper;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.view.HapticFeedbackConstants;
-import android.view.SoundEffectConstants;
-import android.view.View;
-
-public class FlingActionHandler implements Swipeable, SmartObservable {
-    final static String TAG = FlingActionHandler.class.getSimpleName();
-
-    private static Set<Uri> sUris = new HashSet<Uri>();
-    static {
-        sUris.add(Settings.Secure.getUriFor(
-                ActionConstants.getDefaults(ActionConstants.FLING).getUri()));
-    }
-
-    private Map<String, ActionConfig> mActionMap = new HashMap<String, ActionConfig>();
-    private View mHost;
-    private Context mContext;
-    private boolean isDoubleTapEnabled;
-    private boolean mUseKbCursors;
-    private boolean mLongPressing;
-    private boolean mKeyguardShowing;
-    private boolean mOnTapPreloadedRecents;
-    private boolean mOnSwipePreloadedRecents;
-
-    // TODO: move these to ActionConstants and make the whole
-    // preload code more granular to avoid unneeded preload tasks
-    private final ArrayList<String> mRightTapActions = new ArrayList<>();
-    private final ArrayList<String> mLeftTapActions = new ArrayList<>();
-    private final ArrayList<String> mSwipeActions = new ArrayList<>();
-
-    private void setRightTapActions() {
-        mRightTapActions.clear();
-        mRightTapActions.add("single_right_tap");
-        mRightTapActions.add("double_right_tap");
-        mRightTapActions.add("long_right_press");
-    }
-
-    private void setLeftTapActions() {
-        mLeftTapActions.clear();
-        mLeftTapActions.add("single_left_tap");
-        mLeftTapActions.add("double_left_tap");
-        mLeftTapActions.add("long_left_press");
-    }
-
-    private void setSwipeActions() {
-        mSwipeActions.add("fling_short_right");
-        mSwipeActions.add("fling_long_right");
-        mSwipeActions.add("fling_right_up");
-        mSwipeActions.add("fling_short_left");
-        mSwipeActions.add("fling_long_left");
-        mSwipeActions.add("fling_left_up");
-    }
-
-    public FlingActionHandler(Context context, View host) {
-        mContext = context;
-        mHost = host;
-        loadConfigs();
-    }
-
-    void loadConfigs() {
-        mActionMap.clear();
-        ArrayList<ButtonConfig> configs = Config.getConfig(mContext,
-                ActionConstants.getDefaults(ActionConstants.FLING));
-        for (Map.Entry<String, ConfigMap> entry : ActionConstants
-                .getDefaults(ActionConstants.FLING).getActionMap().entrySet()) {
-            ButtonConfig button = configs.get(entry.getValue().button);
-            ActionConfig action = button.getActionConfig(entry.getValue().action);
-            mActionMap.put(entry.getKey(), action);
-        }
-        setDoubleTapEnabled();
-        setLeftTapActions();
-        setRightTapActions();
-        setSwipeActions();
-    }
-
-    public void setKeyguardShowing(boolean showing) {
-        if (mKeyguardShowing == showing) {
-            return;
-        }
-        mKeyguardShowing = showing;
-    }
-
-    public void fireAction(ActionConfig action) {
-        if (action == null || action.hasNoAction()) {
-            return;
-        }
-        final String theAction = action.getAction();
-        // only back is allowed in keyguard
-        if (mKeyguardShowing
-                && (!TextUtils.equals(theAction, ActionHandler.SYSTEMUI_TASK_BACK))) {
-            return;
-        }
-        mHost.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
-        mHost.playSoundEffect(SoundEffectConstants.CLICK);
-        ActionHandler.performTask(mContext, theAction);
-        if (mOnTapPreloadedRecents || mOnSwipePreloadedRecents
-                && !action.isActionRecents()) {
-            ActionHandler.cancelPreloadRecentApps();
-        }
-    }
-
-    @Override
-    public boolean onDoubleTapEnabled() {
-        return isDoubleTapEnabled;
-    }
-
-    @Override
-    public void onShortLeftSwipe() {
-        fireAction((ActionConfig) mActionMap.get(ActionConstants.Fling.FLING_SHORT_LEFT_TAG));
-    }
-
-    @Override
-    public void onLongLeftSwipe() {
-        fireAction((ActionConfig) mActionMap.get(ActionConstants.Fling.FLING_LONG_LEFT_TAG));
-    }
-
-    @Override
-    public void onShortRightSwipe() {
-        fireAction((ActionConfig) mActionMap.get(ActionConstants.Fling.FLING_SHORT_RIGHT_TAG));
-    }
-
-    @Override
-    public void onLongRightSwipe() {
-        fireAction((ActionConfig) mActionMap.get(ActionConstants.Fling.FLING_LONG_RIGHT_TAG));
-    }
-
-    @Override
-    public void onUpRightSwipe() {
-        ActionConfig left_swipe = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.FLING_LEFT_UP_TAG);
-        ActionConfig right_swipe = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.FLING_RIGHT_UP_TAG);
-        fireAction(!right_swipe.hasNoAction() ? right_swipe : left_swipe);
-    }
-
-    @Override
-    public void onUpLeftSwipe() {
-        ActionConfig left_swipe = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.FLING_LEFT_UP_TAG);
-        ActionConfig right_swipe = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.FLING_RIGHT_UP_TAG);
-        fireAction(!left_swipe.hasNoAction() ? left_swipe : right_swipe);
-    }
-
-    @Override
-    public void onSingleLeftPress() {
-        if (mUseKbCursors) {
-            ActionHandler.performTask(mContext, ActionHandler.SYSTEMUI_TASK_HOME);
-            return;
-        }
-        ActionConfig left_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.SINGLE_LEFT_TAP_TAG);
-        ActionConfig right_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.SINGLE_RIGHT_TAP_TAG);
-        fireAction(!left_tap.hasNoAction() ? left_tap : right_tap);
-    }
-
-    @Override
-    public void onSingleRightPress() {
-        if (((FlingView)mHost).isRotateButtonVisible()) {
-            ((FlingView)mHost).rotate();
-            return;
-        }
-
-        if (mUseKbCursors) {
-            ActionHandler.performTask(mContext, ActionHandler.SYSTEMUI_TASK_HOME);
-            return;
-        }
-        ActionConfig right_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.SINGLE_RIGHT_TAP_TAG);
-        ActionConfig left_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.SINGLE_LEFT_TAP_TAG);
-        fireAction(!right_tap.hasNoAction() ? right_tap : left_tap);
-    }
-
-    protected void setImeActions(boolean enable) {
-        mUseKbCursors = enable;
-    }
-
-    private void setDoubleTapEnabled() {
-        isDoubleTapEnabled =
-                !((ActionConfig) mActionMap.get(ActionConstants.Fling.DOUBLE_LEFT_TAP_TAG)).hasNoAction()
-                || !((ActionConfig) mActionMap.get(ActionConstants.Fling.DOUBLE_RIGHT_TAP_TAG)).hasNoAction();
-    }
-
-    @Override
-    public void onDoubleLeftTap() {
-        ActionConfig left_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.DOUBLE_LEFT_TAP_TAG);
-        ActionConfig right_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.DOUBLE_RIGHT_TAP_TAG);
-        fireAction(!left_tap.hasNoAction() ? left_tap : right_tap);
-    }
-
-    @Override
-    public void onDoubleRightTap() {
-        ActionConfig right_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.DOUBLE_RIGHT_TAP_TAG);
-        ActionConfig left_tap = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.DOUBLE_LEFT_TAP_TAG);
-        fireAction(!right_tap.hasNoAction() ? right_tap : left_tap);
-    }
-
-    @Override
-    public void onLongLeftPress() {
-        mLongPressing = true;
-        if (mUseKbCursors) {
-            moveKbCursor(false, true);
-            return;
-        }
-
-        ActionConfig left_long = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.LONG_LEFT_PRESS_TAG);
-        ActionConfig right_long = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.LONG_RIGHT_PRESS_TAG);
-        if (ActionHandler.isLockTaskOn()) {
-            ActionHandler.turnOffLockTask();
-        } else {
-            fireAction(!left_long.hasNoAction() ? left_long : right_long);
-        }
-    }
-
-    @Override
-    public void onLongRightPress() {
-        mLongPressing = true;
-        if (mUseKbCursors) {
-            moveKbCursor(true, true);
-            return;
-        }
-
-        ActionConfig right_long = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.LONG_RIGHT_PRESS_TAG);
-        ActionConfig left_long = (ActionConfig) mActionMap
-                .get(ActionConstants.Fling.LONG_LEFT_PRESS_TAG);
-        if (ActionHandler.isLockTaskOn()) {
-            ActionHandler.turnOffLockTask();
-        } else {
-            fireAction(!right_long.hasNoAction() ? right_long : left_long);
-        }
-    }
-
-    private void moveKbCursor(boolean right, boolean firstTrigger) {
-        ActionHandler.performTask(mContext, right ? ActionHandler.SYSTEMUI_TASK_IME_NAVIGATION_RIGHT
-                : ActionHandler.SYSTEMUI_TASK_IME_NAVIGATION_LEFT);
-        final Handler handler = new Handler(Looper.getMainLooper());
-        final Runnable r = new Runnable() {
-            @Override
-            public void run() {
-                if (mLongPressing) {
-                    moveKbCursor(right, false);
-                }
-            }
-        };
-        if (mLongPressing) {
-            handler.postDelayed(r, firstTrigger ? 500 : 250);
-        }
-    }
-
-    @Override
-    public void cancelLongPress() {
-        mLongPressing = false;
-    }
-
-    @Override
-    public void onDownPreloadRecents(boolean isRight) {
-        mOnTapPreloadedRecents = false;
-        for (String flingAction : (isRight? mRightTapActions : mLeftTapActions)) {
-            ActionConfig action = (ActionConfig) mActionMap.get(flingAction);
-            if (!mUseKbCursors && !((FlingView)mHost).isRotateButtonVisible() && action != null && !action.hasNoAction() && action.isActionRecents()) {
-                ActionHandler.preloadRecentApps();
-                mOnTapPreloadedRecents = true;
-                return;
-            }
-        }
-    }
-
-    @Override
-    public void onScrollPreloadRecents() {
-        mOnSwipePreloadedRecents = false;
-        for (String swipeAction : mSwipeActions) {
-            ActionConfig action = (ActionConfig) mActionMap.get(swipeAction);
-            if (action != null && !action.hasNoAction() && action.isActionRecents() && !mOnTapPreloadedRecents) {
-                ActionHandler.preloadRecentApps();
-                mOnSwipePreloadedRecents = true;
-                return;
-            }
-        }
-    }
-
-    @Override
-    public void onCancelPreloadRecents() {
-        if (mOnTapPreloadedRecents || mOnSwipePreloadedRecents) {
-            ActionHandler.cancelPreloadRecentApps();
-        }
-    }
-
-    @Override
-    public Set<Uri> onGetUris() {
-        return sUris;
-    }
-
-    @Override
-    public void onChange(Uri uri) {
-        loadConfigs();
-    }
-}
diff --git a/src/com/android/systemui/navigation/fling/FlingBarTransitions.java b/src/com/android/systemui/navigation/fling/FlingBarTransitions.java
deleted file mode 100644
index 9b1dc03..0000000
--- a/src/com/android/systemui/navigation/fling/FlingBarTransitions.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2013 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.navigation.fling;
-
-import android.graphics.drawable.Drawable;
-import android.view.View;
-
-import com.android.systemui.navigation.*;
-import com.android.systemui.navigation.fling.FlingView;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.phone.LightBarTransitionsController;
-import com.android.systemui.R;
-
-public final class FlingBarTransitions extends BarTransitions {
-
-    private final FlingView mView;
-    private boolean mLightsOut;
-    private final LightBarTransitionsController mLightTransitionsController;
-
-    public FlingBarTransitions(FlingView view) {
-        super(view, R.drawable.nav_background);
-//                R.color.navigation_bar_background_opaque,
-//                R.color.navigation_bar_background_semi_transparent,
-//                R.color.navigation_bar_background_transparent,
-//                com.android.internal.R.color.battery_saver_mode_color);
-        mView = view;
-        mLightTransitionsController = new LightBarTransitionsController(view.getContext(),
-                this::applyDarkIntensity);
-    }
-
-    public void init() {
-        applyModeBackground(-1, getMode(), false /*animate*/);
-        applyMode(getMode(), false /*animate*/, true /*force*/);
-    }
-
-    public LightBarTransitionsController getLightTransitionsController() {
-        return mLightTransitionsController;
-    }
-
-    public void reapplyDarkIntensity() {
-        applyDarkIntensity(mLightTransitionsController.getCurrentDarkIntensity());
-    }
-
-    public void applyDarkIntensity(float darkIntensity) {
-        Drawable current = mView.getLogoDrawable(false);
-        if (current != null && current instanceof DarkIntensity) {
-            ((DarkIntensity) current).setDarkIntensity(darkIntensity);
-        }
-        Drawable hidden = mView.getLogoDrawable(true);
-        if (hidden != null && hidden instanceof DarkIntensity) {
-            ((DarkIntensity) hidden).setDarkIntensity(darkIntensity);
-        }
-
-        Drawable rotationCurrent = mView.getRotationLogoDrawable(false);
-        if (rotationCurrent != null && rotationCurrent instanceof DarkIntensity) {
-            ((DarkIntensity) rotationCurrent).setDarkIntensity(darkIntensity);
-        }
-        Drawable rotationHidden = mView.getRotationLogoDrawable(true);
-        if (rotationHidden != null && rotationHidden instanceof DarkIntensity) {
-            ((DarkIntensity) rotationHidden).setDarkIntensity(darkIntensity);
-        }
-    }
-
-    @Override
-    protected void onTransition(int oldMode, int newMode, boolean animate) {
-        super.onTransition(oldMode, newMode, animate);
-        applyMode(newMode, animate, false /*force*/);
-    }
-
-    private void applyMode(int mode, boolean animate, boolean force) {
-        // apply to lights out
-        applyLightsOut(isLightsOut(mode), animate, force);
-    }
-
-    private void applyLightsOut(boolean lightsOut, boolean animate, boolean force) {
-        if (!force && lightsOut == mLightsOut)
-            return;
-
-        mLightsOut = lightsOut;
-        final View navButtons = mView.getCurrentView().findViewById(R.id.nav_buttons);
-
-        // ok, everyone, stop it right there
-        navButtons.animate().cancel();
-
-        final float navButtonsAlpha = lightsOut ? 0.5f : 1f;
-
-        if (!animate) {
-            navButtons.setAlpha(navButtonsAlpha);
-        } else {
-            final int duration = lightsOut ? LIGHTS_OUT_DURATION : LIGHTS_IN_DURATION;
-            navButtons.animate()
-                    .alpha(navButtonsAlpha)
-                    .setDuration(duration)
-                    .start();
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/fling/FlingGestureDetector.java b/src/com/android/systemui/navigation/fling/FlingGestureDetector.java
deleted file mode 100644
index ff468e9..0000000
--- a/src/com/android/systemui/navigation/fling/FlingGestureDetector.java
+++ /dev/null
@@ -1,751 +0,0 @@
-/**
- * Copyright (C) 2013 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.
- * 
- * Haxd up version from sdk. exposed some values
- * 
- */
-package com.android.systemui.navigation.fling;
-
-import com.android.systemui.R;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Message;
-import android.view.InputEventConsistencyVerifier;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.ViewConfiguration;
-
-/**
- * Detects various gestures and events using the supplied {@link MotionEvent}s.
- * The {@link OnGestureListener} callback will notify users when a particular
- * motion event has occurred. This class should only be used with {@link MotionEvent}s
- * reported via touch (don't use for trackball events).
- *
- * To use this class:
- * <ul>
- *  <li>Create an instance of the {@code GestureDetector} for your {@link View}
- *  <li>In the {@link View#onTouchEvent(MotionEvent)} method ensure you call
- *          {@link #onTouchEvent(MotionEvent)}. The methods defined in your callback
- *          will be executed when the events occur.
- * </ul>
- */
-public class FlingGestureDetector {
-    /**
-     * The listener that is used to notify when gestures occur.
-     * If you want to listen for all the different gestures then implement
-     * this interface. If you only want to listen for a subset it might
-     * be easier to extend {@link SimpleOnGestureListener}.
-     */
-    public interface OnGestureListener {
-
-        /**
-         * Notified when a tap occurs with the down {@link MotionEvent}
-         * that triggered it. This will be triggered immediately for
-         * every down event. All other events should be preceded by this.
-         *
-         * @param e The down motion event.
-         */
-        boolean onDown(MotionEvent e);
-
-        /**
-         * The user has performed a down {@link MotionEvent} and not performed
-         * a move or up yet. This event is commonly used to provide visual
-         * feedback to the user to let them know that their action has been
-         * recognized i.e. highlight an element.
-         *
-         * @param e The down motion event
-         */
-        void onShowPress(MotionEvent e);
-
-        /**
-         * Notified when a tap occurs with the up {@link MotionEvent}
-         * that triggered it.
-         *
-         * @param e The up motion event that completed the first tap
-         * @return true if the event is consumed, else false
-         */
-        boolean onSingleTapUp(MotionEvent e);
-
-        /**
-         * Notified when a scroll occurs with the initial on down {@link MotionEvent} and the
-         * current move {@link MotionEvent}. The distance in x and y is also supplied for
-         * convenience.
-         *
-         * @param e1 The first down motion event that started the scrolling.
-         * @param e2 The move motion event that triggered the current onScroll.
-         * @param distanceX The distance along the X axis that has been scrolled since the last
-         *              call to onScroll. This is NOT the distance between {@code e1}
-         *              and {@code e2}.
-         * @param distanceY The distance along the Y axis that has been scrolled since the last
-         *              call to onScroll. This is NOT the distance between {@code e1}
-         *              and {@code e2}.
-         * @return true if the event is consumed, else false
-         */
-        boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
-
-        /**
-         * Notified when a scroll occurs with the initial on move {@link MotionEvent}
-         * that trigged it.
-         *
-         */
-        boolean onFirstScroll();
-
-        /**
-         * Notified on cancel {@link MotionEvent}
-         *
-         */
-        boolean onCancel();
-
-        /**
-         * Notified when a long press occurs with the initial on down {@link MotionEvent}
-         * that trigged it.
-         *
-         * @param e The initial on down motion event that started the longpress.
-         */
-        void onLongPress(MotionEvent e);
-
-        /**
-         * Notified when a long press is finished
-         *
-         */
-        void onFinishedLongPress();
-
-        /**
-         * Notified of a fling event when it occurs with the initial on down {@link MotionEvent}
-         * and the matching up {@link MotionEvent}. The calculated velocity is supplied along
-         * the x and y axis in pixels per second.
-         *
-         * @param e1 The first down motion event that started the fling.
-         * @param e2 The move motion event that triggered the current onFling.
-         * @param velocityX The velocity of this fling measured in pixels per second
-         *              along the x axis.
-         * @param velocityY The velocity of this fling measured in pixels per second
-         *              along the y axis.
-         * @return true if the event is consumed, else false
-         */
-        boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
-    }
-
-    /**
-     * The listener that is used to notify when a double-tap or a confirmed
-     * single-tap occur.
-     */
-    public interface OnDoubleTapListener {
-        /**
-         * Notified when a single-tap occurs.
-         * <p>
-         * Unlike {@link OnGestureListener#onSingleTapUp(MotionEvent)}, this
-         * will only be called after the detector is confident that the user's
-         * first tap is not followed by a second tap leading to a double-tap
-         * gesture.
-         *
-         * @param e The down motion event of the single-tap.
-         * @return true if the event is consumed, else false
-         */
-        boolean onSingleTapConfirmed(MotionEvent e);
- 
-        /**
-         * Notified when a double-tap occurs.
-         *
-         * @param e The down motion event of the first tap of the double-tap.
-         * @return true if the event is consumed, else false
-         */
-        boolean onDoubleTap(MotionEvent e);
-
-        /**
-         * Notified when an event within a double-tap gesture occurs, including
-         * the down, move, and up events.
-         *
-         * @param e The motion event that occurred during the double-tap gesture.
-         * @return true if the event is consumed, else false
-         */
-        boolean onDoubleTapEvent(MotionEvent e);
-    }
-
-    /**
-     * A convenience class to extend when you only want to listen for a subset
-     * of all the gestures. This implements all methods in the
-     * {@link OnGestureListener} and {@link OnDoubleTapListener} but does
-     * nothing and return {@code false} for all applicable methods.
-     */
-    public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener {
-
-        public boolean onSingleTapUp(MotionEvent e) {
-            return false;
-        }
-
-        public void onLongPress(MotionEvent e) {
-        }
-
-        public void onFinishedLongPress() {
-        }
-
-        public boolean onScroll(MotionEvent e1, MotionEvent e2,
-                float distanceX, float distanceY) {
-            return false;
-        }
-
-        public boolean onFirstScroll() {
-            return false;
-        }
-
-        public boolean onCancel() {
-            return false;
-        }
-
-        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
-                float velocityY) {
-            return false;
-        }
-
-        public void onShowPress(MotionEvent e) {
-        }
-
-        public boolean onDown(MotionEvent e) {
-            return false;
-        }
-
-        public boolean onDoubleTap(MotionEvent e) {
-            return false;
-        }
-
-        public boolean onDoubleTapEvent(MotionEvent e) {
-            return false;
-        }
-
-        public boolean onSingleTapConfirmed(MotionEvent e) {
-            return false;
-        }
-    }
-
-    private int mTouchSlopSquare;
-    private int mDoubleTapTouchSlopSquare;
-    private int mDoubleTapSlopSquare;
-    private int mMinimumFlingVelocity;
-    private int mMaximumFlingVelocity;
-
-    private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
-    private static final int TAP_TIMEOUT = ViewConfiguration.getTapTimeout();
-    private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
-    private static final int DOUBLE_TAP_MIN_TIME = ViewConfiguration.getDoubleTapMinTime();
-
-    // constants for Message.what used by GestureHandler below
-    private static final int SHOW_PRESS = 1;
-    private static final int LONG_PRESS = 2;
-    private static final int TAP = 3;
-
-    private final Handler mHandler;
-    private final OnGestureListener mListener;
-    private OnDoubleTapListener mDoubleTapListener;
-
-    private boolean mStillDown;
-    private boolean mDeferConfirmSingleTap;
-    private boolean mInLongPress;
-    private boolean mAlwaysInTapRegion;
-    private boolean mAlwaysInBiggerTapRegion;
-
-    private MotionEvent mCurrentDownEvent;
-    private MotionEvent mPreviousUpEvent;
-
-    /**
-     * True when the user is still touching for the second tap (down, move, and
-     * up events). Can only be true if there is a double tap listener attached.
-     */
-    private boolean mIsDoubleTapping;
-
-    private float mLastFocusX;
-    private float mLastFocusY;
-    private float mDownFocusX;
-    private float mDownFocusY;
-
-    private boolean mIsLongpressEnabled;
-
-    /**
-     * Determines speed during touch scrolling
-     */
-    private VelocityTracker mVelocityTracker;
-
-    /**
-     * Consistency verifier for debugging purposes.
-     */
-    private final InputEventConsistencyVerifier mInputEventConsistencyVerifier =
-            InputEventConsistencyVerifier.isInstrumentationEnabled() ?
-                    new InputEventConsistencyVerifier(this, 0) : null;
-
-    private class GestureHandler extends Handler {
-        GestureHandler() {
-            super();
-        }
-
-        GestureHandler(Handler handler) {
-            super(handler.getLooper());
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-            case SHOW_PRESS:
-                mListener.onShowPress(mCurrentDownEvent);
-                break;
-            case LONG_PRESS:
-                dispatchLongPress();
-                break;
-            case TAP:
-                // If the user's finger is still down, do not count it as a tap
-                if (mDoubleTapListener != null) {
-                    if (!mStillDown) {
-                        mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
-                    } else {
-                        mDeferConfirmSingleTap = true;
-                    }
-                }
-                break;
-            default:
-                throw new RuntimeException("Unknown message " + msg); //never
-            }
-        }
-    }
-
-    /**
-     * Creates a GestureDetector with the supplied listener.
-     * This variant of the constructor should be used from a non-UI thread 
-     * (as it allows specifying the Handler).
-     * 
-     * @param listener the listener invoked for all the callbacks, this must
-     * not be null.
-     * @param handler the handler to use
-     *
-     * @throws NullPointerException if either {@code listener} or
-     * {@code handler} is null.
-     *
-     * @deprecated Use {@link #GestureDetector(android.content.Context,
-     *      android.view.GestureDetector.OnGestureListener, android.os.Handler)} instead.
-     */
-    @Deprecated
-    public FlingGestureDetector(OnGestureListener listener, Handler handler) {
-        this(null, listener, handler);
-    }
-
-    /**
-     * Creates a GestureDetector with the supplied listener.
-     * You may only use this constructor from a UI thread (this is the usual situation).
-     * @see android.os.Handler#Handler()
-     * 
-     * @param listener the listener invoked for all the callbacks, this must
-     * not be null.
-     * 
-     * @throws NullPointerException if {@code listener} is null.
-     *
-     * @deprecated Use {@link #GestureDetector(android.content.Context,
-     *      android.view.GestureDetector.OnGestureListener)} instead.
-     */
-    @Deprecated
-    public FlingGestureDetector(OnGestureListener listener) {
-        this(null, listener, null);
-    }
-
-    /**
-     * Creates a GestureDetector with the supplied listener that runs deferred events on the
-     * thread associated with the supplied {@link android.os.Handler}.
-     * @see android.os.Handler#Handler()
-     *
-     * @param context the application's context
-     * @param listener the listener invoked for all the callbacks, this must
-     * not be null.
-     * @param handler the handler to use for running deferred listener events.
-     *
-     * @throws NullPointerException if {@code listener} is null.
-     */
-    public FlingGestureDetector(Context context, OnGestureListener listener, Handler handler) {
-        if (handler != null) {
-            mHandler = new GestureHandler(handler);
-        } else {
-            mHandler = new GestureHandler();
-        }
-        mListener = listener;
-        if (listener instanceof OnDoubleTapListener) {
-            setOnDoubleTapListener((OnDoubleTapListener) listener);
-        }
-        init(context);
-    }
-    
-    /**
-     * Creates a GestureDetector with the supplied listener that runs deferred events on the
-     * thread associated with the supplied {@link android.os.Handler}.
-     * @see android.os.Handler#Handler()
-     *
-     * @param context the application's context
-     * @param listener the listener invoked for all the callbacks, this must
-     * not be null.
-     * @param handler the handler to use for running deferred listener events.
-     * @param unused currently not used.
-     *
-     * @throws NullPointerException if {@code listener} is null.
-     */
-    public FlingGestureDetector(Context context, OnGestureListener listener, Handler handler,
-            boolean unused) {
-        this(context, listener, handler);
-    }
-
-    private void init(Context context) {
-        if (mListener == null) {
-            throw new NullPointerException("OnGestureListener must not be null");
-        }
-        mIsLongpressEnabled = true;
-
-        // Fallback to support pre-donuts releases
-        int touchSlop, doubleTapSlop, doubleTapTouchSlop;
-        float touchSlopIncreaseFactor;
-        if (context == null) {
-            //noinspection deprecation
-            touchSlop = ViewConfiguration.getTouchSlop();
-            doubleTapTouchSlop = touchSlop; // Hack rather than adding a hiden method for this
-            doubleTapSlop = ViewConfiguration.getDoubleTapSlop();
-            //noinspection deprecation
-            mMinimumFlingVelocity = ViewConfiguration.getMinimumFlingVelocity();
-            mMaximumFlingVelocity = ViewConfiguration.getMaximumFlingVelocity();
-        } else {
-            final ViewConfiguration configuration = ViewConfiguration.get(context);
-
-            touchSlopIncreaseFactor = context.getResources().getFloat(R.dimen.config_fling_touchslop_increase_factor);
-            final int slop = configuration.getScaledTouchSlop();
-            touchSlop = Math.round(slop * touchSlopIncreaseFactor);
-
-            doubleTapTouchSlop = configuration.getScaledDoubleTapTouchSlop();
-            doubleTapSlop = configuration.getScaledDoubleTapSlop();
-            mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity();
-            mMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity();
-        }
-        mTouchSlopSquare = touchSlop * touchSlop;
-        mDoubleTapTouchSlopSquare = doubleTapTouchSlop * doubleTapTouchSlop;
-        mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop;
-    }
-
-    /**
-     * Sets the listener which will be called for double-tap and related
-     * gestures.
-     * 
-     * @param onDoubleTapListener the listener invoked for all the callbacks, or
-     *        null to stop listening for double-tap gestures.
-     */
-    public void setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener) {
-        mDoubleTapListener = onDoubleTapListener;
-    }
-
-    /**
-     * Set whether longpress is enabled, if this is enabled when a user
-     * presses and holds down you get a longpress event and nothing further.
-     * If it's disabled the user can press and hold down and then later
-     * moved their finger and you will get scroll events. By default
-     * longpress is enabled.
-     *
-     * @param isLongpressEnabled whether longpress should be enabled.
-     */
-    public void setIsLongpressEnabled(boolean isLongpressEnabled) {
-        mIsLongpressEnabled = isLongpressEnabled;
-    }
-
-    /**
-     * @override to set custom longpress timeout
-     */
-    protected int getLongPressTimeout() {
-        return LONGPRESS_TIMEOUT;
-    }
-
-    /**
-     * @override to set custom doubletap timeout
-     */
-    protected int getDoubleTapTimeout() {
-        return DOUBLE_TAP_TIMEOUT;
-    }
-
-    /**
-     * @override to set custom tap timeout
-     */
-    protected int getTapTimeout() {
-        return TAP_TIMEOUT;
-    }
-
-    /**
-     * @override to set custom doubletap minimum time
-     */
-    protected int getDoubleTapMinTime() {
-        return DOUBLE_TAP_MIN_TIME;
-    }
-    /**
-     * @return true if longpress is enabled, else false.
-     */
-    public boolean isLongpressEnabled() {
-        return mIsLongpressEnabled;
-    }
-
-    /**
-     * Analyzes the given motion event and if applicable triggers the
-     * appropriate callbacks on the {@link OnGestureListener} supplied.
-     *
-     * @param ev The current motion event.
-     * @return true if the {@link OnGestureListener} consumed the event,
-     *              else false.
-     */
-    public boolean onTouchEvent(MotionEvent ev) {
-
-        if (mInputEventConsistencyVerifier != null) {
-            mInputEventConsistencyVerifier.onTouchEvent(ev, 0);
-        }
-
-        final int action = ev.getAction();
-
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-        mVelocityTracker.addMovement(ev);
-
-        final boolean pointerUp =
-                (action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP;
-        final int skipIndex = pointerUp ? ev.getActionIndex() : -1;
-
-        // Determine focal point
-        float sumX = 0, sumY = 0;
-        final int count = ev.getPointerCount();
-        for (int i = 0; i < count; i++) {
-            if (skipIndex == i) continue;
-            sumX += ev.getX(i);
-            sumY += ev.getY(i);
-        }
-        final int div = pointerUp ? count - 1 : count;
-        final float focusX = sumX / div;
-        final float focusY = sumY / div;
-
-        boolean handled = false;
-
-        switch (action & MotionEvent.ACTION_MASK) {
-        case MotionEvent.ACTION_POINTER_DOWN:
-            mDownFocusX = mLastFocusX = focusX;
-            mDownFocusY = mLastFocusY = focusY;
-            // Cancel long press and taps
-            cancelTaps();
-            break;
-
-        case MotionEvent.ACTION_POINTER_UP:
-            mDownFocusX = mLastFocusX = focusX;
-            mDownFocusY = mLastFocusY = focusY;
-
-            // Check the dot product of current velocities.
-            // If the pointer that left was opposing another velocity vector, clear.
-            mVelocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
-            final int upIndex = ev.getActionIndex();
-            final int id1 = ev.getPointerId(upIndex);
-            final float x1 = mVelocityTracker.getXVelocity(id1);
-            final float y1 = mVelocityTracker.getYVelocity(id1);
-            for (int i = 0; i < count; i++) {
-                if (i == upIndex) continue;
-
-                final int id2 = ev.getPointerId(i);
-                final float x = x1 * mVelocityTracker.getXVelocity(id2);
-                final float y = y1 * mVelocityTracker.getYVelocity(id2);
-
-                final float dot = x + y;
-                if (dot < 0) {
-                    mVelocityTracker.clear();
-                    break;
-                }
-            }
-            break;
-
-        case MotionEvent.ACTION_DOWN:
-            if (mDoubleTapListener != null) {
-                boolean hadTapMessage = mHandler.hasMessages(TAP);
-                if (hadTapMessage) mHandler.removeMessages(TAP);
-                if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage &&
-                        isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) {
-                    // This is a second tap
-                    mIsDoubleTapping = true;
-                    // Give a callback with the first tap of the double-tap
-                    handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
-                    // Give a callback with down event of the double-tap
-                    handled |= mDoubleTapListener.onDoubleTapEvent(ev);
-                } else {
-                    // This is a first tap
-                    mHandler.sendEmptyMessageDelayed(TAP, getDoubleTapTimeout());
-                }
-            }
-
-            mDownFocusX = mLastFocusX = focusX;
-            mDownFocusY = mLastFocusY = focusY;
-            if (mCurrentDownEvent != null) {
-                mCurrentDownEvent.recycle();
-            }
-            mCurrentDownEvent = MotionEvent.obtain(ev);
-            mAlwaysInTapRegion = true;
-            mAlwaysInBiggerTapRegion = true;
-            mStillDown = true;
-            mInLongPress = false;
-            mDeferConfirmSingleTap = false;
-
-            if (mIsLongpressEnabled) {
-                mHandler.removeMessages(LONG_PRESS);
-                mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime()
-                        + getTapTimeout() + getLongPressTimeout());
-            }
-            mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + getTapTimeout());
-            handled |= mListener.onDown(ev);
-            break;
-
-        case MotionEvent.ACTION_MOVE:
-            if (mInLongPress) {
-                break;
-            }
-            final float scrollX = mLastFocusX - focusX;
-            final float scrollY = mLastFocusY - focusY;
-            if (mIsDoubleTapping) {
-                // Give the move events of the double-tap
-                handled |= mDoubleTapListener.onDoubleTapEvent(ev);
-            } else if (mAlwaysInTapRegion) {
-                final int deltaX = (int) (focusX - mDownFocusX);
-                final int deltaY = (int) (focusY - mDownFocusY);
-                int distance = (deltaX * deltaX) + (deltaY * deltaY);
-                if (distance > mTouchSlopSquare) {
-                    handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
-                    mLastFocusX = focusX;
-                    mLastFocusY = focusY;
-                    mAlwaysInTapRegion = false;
-                    mHandler.removeMessages(TAP);
-                    mHandler.removeMessages(SHOW_PRESS);
-                    mHandler.removeMessages(LONG_PRESS);
-                    mListener.onFinishedLongPress();
-                    mListener.onFirstScroll();
-                }
-                if (distance > mDoubleTapTouchSlopSquare) {
-                    mAlwaysInBiggerTapRegion = false;
-                }
-            } else if ((Math.abs(scrollX) >= 1) || (Math.abs(scrollY) >= 1)) {
-                handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
-                mLastFocusX = focusX;
-                mLastFocusY = focusY;
-            }
-            break;
-
-        case MotionEvent.ACTION_UP:
-            mStillDown = false;
-            MotionEvent currentUpEvent = MotionEvent.obtain(ev);
-            if (mIsDoubleTapping) {
-                // Finally, give the up event of the double-tap
-                handled |= mDoubleTapListener.onDoubleTapEvent(ev);
-            } else if (mInLongPress) {
-                mHandler.removeMessages(TAP);
-                mInLongPress = false;
-            } else if (mAlwaysInTapRegion) {
-                handled = mListener.onSingleTapUp(ev);
-                if (mDeferConfirmSingleTap && mDoubleTapListener != null) {
-                    mDoubleTapListener.onSingleTapConfirmed(ev);
-                }
-            } else {
-
-                // A fling must travel the minimum tap distance
-                final VelocityTracker velocityTracker = mVelocityTracker;
-                final int pointerId = ev.getPointerId(0);
-                velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
-                final float velocityY = velocityTracker.getYVelocity(pointerId);
-                final float velocityX = velocityTracker.getXVelocity(pointerId);
-
-                if ((Math.abs(velocityY) > mMinimumFlingVelocity)
-                        || (Math.abs(velocityX) > mMinimumFlingVelocity)){
-                    handled = mListener.onFling(mCurrentDownEvent, ev, velocityX, velocityY);
-                }
-            }
-            if (mPreviousUpEvent != null) {
-                mPreviousUpEvent.recycle();
-            }
-            // Hold the event we obtained above - listeners may have changed the original.
-            mPreviousUpEvent = currentUpEvent;
-            if (mVelocityTracker != null) {
-                // This may have been cleared when we called out to the
-                // application above.
-                mVelocityTracker.recycle();
-                mVelocityTracker = null;
-            }
-            mIsDoubleTapping = false;
-            mDeferConfirmSingleTap = false;
-            mHandler.removeMessages(SHOW_PRESS);
-            mHandler.removeMessages(LONG_PRESS);
-            mListener.onFinishedLongPress();
-            break;
-
-        case MotionEvent.ACTION_CANCEL:
-            mListener.onCancel();
-            cancel();
-            break;
-        }
-
-        if (!handled && mInputEventConsistencyVerifier != null) {
-            mInputEventConsistencyVerifier.onUnhandledEvent(ev, 0);
-        }
-        return handled;
-    }
-
-    private void cancel() {
-        mHandler.removeMessages(SHOW_PRESS);
-        mHandler.removeMessages(LONG_PRESS);
-        mHandler.removeMessages(TAP);
-        mVelocityTracker.recycle();
-        mVelocityTracker = null;
-        mIsDoubleTapping = false;
-        mStillDown = false;
-        mAlwaysInTapRegion = false;
-        mAlwaysInBiggerTapRegion = false;
-        mDeferConfirmSingleTap = false;
-        if (mInLongPress) {
-            mInLongPress = false;
-        }
-    }
-
-    private void cancelTaps() {
-        mHandler.removeMessages(SHOW_PRESS);
-        mHandler.removeMessages(LONG_PRESS);
-        mHandler.removeMessages(TAP);
-        mIsDoubleTapping = false;
-        mAlwaysInTapRegion = false;
-        mAlwaysInBiggerTapRegion = false;
-        mDeferConfirmSingleTap = false;
-        if (mInLongPress) {
-            mInLongPress = false;
-        }
-    }
-
-    private boolean isConsideredDoubleTap(MotionEvent firstDown, MotionEvent firstUp,
-            MotionEvent secondDown) {
-        if (!mAlwaysInBiggerTapRegion) {
-            return false;
-        }
-
-        final long deltaTime = secondDown.getEventTime() - firstUp.getEventTime();
-        if (deltaTime > getDoubleTapTimeout() || deltaTime < getDoubleTapMinTime()) {
-            return false;
-        }
-
-        int deltaX = (int) firstDown.getX() - (int) secondDown.getX();
-        int deltaY = (int) firstDown.getY() - (int) secondDown.getY();
-        return (deltaX * deltaX + deltaY * deltaY < mDoubleTapSlopSquare);
-    }
-
-    private void dispatchLongPress() {
-        mHandler.removeMessages(TAP);
-        mDeferConfirmSingleTap = false;
-        mInLongPress = true;
-        mListener.onLongPress(mCurrentDownEvent);
-    }
-}
-
diff --git a/src/com/android/systemui/navigation/fling/FlingGestureHandler.java b/src/com/android/systemui/navigation/fling/FlingGestureHandler.java
deleted file mode 100644
index 67c130c..0000000
--- a/src/com/android/systemui/navigation/fling/FlingGestureHandler.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/**
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2016 The DirtyUnicorns Project
- *
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- *
- * Fires actions based on detected motion. calculates long and short swipes
- * as well as double taps. User can set "long swipe thresholds" for custom
- * long swipe definition.
- *
- */
-
-package com.android.systemui.navigation.fling;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import com.android.systemui.navigation.fling.FlingGestureDetector.OnGestureListener;
-import com.android.systemui.navigation.utils.SmartObserver.SmartObservable;
-import com.android.internal.utils.du.DUActionUtils;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.ViewConfiguration;
-import android.view.View;
-
-public class FlingGestureHandler implements OnGestureListener, SmartObservable {
-/*
- * Callback for listeners that are interested in receiving Fling taps and gestures
- *
- */
-    public interface Swipeable {
-        public boolean onDoubleTapEnabled();
-
-        public void onSingleLeftPress();
-
-        public void onSingleRightPress();
-
-        public void onDoubleLeftTap();
-
-        public void onDoubleRightTap();
-
-        public void onLongLeftPress();
-
-        public void onLongRightPress();
-
-        public void onShortLeftSwipe();
-
-        public void onLongLeftSwipe();
-
-        public void onShortRightSwipe();
-
-        public void onLongRightSwipe();
-
-        public void onUpRightSwipe();
-
-        public void onUpLeftSwipe();
-
-        public void onDownPreloadRecents(boolean isRight);
-
-        public void onScrollPreloadRecents();
-
-        public void onCancelPreloadRecents();
-
-        public void cancelLongPress();
-    }
-
-    private static Set<Uri> sUris = new HashSet<Uri>();
-    static {
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LONGSWIPE_THRESHOLD_LEFT_LAND));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LONGSWIPE_THRESHOLD_RIGHT_LAND));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LONGSWIPE_THRESHOLD_LEFT_PORT));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LONGSWIPE_THRESHOLD_RIGHT_PORT));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LONGSWIPE_THRESHOLD_UP_LAND));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LONGSWIPE_THRESHOLD_DOWN_LAND));
-    }
-
-    private static String TAG = "FlingGestureHandler";
-    private static boolean DEBUG = false;
-
-    // AOSP DT timeout feels a bit slow on nx
-    private static final int DT_TIMEOUT = ViewConfiguration.getDoubleTapTimeout() - 100;
-
-    // in-house double tap logic
-    private Handler mHandler = new Handler();
-    private boolean mIsDoubleTapPending;
-    private boolean mWasConsumed;
-
-    // long swipe thresholds from user settings or default config
-    //
-    // left and right thresholds for tablets when device orientation is landscape
-    private float mLeftLand;
-    private float mRightLand;
-    // left and right thresholds for all devices when device orientation is portrait
-    private float mLeftPort;
-    private float mRightPort;
-    // up and down thresholds for phones when device orientation is landscape and navbar is vertical
-    private float mUpVert;
-    private float mDownVert;
-
-    // pass Fling events to listener
-    private Swipeable mReceiver;
-    // swipe analysis and state
-    private final FlingSwipe mFlingSwipe = new FlingSwipe();
-    private Context mContext;
-
-    // for width/height logic
-    private View mHost;
-    // is navbar in "left in landscape" mode (vertical bar on left instead of right)
-    private boolean mLeftInLandscape;
-    private final boolean mIsTablet;
-
-    private Runnable mDoubleTapLeftTimeout = new Runnable() {
-        @Override
-        public void run() {
-            mWasConsumed = false;
-            mIsDoubleTapPending = false;
-            mReceiver.onSingleLeftPress();
-        }
-    };
-
-    private Runnable mDoubleTapRightTimeout = new Runnable() {
-        @Override
-        public void run() {
-            mWasConsumed = false;
-            mIsDoubleTapPending = false;
-            mReceiver.onSingleRightPress();
-        }
-    };
-
-    public FlingGestureHandler(Context context, Swipeable swiper, View host, boolean isTablet) {
-        mContext = context;
-        mReceiver = swiper;
-        mHost = host;
-        mIsTablet = isTablet;
-        updateSettings();
-    }
-
-    // special case: double tap for screen off we never capture up motion event
-    // maybe use broadcast receiver instead on depending on host
-    public void onScreenStateChanged(boolean screeOn) {
-        mWasConsumed = false;
-    }
-
-    public void setLeftInLandscape(boolean leftInLandscape) {
-        mLeftInLandscape = leftInLandscape;
-    }
-
-    public void setOnSwipeListener(Swipeable swiper) {
-        if (swiper != null) {
-            mReceiver = swiper;
-        }
-    }
-
-    @Override
-    public boolean onDown(MotionEvent e) {
-        boolean isRight = isRightSide(e.getX(), e.getY());
-        if (mIsDoubleTapPending) {
-            mIsDoubleTapPending = false;
-            mWasConsumed = true;
-            mHandler.removeCallbacks(mDoubleTapLeftTimeout);
-            mHandler.removeCallbacks(mDoubleTapRightTimeout);
-            if (isRight) {
-                mReceiver.onDoubleRightTap();
-            } else {
-                mReceiver.onDoubleLeftTap();
-            }
-            return true;
-        }
-        mReceiver.onDownPreloadRecents(isRight);
-        return false;
-    }
-
-    @Override
-    public void onShowPress(MotionEvent e) {
-        // TODO Auto-generated method stub
-    }
-
-    @Override
-    public boolean onSingleTapUp(MotionEvent e) {
-        boolean isRight = isRightSide(e.getX(), e.getY());
-        if (mReceiver.onDoubleTapEnabled()) {
-            if (mWasConsumed) {
-                mWasConsumed = false;
-                return true;
-            }
-            mIsDoubleTapPending = true;
-            if (isRight) {
-                mHandler.postDelayed(mDoubleTapRightTimeout, DT_TIMEOUT);
-            } else {
-                mHandler.postDelayed(mDoubleTapLeftTimeout, DT_TIMEOUT);
-            }
-        } else {
-            if (isRight) {
-                mReceiver.onSingleRightPress();
-            } else {
-                mReceiver.onSingleLeftPress();
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean onFirstScroll() {
-        mReceiver.onScrollPreloadRecents();
-        return false;
-    }
-
-    @Override
-    public boolean onCancel() {
-        mReceiver.onCancelPreloadRecents();
-        mReceiver.cancelLongPress();
-        return false;
-    }
-
-    @Override
-    public void onLongPress(MotionEvent e) {
-        boolean isRight = isRightSide(e.getX(), e.getY());
-        if (isRight) {
-            mReceiver.onLongRightPress();
-        } else {
-            mReceiver.onLongLeftPress();
-        }
-    }
-
-    @Override
-    public void onFinishedLongPress() {
-        mReceiver.cancelLongPress();
-    }
-
-    @Override
-    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
-            float velocityY) {
-        if (e1 == null) return true;
-
-        mFlingSwipe.process(e1, e2);
-
-        if (mFlingSwipe.swipeDirection == SwipeDirection.UP) {
-            if (mFlingSwipe.isSwipeOnRight()) {
-                mReceiver.onUpRightSwipe();
-            } else {
-                mReceiver.onUpLeftSwipe();
-            }
-        } else if (mFlingSwipe.swipeDirection == SwipeDirection.LEFT) {
-            if (mFlingSwipe.isThisLongSwipe()) {
-                mReceiver.onLongLeftSwipe();
-            } else {
-                mReceiver.onShortLeftSwipe();
-            }
-        } else if (mFlingSwipe.swipeDirection == SwipeDirection.RIGHT) {
-            if (mFlingSwipe.isThisLongSwipe()) {
-                mReceiver.onLongRightSwipe();
-            } else {
-                mReceiver.onShortRightSwipe();
-            }
-        }
-        return true;
-    }
-
-    private boolean isHorizontal() {
-        return mHost.getWidth() > mHost.getHeight();
-    }
-
-    /*
-     * Used for tap and up/down swipe events
-     * NOTE: when bar is vertical, "right" side
-     * refers to top half of bar and "left" refers
-     * to the bottom half
-     */
-    private boolean isRightSide(float x, float y) {
-        final boolean isVertical = !isHorizontal();
-        float length = isVertical ? mHost.getHeight() : mHost.getWidth();
-        float pos = isVertical ? y : x;
-        length /= 2;
-        return isVertical ? pos < length : pos > length;
-    }
-
-    private void updateSettings() {
-        ContentResolver resolver = mContext.getContentResolver();
-        Resources res = mContext.getResources();
-
-        mLeftLand = (float) (Settings.Secure.getIntForUser(
-                resolver, Settings.Secure.FLING_LONGSWIPE_THRESHOLD_LEFT_LAND,
-                25, UserHandle.USER_CURRENT) * 0.01f);
-
-        mRightLand = (float) (Settings.Secure.getIntForUser(
-                resolver, Settings.Secure.FLING_LONGSWIPE_THRESHOLD_RIGHT_LAND,
-                25, UserHandle.USER_CURRENT) * 0.01f);
-
-        mLeftPort = (float) (Settings.Secure.getIntForUser(
-                resolver, Settings.Secure.FLING_LONGSWIPE_THRESHOLD_LEFT_PORT,
-                mIsTablet ? 30 : 40, UserHandle.USER_CURRENT) * 0.01f);
-
-        mRightPort = (float) (Settings.Secure.getIntForUser(
-                resolver, Settings.Secure.FLING_LONGSWIPE_THRESHOLD_RIGHT_PORT,
-                mIsTablet ? 30 : 40, UserHandle.USER_CURRENT) * 0.01f);
-
-        mUpVert = (float) (Settings.Secure.getIntForUser(
-                resolver, Settings.Secure.FLING_LONGSWIPE_THRESHOLD_UP_LAND,
-                40, UserHandle.USER_CURRENT) * 0.01f);
-
-        mDownVert = (float) (Settings.Secure.getIntForUser(
-                resolver, Settings.Secure.FLING_LONGSWIPE_THRESHOLD_DOWN_LAND,
-                40, UserHandle.USER_CURRENT) * 0.01f);
-    }
-
-    @Override
-    public Set<Uri> onGetUris() {
-        return sUris;
-    }
-
-    @Override
-    public void onChange(Uri uri) {
-        updateSettings();
-    }
-
-    private enum SwipeDirection {
-        LEFT,
-        RIGHT,
-        UP
-    }
-
-    // This class will help despagettify motion handling, maybe ;p
-    private class FlingSwipe {
-        // minimum amount of bar to swipe to validate a vertical swipe
-        private static final float VERTICAL_SWIPE_THRESHOLD = 0.80f;
-        // Maximum swipe angle before fall over into non-vertical swipes
-        private static final double VERTICAL_SWIPE_DEGREES = 30.0d;
-
-        // direction of swipe, either actual or treated as such (vertical bar)
-        private SwipeDirection swipeDirection;
-
-        // was vertical swipe on right/left side
-        private boolean mVerticalSwipeOnRight;
-
-        // Between -1.0 to 1.0  - percent of bar swiped - however we expose only absolute value -
-        // direction should be checked with getSwipeDirection
-        private float horizontalSwipePercent;
-
-        // Between -1.0 to 1.0  - percent of bar swiped - however we expose only absolute value -
-        // direction should be checked with getSwipeDirection
-        private float verticalSwipePercent;
-
-        // the default or user set long swipe threshold for this long swipe event
-        private float longSwipeThreshold;
-
-        public FlingSwipe(){}
-
-        void process(MotionEvent start, MotionEvent end) {
-            // bar and device states
-            final boolean isNavbarHorizontal = isHorizontal();
-            final boolean isLandscape = DUActionUtils.isLandscape(mContext);
-            final float xStart = start.getX();
-            final float yStart = start.getY();
-            final float xDist = end.getX() - xStart;
-            final float yDist = end.getY() - yStart;
-
-            // how much bar long side did the swipe cover
-            horizontalSwipePercent = isNavbarHorizontal ? xDist / mHost.getWidth() :
-                    yDist / mHost.getHeight();
-            // how much bar short side was covered
-            verticalSwipePercent = isNavbarHorizontal ? yDist / mHost.getHeight() :
-                xDist / mHost.getWidth();
-            // which side was the swipe started from
-            mVerticalSwipeOnRight = isRightSide(xStart, yStart);
-
-            final boolean isVerticalSwipe = validateVerticalSwipe(isNavbarHorizontal, isLandscape, xDist, yDist);
-            if(!isVerticalSwipe) {
-                // normal side to side flinging action
-                // first check landscape conditions
-                if (isLandscape) {
-                    // is bar horizontal (tablet)
-                    if (isNavbarHorizontal) {
-                        if (horizontalSwipePercent >= 0) {
-                            swipeDirection = SwipeDirection.RIGHT;
-                            longSwipeThreshold = mRightLand;
-                        } else {
-                            swipeDirection = SwipeDirection.LEFT;
-                            longSwipeThreshold = mLeftLand;
-                        }
-                    } else {
-                        // vertical bar on phones
-                        if (horizontalSwipePercent >= 0) {
-                            swipeDirection = SwipeDirection.LEFT;
-                            longSwipeThreshold = mDownVert;
-                        } else {
-                            swipeDirection = SwipeDirection.RIGHT;
-                            longSwipeThreshold = mUpVert;
-                        }
-                    }
-                } else {
-                    // portrait orientation
-                    if (horizontalSwipePercent >= 0) {
-                        swipeDirection = SwipeDirection.RIGHT;
-                        longSwipeThreshold = mRightPort;
-                    } else {
-                        swipeDirection = SwipeDirection.LEFT;
-                        longSwipeThreshold = mLeftPort;
-                    }
-                }
-            }
-        }
-
-        private boolean validateVerticalSwipe(boolean isHorizontal, boolean isLandscape, float xDistance, float yDistance) {
-            // if we don't meet minimum threshold and we are too sloppy with our vertical swipe
-            // return false to continue processing
-            if (Math.abs(verticalSwipePercent) < VERTICAL_SWIPE_THRESHOLD) {
-                return false;
-            }
-            // calculate the angle of the swipe. If the angle exceeds 30 degrees, it is an invalid
-            // vertical swipe and the event will be handled as a long or short swipe
-            double degrees = Math.abs(Math.toDegrees(Math.atan(((isHorizontal ? xDistance : yDistance) / (isHorizontal ? yDistance : xDistance)))));
-            if(DEBUG) {
-                Log.e(TAG, "Validating a vertical swipe of " + String.valueOf(degrees) + " degrees");
-            }
-            if (degrees > VERTICAL_SWIPE_DEGREES) {
-                return false;
-            }
-            // conditions which must be met for a valid vertical swipe
-            if ((isHorizontal && verticalSwipePercent <= 0)  // horizontal and direction is up
-                    || (!isHorizontal && mLeftInLandscape && verticalSwipePercent >= 0) // vertical bar on left and direction is right
-                    || (!isHorizontal && !mLeftInLandscape && verticalSwipePercent <= 0)) { // vertical bar on right and direction is left
-                swipeDirection = SwipeDirection.UP;
-                return true;
-            }
-            return false;
-        }
-
-        public boolean isThisLongSwipe() {
-            return Math.abs(horizontalSwipePercent) > longSwipeThreshold;
-        }
-
-        public boolean isSwipeOnRight() {
-            return mVerticalSwipeOnRight;
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/fling/FlingLogoController.java b/src/com/android/systemui/navigation/fling/FlingLogoController.java
deleted file mode 100644
index b8720d0..0000000
--- a/src/com/android/systemui/navigation/fling/FlingLogoController.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- *
- * Manage logo settings and state. Public helper methods to simplify
- * animations and visibility. 
- *
- */
-
-package com.android.systemui.navigation.fling;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import com.android.systemui.R;
-import com.android.systemui.navigation.BaseNavigationBar;
-import com.android.systemui.navigation.fling.FlingLogoView;
-import com.android.systemui.navigation.fling.FlingView;
-import com.android.systemui.navigation.utils.SmartObserver.SmartObservable;
-import com.android.systemui.statusbar.policy.KeyButtonDrawable;
-import com.android.internal.utils.du.Config.ActionConfig;
-import com.android.internal.utils.du.Config.ButtonConfig;
-import com.android.internal.utils.du.DUActionUtils;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PaintFlagsDrawFilter;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.TypedValue;
-import android.view.ViewGroup;
-import android.view.animation.Animation;
-import android.view.animation.LinearInterpolator;
-import android.view.animation.ScaleAnimation;
-import android.view.animation.Animation.AnimationListener;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-
-public class FlingLogoController implements SmartObservable {
-    private static final int LOGO_ANIMATE_HIDE = 1;
-    private static final int LOGO_ANIMATE_SHOW = 2;
-
-    private static final int LOCK_DISABLED = 0;
-    private static final int LOCK_SHOW = 1;
-    private static final int LOCK_HIDDEN = 2;
-
-    public static final String FLING_LOGO_URI = "fling_custom_icon_config";
-
-    private static Set<Uri> sUris = new HashSet<Uri>();
-    static {
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LOGO_VISIBLE));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LOGO_ANIMATES));
-        //sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LOGO_COLOR));
-        sUris.add(Settings.Secure.getUriFor(FLING_LOGO_URI));
-    }
-
-    private Context mContext;
-    private FlingView mHost;
-    private FlingLogoView mLogoView;
-    private ButtonConfig mLogoConfig;
-
-    private boolean mLogoEnabled;
-    private boolean mAnimateTouchEnabled;
-    private int mLogoColor = -1;
-    private int mVisibilityLock;
-    private Animation mShow = getSpinAnimation(LOGO_ANIMATE_SHOW);
-    private Animation mHide = getSpinAnimation(LOGO_ANIMATE_HIDE);
-
-    public FlingLogoController(FlingView host) {
-        mHost = host;
-        mContext = host.getContext();
-        initialize();
-    }
-
-    public void setLogoView(FlingLogoView view) {
-        mLogoView = view;
-        mLogoView.setLogoColor(mLogoColor);
-        animateToCurrentState();
-    }
-
-    private void animateToCurrentState() {
-        if (mLogoEnabled) {
-            if (mVisibilityLock == LOCK_HIDDEN) {
-                hide(null);
-            } else {
-                show(null);
-            }
-        } else {
-            hide(null);
-        }
-    }
-
-    private void show(AnimationListener listener) {
-        mLogoView.animate().cancel();
-        if (listener != null) {
-            mShow.setAnimationListener(listener);
-        }
-        mLogoView.startAnimation(mShow);
-    }
-
-    private void hide(AnimationListener listener) {
-        mLogoView.animate().cancel();
-        if (listener != null) {
-            mHide.setAnimationListener(listener);
-        }
-        mLogoView.startAnimation(mHide);
-    }
-
-    private boolean isLockEnabled() {
-        return mVisibilityLock != LOCK_DISABLED;
-    }
-
-    private void setEnabled(boolean enabled) {
-        mLogoEnabled = enabled;
-        animateToCurrentState();
-    }
-
-    public boolean isEnabled() {
-        return mLogoEnabled;
-    }
-
-    public void onTouchHide(AnimationListener listener) {
-        if (!mLogoEnabled || !mAnimateTouchEnabled || isLockEnabled()) {
-            return;
-        }
-        hide(listener);
-    }
-
-    public void onTouchShow(AnimationListener listener) {
-        if (!mLogoEnabled || !mAnimateTouchEnabled || isLockEnabled()) {
-            return;
-        }
-        show(listener);
-    }
-
-    public void showAndLock(AnimationListener listener) {
-        mVisibilityLock = LOCK_SHOW;
-        if (mLogoEnabled) {
-            show(listener);
-        }
-    }
-
-    public void hideAndLock(AnimationListener listener) {
-        mVisibilityLock = LOCK_HIDDEN;
-        if (mLogoEnabled) {
-            hide(listener);
-        }
-    }
-
-    public void unlockAndShow(AnimationListener listener) {
-        mVisibilityLock = LOCK_DISABLED;
-        if (mLogoEnabled) {
-            show(listener);
-        }
-    }
-
-    public void unlockAndHide(AnimationListener listener) {
-        mVisibilityLock = LOCK_DISABLED;
-        if (mLogoEnabled) {
-            hide(listener);
-        }
-    }
-
-    @Override
-    public Set<Uri> onGetUris() {
-        return sUris;
-    }
-
-    @Override
-    public void onChange(Uri uri) {
-        updateSettings();
-    }
-
-    private void updateSettings() {
-        boolean enabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_LOGO_VISIBLE, 1, UserHandle.USER_CURRENT) == 1;
-        boolean spinOnTouch = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_LOGO_ANIMATES, 1, UserHandle.USER_CURRENT) == 1;
-        /*mLogoColor = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_LOGO_COLOR, -1, UserHandle.USER_CURRENT);*/
-        mLogoConfig = ButtonConfig.getButton(mContext, FLING_LOGO_URI, true);
-        setLogoIcon();
-        mLogoView.setLogoColor(mLogoColor);
-        if (mLogoEnabled != enabled) {
-            setEnabled(enabled);
-        }
-        if (mAnimateTouchEnabled != spinOnTouch) {
-            mAnimateTouchEnabled = spinOnTouch;
-        }
-    }
-
-    private void initialize() {
-        mLogoEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_LOGO_VISIBLE, 1, UserHandle.USER_CURRENT) == 1;
-        mAnimateTouchEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_LOGO_ANIMATES, 1, UserHandle.USER_CURRENT) == 1;
-        /*mLogoColor = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_LOGO_COLOR, -1, UserHandle.USER_CURRENT);*/
-        mLogoConfig = ButtonConfig.getButton(mContext, FLING_LOGO_URI, true);
-    }
-
-    public void updateLogo(FlingView fv, FlingLogoView lv) {
-        mHost = fv;
-        mContext = fv.getContext();
-        mLogoConfig = ButtonConfig.getButton(mContext, FLING_LOGO_URI, true);
-        setLogoView(lv);
-        setLogoIcon();
-    }
-
-    void setLogoIcon() {
-        final ViewGroup current = (ViewGroup) mHost.getCurrentView();
-        final ViewGroup hidden = (ViewGroup) mHost.getHiddenView();
-        ImageView currentLogo = (ImageView)current.findViewById(R.id.fling_console);
-        ImageView hiddenLogo = (ImageView)hidden.findViewById(R.id.fling_console);
-        currentLogo.setImageDrawable(null);
-        currentLogo.setImageDrawable(getCurrentDrawable());
-        hiddenLogo.setImageDrawable(null);
-        hiddenLogo.setImageDrawable(getCurrentDrawable());
-        updateButtonScalingAndPadding(currentLogo, mLogoConfig, mHost.isLandscape());
-        updateButtonScalingAndPadding(hiddenLogo, mLogoConfig, !mHost.isLandscape());
-
-        ImageView currentRotationLogo = (ImageView)current.findViewById(R.id.rotationLogo);
-        ImageView hiddenRotationLogo = (ImageView)hidden.findViewById(R.id.rotationLogo);
-        currentRotationLogo.setImageDrawable(null);
-        currentRotationLogo.setImageDrawable(getCurrentRotationDrawable());
-        hiddenRotationLogo.setImageDrawable(null);
-        hiddenRotationLogo.setImageDrawable(getCurrentRotationDrawable());
-        updateButtonScalingAndPadding(currentRotationLogo, mLogoConfig, mHost.isLandscape());
-        updateButtonScalingAndPadding(hiddenRotationLogo, mLogoConfig, !mHost.isLandscape());
-    }
-
-    Drawable getCurrentDrawable() {
-        KeyButtonDrawable d = null;
-        Drawable light = null;
-        Drawable dark = null;
-        if (mLogoConfig.hasCustomIcon() &&
-                getConfigCustomIcon() != null) {
-            light = getBitmapDrawable(mContext, getConfigCustomIcon()).mutate();
-            dark = getBitmapDrawable(mContext, getConfigCustomIcon()).mutate();
-            dark.setColorFilter(new PorterDuffColorFilter(0x4D353535, PorterDuff.Mode.SRC_ATOP));
-            d = KeyButtonDrawable.create(light, dark);
-            return d;
-        }
-
-        light = mHost.mResourceMap.mFlingLogo;
-        dark = mHost.mResourceMap.mFlingLogoDark;
-        d = KeyButtonDrawable.create(light, dark);
-        return d;
-    }
-
-    Drawable getCurrentRotationDrawable() {
-        Drawable light = mHost.mResourceMap.mFlingRotationLogo;
-        Drawable dark = mHost.mResourceMap.mFlingRotationLogoDark;
-        KeyButtonDrawable d = KeyButtonDrawable.create(light, dark);
-        return d;
-    }
-
-    // Helper to flatten AdaptiveIconDrawable layers to a single drawable
-    private static BitmapDrawable getBitmapDrawable(Context ctx, Drawable d) {
-        if (d instanceof BitmapDrawable) {
-            return (BitmapDrawable) d;
-        }
-        final Canvas canvas = new Canvas();
-        canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.ANTI_ALIAS_FLAG,
-                Paint.FILTER_BITMAP_FLAG));
-
-        Bitmap bmResult = Bitmap.createBitmap(d.getIntrinsicWidth(), d.getIntrinsicHeight(),
-                Bitmap.Config.ARGB_8888);
-        canvas.setBitmap(bmResult);
-        d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
-        d.draw(canvas);
-        return new BitmapDrawable(ctx.getResources(), bmResult);
-    }
-
-    private Drawable getConfigCustomIcon() {
-        return mLogoConfig.getActionConfig(ActionConfig.PRIMARY).getCurrentCustomIcon(mContext);
-    }
-
-    public static Animation getSpinAnimation(int mode) {
-        final boolean makeHidden = mode == LOGO_ANIMATE_HIDE;
-        final float from = makeHidden ? 1.0f : 0.0f;
-        final float to = makeHidden ? 0.0f : 1.0f;
-        Animation ani = new ScaleAnimation(from, to, from, to, Animation.RELATIVE_TO_SELF,
-                0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
-        ani.setInterpolator(new LinearInterpolator());
-        ani.setDuration(150);
-        ani.setFillAfter(true);
-
-        return ani;
-    }
-
-    static int[] getAppIconPadding(Context ctx) {
-        int[] padding = new int[4];
-        // left
-        padding[0] = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, ctx
-                .getResources()
-                .getDisplayMetrics());
-        // top
-        padding[1] = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, ctx
-                .getResources()
-                .getDisplayMetrics());
-        // right
-        padding[2] = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, ctx
-                .getResources()
-                .getDisplayMetrics());
-        // bottom
-        padding[3] = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5,
-                ctx.getResources()
-                        .getDisplayMetrics());
-        return padding;
-    }
-
-    public static void applyPaddingToView(ImageView v, int[] padding) {
-        v.setPaddingRelative(padding[0], padding[1],
-                padding[2], padding[3]);
-    }
-
-    static boolean buttonNeedsCustomPadding(ButtonConfig config) {
-        boolean hasCustomIcon = config.hasCustomIcon();
-        boolean hasNonSystemIcon = !config.isSystemAction();
-        return hasCustomIcon || hasNonSystemIcon;
-    }
-
-    public static void updateButtonScalingAndPadding(ImageView v, ButtonConfig config, boolean landscape) {
-        // all non-system action icons need some extra padding/scaling work
-        final int[] appIconPadding = getAppIconPadding(v.getContext());
-        if (buttonNeedsCustomPadding(config)) {
-            if (landscape && !BaseNavigationBar.sIsTablet) {
-                v.setPaddingRelative(appIconPadding[1], appIconPadding[0],
-                        appIconPadding[3], appIconPadding[2]);
-            } else {
-                v.setPaddingRelative(appIconPadding[0], appIconPadding[1],
-                        appIconPadding[2], appIconPadding[3]);
-            }
-            v.setScaleType(ScaleType.CENTER_INSIDE);
-        } else {
-            if (landscape && BaseNavigationBar.sIsTablet) {
-                v.setPaddingRelative(appIconPadding[0], appIconPadding[1],
-                        appIconPadding[2], appIconPadding[3]);
-                v.setScaleType(ScaleType.CENTER_INSIDE);
-            }
-            v.setScaleType(BaseNavigationBar.sIsTablet ? ScaleType.CENTER_INSIDE : ScaleType.CENTER);
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/fling/FlingLogoView.java b/src/com/android/systemui/navigation/fling/FlingLogoView.java
deleted file mode 100644
index 4eaebff..0000000
--- a/src/com/android/systemui/navigation/fling/FlingLogoView.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- * 
- * TeamEos logo doubles as the Fling feature indicator! Most state is managed
- * by FlingLogoController
- *
- */
-
-package com.android.systemui.navigation.fling;
-
-import android.content.Context;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.widget.ImageView;
-
-public class FlingLogoView extends ImageView {
-
-    public static final String TAG = FlingLogoView.class.getSimpleName();
-
-    private int mLogoColor = -1;
-
-    public FlingLogoView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public FlingLogoView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setBackground(null);
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        // TEMP: pass all events to NX, for now
-        return false;
-    }
-
-    public int getLogoColor() {
-        return mLogoColor;
-    }
-
-    public void setLogoColor(int color) {
-        mLogoColor = color;
-        /*if (color == -1) {
-            getDrawable().setColorFilter(null);
-        } else {
-            Drawable logo = getDrawable();
-            logo.setColorFilter(color, Mode.SRC_ATOP);
-        }*/
-    }
-}
diff --git a/src/com/android/systemui/navigation/fling/FlingRipple.java b/src/com/android/systemui/navigation/fling/FlingRipple.java
deleted file mode 100644
index 0bc5f74..0000000
--- a/src/com/android/systemui/navigation/fling/FlingRipple.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (C) 2014 Balys Valentukevicius
- *
- * 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.
- * 
- * Heavily modified for TeamEos NX implementation by Randall Rushing aka Bigrushdog
- * 
- */
-
-package com.android.systemui.navigation.fling;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.util.Property;
-import android.util.TypedValue;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.LinearInterpolator;
-
-public class FlingRipple implements View.OnTouchListener {
-    private static final int DEFAULT_DURATION = 350;
-    private static final int DEFAULT_FADE_DURATION = 75;
-    private static final float DEFAULT_DIAMETER_DP = 10;
-    private static final float DEFAULT_ALPHA = 0.4f;
-    private static final int DEFAULT_COLOR = Color.WHITE;
-    private static final int DEFAULT_BACKGROUND = 0x22ffffff;
-    private static final boolean DEFAULT_HOVER = true;
-    private static final boolean DEFAULT_DELAY_CLICK = true;
-    private static final boolean DEFAULT_PERSISTENT = false;
-    private static final int FADE_EXTRA_DELAY = 50;
-    private static final long HOVER_DURATION = 2500;
-
-    private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-    private final Rect bounds = new Rect();
-
-    private int rippleColor;
-    private boolean rippleHover;
-    private int rippleDiameter;
-    private int rippleDuration;
-    private int rippleAlpha;
-    private boolean rippleDelayClick;
-    private int rippleFadeDuration;
-    private boolean ripplePersistent;
-    private Drawable rippleBackground;
-    private Point currentCoords = new Point();
-    private Point previousCoords = new Point();
-    private AnimatorSet rippleAnimator;
-    private ObjectAnimator hoverAnimator;
-    private float radius;
-
-    private boolean eventCancelled;
-    private boolean mDrawBackground = false;
-    private View mHost;
-
-    public FlingRipple(View v) {
-        mHost = v;
-        init();
-    }
-
-    private void init() {
-        final Resources res = mHost.getResources();
-
-        rippleColor = DEFAULT_COLOR;
-        rippleBackground = new ColorDrawable(adjustBgAlpha(rippleColor, 0.15f));
-        rippleAlpha = (int) (255 * DEFAULT_ALPHA);
-
-        rippleDiameter = (int) dpToPx(res, DEFAULT_DIAMETER_DP);
-        rippleHover = DEFAULT_HOVER;
-        rippleDuration = DEFAULT_DURATION;
-        rippleDelayClick = DEFAULT_DELAY_CLICK;
-        rippleFadeDuration = DEFAULT_FADE_DURATION;
-        ripplePersistent = DEFAULT_PERSISTENT;
-
-        paint.setColor(rippleColor);
-        paint.setAlpha(rippleAlpha);
-    }
-
-    public void updateResources(Resources res) {
-        rippleColor = DEFAULT_COLOR;
-        rippleBackground = new ColorDrawable(adjustBgAlpha(rippleColor, 0.15f));
-        rippleBackground.setBounds(bounds);
-        paint.setColor(rippleColor);
-        paint.setAlpha(rippleAlpha);
-        mHost.invalidate();
-    }
-
-    public void updateColor(int color) {
-        rippleColor = color;
-        rippleBackground = new ColorDrawable(adjustBgAlpha(color, 0.15f));
-        rippleBackground.setBounds(bounds);
-        paint.setColor(color);
-        paint.setAlpha(rippleAlpha);
-        mHost.invalidate();
-    }
-
-    public int adjustBgAlpha(int color, float factor) {
-        int alpha = Math.round(Color.alpha(color) * factor);
-        int red = Color.red(color);
-        int green = Color.green(color);
-        int blue = Color.blue(color);
-        return Color.argb(alpha, red, green, blue);
-    }
-
-    @Override
-    public boolean onTouch(View v, MotionEvent event) {
-        final int action = event.getAction();
-        boolean isEventInBounds = bounds.contains((int) event.getX(), (int) event.getY());
-        if (isEventInBounds) {
-            previousCoords.set(currentCoords.x, currentCoords.y);
-            currentCoords.set((int) event.getX(), (int) event.getY());
-        }
-        switch (action) {
-            case MotionEvent.ACTION_UP:
-                if (isEventInBounds) {
-                    startRipple(null);
-                } else if (!rippleHover) {
-                    setRadius(0);
-                }
-                break;
-            case MotionEvent.ACTION_DOWN:
-                eventCancelled = false;
-                mDrawBackground = true;
-                if (rippleHover) {
-                    startHover();
-                }
-                break;
-            case MotionEvent.ACTION_CANCEL:
-                if (rippleHover) {
-                    startRipple(null);
-                }
-                break;
-            case MotionEvent.ACTION_MOVE:
-                if (rippleHover) {
-                    if (isEventInBounds && !eventCancelled) {
-                        mHost.invalidate();
-                    } else if (!isEventInBounds) {
-                        startRipple(null);
-                    }
-                }
-                if (!isEventInBounds) {
-                    if (hoverAnimator != null) {
-                        hoverAnimator.cancel();
-                    }
-                    eventCancelled = true;
-                }
-                break;
-        }
-        return false;
-    }
-
-    public void onSizeChanged(int w, int h, int oldw, int oldh) {
-        bounds.set(0, 0, w, h);
-        rippleBackground.setBounds(bounds);
-    }
-
-    public void onDraw(Canvas canvas) {
-        if (mDrawBackground) {
-            rippleBackground.draw(canvas);
-        }
-        canvas.drawCircle(currentCoords.x, currentCoords.y, radius, paint);
-    }
-
-    static int getSmallerDimen(int width, int height) {
-        if (width <= 0 || height <= 0) {
-            return 35;
-        } else {
-            return width > height ? height : width;
-        }
-    }
-
-    static float dpToPx(Resources resources, float dp) {
-        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
-                resources.getDisplayMetrics());
-    }
-
-    private void startRipple(final Runnable animationEndRunnable) {
-        if (eventCancelled)
-            return;
-
-        float endRadius = getEndRadius();
-
-        cancelAnimations();
-
-        rippleAnimator = new AnimatorSet();
-        rippleAnimator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                if (!ripplePersistent) {
-                    setRadius(0);
-                    setRippleAlpha(rippleAlpha);
-                }
-                if (animationEndRunnable != null && rippleDelayClick) {
-                    animationEndRunnable.run();
-                }
-                mDrawBackground = false;
-                mHost.invalidate();
-            }
-        });
-
-        ObjectAnimator ripple = ObjectAnimator.ofFloat(this, radiusProperty, radius, endRadius);
-        ripple.setDuration(rippleDuration);
-        ripple.setInterpolator(new DecelerateInterpolator());
-        ObjectAnimator fade = ObjectAnimator.ofInt(this, circleAlphaProperty, rippleAlpha, 0);
-        fade.setDuration(rippleFadeDuration);
-        fade.setInterpolator(new AccelerateInterpolator());
-        fade.setStartDelay(rippleDuration - rippleFadeDuration - FADE_EXTRA_DELAY);
-
-        if (ripplePersistent) {
-            rippleAnimator.play(ripple);
-        } else if (getRadius() > endRadius) {
-            fade.setStartDelay(0);
-            rippleAnimator.play(fade);
-        } else {
-            rippleAnimator.playTogether(ripple, fade);
-        }
-        rippleAnimator.start();
-    }
-
-    private void startHover() {
-        if (eventCancelled)
-            return;
-
-        if (hoverAnimator != null) {
-            hoverAnimator.cancel();
-        }
-        final float radius = (float) (Math.sqrt(Math.pow(mHost.getWidth(), 2)
-                + Math.pow(mHost.getHeight(), 2)) * 1.2f);
-        hoverAnimator = ObjectAnimator.ofFloat(this, radiusProperty, rippleDiameter, radius)
-                .setDuration(HOVER_DURATION);
-        hoverAnimator.setInterpolator(new LinearInterpolator());
-        hoverAnimator.start();
-    }
-
-    private void cancelAnimations() {
-        if (rippleAnimator != null) {
-            rippleAnimator.cancel();
-            rippleAnimator.removeAllListeners();
-        }
-
-        if (hoverAnimator != null) {
-            hoverAnimator.cancel();
-        }
-    }
-
-    private float getEndRadius() {
-        final int width = mHost.getWidth();
-        final int height = mHost.getHeight();
-
-        final int halfWidth = width / 2;
-        final int halfHeight = height / 2;
-
-        final float radiusX = halfWidth > currentCoords.x ? width - currentCoords.x
-                : currentCoords.x;
-        final float radiusY = halfHeight > currentCoords.y ? height - currentCoords.y
-                : currentCoords.y;
-
-        return (float) Math.sqrt(Math.pow(radiusX, 2) + Math.pow(radiusY, 2)) * 1.2f;
-    }
-
-    private Property<FlingRipple, Float> radiusProperty = new Property<FlingRipple, Float>(Float.class,
-            "radius") {
-        @Override
-        public Float get(FlingRipple object) {
-            return object.getRadius();
-        }
-
-        @Override
-        public void set(FlingRipple object, Float value) {
-            object.setRadius(value);
-        }
-    };
-
-    private float getRadius() {
-        return radius;
-    }
-
-    public void setRadius(float radius) {
-        this.radius = radius;
-        mHost.invalidate();
-    }
-
-    private Property<FlingRipple, Integer> circleAlphaProperty = new Property<FlingRipple, Integer>(
-            Integer.class, "rippleAlpha") {
-        @Override
-        public Integer get(FlingRipple object) {
-            return object.getRippleAlpha();
-        }
-
-        @Override
-        public void set(FlingRipple object, Integer value) {
-            object.setRippleAlpha(value);
-        }
-    };
-
-    public int getRippleAlpha() {
-        return paint.getAlpha();
-    }
-
-    public void setRippleAlpha(Integer rippleAlpha) {
-        paint.setAlpha(rippleAlpha);
-        mHost.invalidate();
-    }
-
-    public void setRippleColor(int rippleColor) {
-        this.rippleColor = rippleColor;
-        paint.setColor(rippleColor);
-        paint.setAlpha(rippleAlpha);
-        mHost.invalidate();
-    }
-
-    public void setRippleDiameter(int rippleDiameter) {
-        this.rippleDiameter = rippleDiameter;
-    }
-
-    public void setRippleDuration(int rippleDuration) {
-        this.rippleDuration = rippleDuration;
-    }
-
-    public void setRippleBackground(int color) {
-        rippleBackground = new ColorDrawable(color);
-        rippleBackground.setBounds(bounds);
-        mHost.invalidate();
-    }
-
-    public void setRippleHover(boolean rippleHover) {
-        this.rippleHover = rippleHover;
-    }
-
-    public void setRippleDelayClick(boolean rippleDelayClick) {
-        this.rippleDelayClick = rippleDelayClick;
-    }
-
-    public void setRippleFadeDuration(int rippleFadeDuration) {
-        this.rippleFadeDuration = rippleFadeDuration;
-    }
-
-    public void setRipplePersistent(boolean ripplePersistent) {
-        this.ripplePersistent = ripplePersistent;
-    }
-
-    public void setDefaultRippleAlpha(int alpha) {
-        this.rippleAlpha = alpha;
-        paint.setAlpha(alpha);
-        mHost.invalidate();
-    }
-
-}
diff --git a/src/com/android/systemui/navigation/fling/FlingView.java b/src/com/android/systemui/navigation/fling/FlingView.java
deleted file mode 100644
index 115c07c..0000000
--- a/src/com/android/systemui/navigation/fling/FlingView.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/**
- * Copyright (C) 2014 The TeamEos Project
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- *
- * Gesture based navigation implementation and action executor
- *
- */
-
-package com.android.systemui.navigation.fling;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import com.android.systemui.R;
-import com.android.systemui.navigation.BaseNavigationBar;
-import com.android.systemui.navigation.NavbarOverlayResources;
-import com.android.systemui.navigation.fling.FlingActionHandler;
-import com.android.systemui.navigation.fling.FlingBarTransitions;
-import com.android.systemui.navigation.fling.FlingGestureDetector;
-import com.android.systemui.navigation.fling.FlingGestureHandler;
-import com.android.systemui.navigation.fling.FlingLogoController;
-import com.android.systemui.navigation.fling.FlingLogoView;
-import com.android.systemui.navigation.fling.FlingRipple;
-import com.android.systemui.navigation.fling.FlingView;
-import com.android.systemui.navigation.pulse.PulseController;
-import com.android.systemui.navigation.utils.SmartObserver.SmartObservable;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.phone.LightBarTransitionsController;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.internal.utils.du.ActionConstants;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.app.StatusBarManager;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.PowerManager;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
-import android.widget.ImageView;
-
-public class FlingView extends BaseNavigationBar {
-    final static String TAG = FlingView.class.getSimpleName();
-    final static int PULSE_FADE_OUT_DURATION = 250;
-    final static int PULSE_FADE_IN_DURATION = 200;
-    final static float PULSE_LOGO_OPACITY = 0.6f;
-
-    private static Set<Uri> sUris = new HashSet<Uri>();
-    static {
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LONGPRESS_TIMEOUT));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_RIPPLE_ENABLED));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_RIPPLE_COLOR));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_KEYBOARD_CURSORS));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.FLING_LOGO_OPACITY));
-    }
-
-    private FlingActionHandler mActionHandler;
-    private FlingGestureHandler mGestureHandler;
-    private FlingGestureDetectorPriv mGestureDetector;
-    private final FlingBarTransitions mBarTransitions;
-    private FlingLogoController mLogoController;
-    private boolean mRippleEnabled;
-    private FlingRipple mRipple;
-    private boolean mKeyboardCursors;
-    private float mLogoOpacity;
-    private boolean mIsNotificationPanelExpanded;
-
-    private int mNavigationIconHints = 0;
-
-    private boolean mRotateButtonVisible;
-    private int mLastRotation = 0;
-
-    private SmartObservable mObservable = new SmartObservable() {
-        @Override
-        public Set<Uri> onGetUris() {
-            return sUris;
-        }
-
-        @Override
-        public void onChange(Uri uri) {
-            updateFlingSettings();
-        }
-    };
-
-    public static final class FlingGestureDetectorPriv extends FlingGestureDetector {
-        static final int LP_TIMEOUT = 250;
-        // no more than default timeout
-        static final int LP_TIMEOUT_MAX = LP_TIMEOUT;
-        // no less than 25ms longer than single tap timeout
-        static final int LP_TIMEOUT_MIN = 25;
-        private int mLongPressTimeout = LP_TIMEOUT;
-
-        public FlingGestureDetectorPriv(Context context, OnGestureListener listener) {
-            super(context, listener, null);
-            // TODO Auto-generated constructor stub
-        }
-
-        @Override
-        protected int getLongPressTimeout() {
-            return mLongPressTimeout;
-        }
-
-        void setLongPressTimeout(int timeoutFactor) {
-            if (timeoutFactor > LP_TIMEOUT_MAX) {
-                timeoutFactor = LP_TIMEOUT_MAX;
-            } else if (timeoutFactor < LP_TIMEOUT_MIN) {
-                timeoutFactor = LP_TIMEOUT_MIN;
-            }
-            mLongPressTimeout = timeoutFactor;
-        }
-    }
-
-    @Override
-    public void setNotificationPanelExpanded(boolean expanded) {
-        mIsNotificationPanelExpanded = expanded;
-    }
-
-    private final OnTouchListener mFlingTouchListener = new OnTouchListener() {
-        @Override
-        public boolean onTouch(View v, MotionEvent event) {
-            final int action = event.getAction();
-            if (action == MotionEvent.ACTION_DOWN) {
-//                mPm.cpuBoost(1000 * 1000);
-                mLogoController.onTouchHide(null);
-                setSlippery(mIsNotificationPanelExpanded ? true : false);
-            } else if (action == MotionEvent.ACTION_UP
-                    || action == MotionEvent.ACTION_CANCEL) {
-                mLogoController.onTouchShow(null);
-                setSlippery(true);
-            }
-            if (mRippleEnabled) {
-                mRipple.onTouch(FlingView.this, event);
-            }
-            return mGestureDetector.onTouchEvent(event);
-        }
-    };
-
-    public FlingView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mBarTransitions = new FlingBarTransitions(this);
-        mActionHandler = new FlingActionHandler(context, this);
-        mGestureHandler = new FlingGestureHandler(context, mActionHandler, this, BaseNavigationBar.sIsTablet);
-        mGestureDetector = new FlingGestureDetectorPriv(context, mGestureHandler);
-
-        // CM bases: turn this on for an extra bump ;D
-        //mPm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-
-        mRipple = new FlingRipple(this);
-        mLogoController = new FlingLogoController(this);
-
-        mSmartObserver.addListener(mActionHandler);
-        mSmartObserver.addListener(mGestureHandler);
-        mSmartObserver.addListener(mLogoController);
-        mSmartObserver.addListener(mObservable);
-    }
-
-    @Override
-    public void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        if (getParent() != null) {
-            final View v = (View)getParent();
-            v.setOnTouchListener(mFlingTouchListener);
-        }
-    }
-
-    @Override
-    public void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        if (getParent() != null) {
-            final View v = (View)getParent();
-            v.setOnTouchListener(null);
-        }
-    }
-
-    @Override
-    public boolean onStartPulse(Animation animatePulseIn) {
-        if (mLogoController.isEnabled()) {
-            getLogoView(getHiddenView()).setAlpha(PULSE_LOGO_OPACITY);
-            getLogoView(getCurrentView()).animate()
-                    .alpha(PULSE_LOGO_OPACITY)
-                    .setDuration(PULSE_FADE_OUT_DURATION)
-                    .setListener(new AnimatorListenerAdapter() {
-                        @Override
-                        public void onAnimationEnd(Animator _a) {
-                            // shouldn't be null, mPulse just called into us
-                            if (mPulse != null) {
-                                mPulse.turnOnPulse();
-                            }
-                        }
-                    })
-                    .start();
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void onStopPulse(Animation animatePulseOut) {
-        if (mLogoController.isEnabled()) {
-            getLogoView(getHiddenView()).setAlpha(mLogoOpacity);
-            getLogoView(getCurrentView()).animate()
-                    .alpha(mLogoOpacity)
-                    .setDuration(PULSE_FADE_IN_DURATION)
-                    .start();
-        }
-    }
-
-    @Override
-    public BarTransitions getBarTransitions() {
-        return mBarTransitions;
-    }
-
-    @Override
-    public LightBarTransitionsController getLightTransitionsController() {
-        return mBarTransitions.getLightTransitionsController();
-    }
-
-    private FlingLogoView getFlingLogo() {
-        return (FlingLogoView) mCurrentView.findViewById(R.id.fling_console);
-    }
-
-    @Override
-    public void setLeftInLandscape(boolean leftInLandscape) {
-        super.setLeftInLandscape(leftInLandscape);
-        mGestureHandler.setLeftInLandscape(leftInLandscape);
-    }
-
-    @Override
-    protected void onKeyguardShowing(boolean showing) {
-        mActionHandler.setKeyguardShowing(showing);
-        setDisabledFlags(mDisabledFlags, true /* force */);
-    }
-
-    @Override
-    public void setResourceMap(NavbarOverlayResources resourceMap) {
-        super.setResourceMap(resourceMap);
-        mLogoController.updateLogo(FlingView.this, getFlingLogo());
-        updateFlingSettings();
-    }
-
-    private void updateRippleColor() {
-        int color = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_RIPPLE_COLOR, Color.WHITE, UserHandle.USER_CURRENT);
-        mRipple.updateColor(color);
-    }
-
-    @Override
-    public void updateNavbarThemedResources(Resources res) {
-//        mRipple.updateResources(res);
-        super.updateNavbarThemedResources(res);
-        final FlingLogoView logo = getFlingLogo();
-        mLogoController.setLogoView(logo);
-        mLogoController.setLogoIcon();
-        setLogoOpacity();
-    }
-
-    private void updateFlingSettings() {
-        updateRippleColor();
-        int lpTimeout = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_LONGPRESS_TIMEOUT, FlingGestureDetectorPriv.LP_TIMEOUT_MAX, UserHandle.USER_CURRENT);
-        mGestureDetector.setLongPressTimeout(lpTimeout);
-        mRippleEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_RIPPLE_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
-        mKeyboardCursors = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.FLING_KEYBOARD_CURSORS, 1, UserHandle.USER_CURRENT) == 1;
-        setLogoOpacity();
-    }
-
-    private void setLogoOpacity() {
-        mLogoOpacity = alphaIntToFloat(Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                Settings.Secure.FLING_LOGO_OPACITY, 255, UserHandle.USER_CURRENT));
-        if (mLogoController.isEnabled()) {
-            getLogoView(getCurrentView()).setAlpha(isBarPulseFaded() ? PULSE_LOGO_OPACITY : mLogoOpacity);
-            getLogoView(getHiddenView()).setAlpha(isBarPulseFaded() ? PULSE_LOGO_OPACITY : mLogoOpacity);
-        }
-    }
-
-    @Override
-    public void reorient() {
-        super.reorient();
-        mBarTransitions.init();
-        final FlingLogoView logo = getFlingLogo();
-        mLogoController.setLogoView(logo);
-        mLogoController.setLogoIcon();
-        setLogoOpacity();
-        setDisabledFlags(mDisabledFlags, true /* force */);
-        setNavigationIconHints(mNavigationIconHints, true);
-    }
-
-    boolean isBarPulseFaded() {
-        if (mPulse == null) {
-            return false;
-        } else {
-            return mPulse.shouldDrawPulse();
-        }
-    }
-
-    @Override
-    public void notifyScreenStateChange(boolean screenOn) {
-        mGestureHandler.onScreenStateChanged(screenOn);
-        super.notifyScreenStateChange(screenOn);
-
-        if (mLogoController.isEnabled()) {
-            ImageView currentLogo = getLogoView(getCurrentView());
-            ImageView hiddenLogo = getLogoView(getHiddenView());
-            if (screenOn && (currentLogo.getAlpha() != mLogoOpacity || hiddenLogo.getAlpha() != mLogoOpacity)) {
-                currentLogo.setAlpha(mLogoOpacity);
-                hiddenLogo.setAlpha(mLogoOpacity);
-            }
-        }
-    }
-
-    private ImageView getLogoView(View v) {
-        final ViewGroup viewGroup = (ViewGroup) v;
-        ImageView logoView = (ImageView)viewGroup.findViewById(R.id.fling_console);
-        return logoView;
-    }
-
-    public Drawable getLogoDrawable(boolean hiddenView) {
-        return getLogoView(hiddenView ? getHiddenView() : getCurrentView()).getDrawable();
-    }
-
-    private ImageView getRotationLogoView(View v) {
-        final ViewGroup viewGroup = (ViewGroup) v;
-        ImageView rotationLogoView = (ImageView)viewGroup.findViewById(R.id.rotationLogo);
-        return rotationLogoView;
-    }
-
-    public Drawable getRotationLogoDrawable(boolean hiddenView) {
-        return getRotationLogoView(hiddenView ? getHiddenView() : getCurrentView()).getDrawable();
-    }
-
-    @Override
-    protected void onInflateFromUser() {
-        mGestureHandler.onScreenStateChanged(mScreenOn);
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        mRipple.onSizeChanged(w, h, oldw, oldh);
-    }
-
-    @Override
-    public void setNavigationIconHints(int hints, boolean force) {
-        if (!force && hints == mNavigationIconHints)
-            return;
-
-        final boolean backAlt = (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
-        mNavigationIconHints = hints;
-        mActionHandler.setImeActions(backAlt && mKeyboardCursors);
-
-        mBarTransitions.reapplyDarkIntensity();
-    }
-
-    @Override
-    public void setNavigationIconHints(int hints) {
-        setNavigationIconHints(hints, false);
-    }
-
-    @Override
-    public void setRotateSuggestionButtonState(boolean visible, boolean skipAnim) {
-        mRotateButtonVisible = visible;
-        //skipAnim
-        onRotationButtonStateChange(visible);
-        // this will set also the correct darkintensity for the rotation logo
-        setNavigationIconHints(mNavigationIconHints, true);
-    }
-
-    @Override
-    public void setLastRotation(int rotation) {
-        mLastRotation = rotation;
-    }
-
-    public void rotate() {
-        getRotationController().setRotationLockedAtAngle(true, mLastRotation);
-    }
-
-    public boolean isRotateButtonVisible() {
-        return mRotateButtonVisible;
-    }
-
-    public void onRotationButtonStateChange(boolean visible) {
-        ImageView hidden = getRotationLogoView(getHiddenView());
-        ImageView current = getRotationLogoView(getCurrentView());
-        if (visible) {
-            hidden.setVisibility(View.VISIBLE);
-            current.setVisibility(View.VISIBLE);
-            current.setAlpha(0.0f);
-            current.animate()
-                    .setListener(new AnimatorListenerAdapter() {
-                        @Override
-                        public void onAnimationEnd(Animator _a) {
-                        }
-                    })
-                    .alpha(isBarPulseFaded() ? PULSE_LOGO_OPACITY : mLogoOpacity)
-                    .setDuration(100)
-                    .start();
-        } else {
-            current.animate()
-                    .alpha(0.0f)
-                    .setDuration(100)
-                    .setListener(new AnimatorListenerAdapter() {
-                        @Override
-                        public void onAnimationEnd(Animator _a) {
-                            hidden.setVisibility(View.INVISIBLE);
-                            current.setVisibility(View.INVISIBLE);
-                        }
-                    })
-                    .start();
-        }
-    }
-
-    @Override
-    public void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-        if (mRippleEnabled) {
-            mRipple.onDraw(canvas);
-        }
-    }
-
-    @Override
-    protected void onDispose() {
-        //unsetListeners();
-        removeAllViews();
-    }
-
-    /*private void unsetListeners() {
-    }*/
-
-    @Override
-    protected void notifyBootCompleted() {
-        mLogoController.updateLogo(FlingView.this, getFlingLogo());
-    }
-
-    @Override
-    public void setMediaPlaying(boolean playing) {
-        PulseController mPulse = getPulseController();
-        if (mPulse != null) {
-            mPulse.setMediaPlaying(playing);
-        }
-    }
-
-    @Override
-    public void setPulseColors(boolean colorizedMedia, int[] colors) {
-        PulseController mPulse = getPulseController();
-        if (mPulse != null) {
-            mPulse.setPulseColors(colorizedMedia, colors);
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/smartbar/SmartBackButtonDrawable.java b/src/com/android/systemui/navigation/smartbar/SmartBackButtonDrawable.java
deleted file mode 100644
index f2ef6e0..0000000
--- a/src/com/android/systemui/navigation/smartbar/SmartBackButtonDrawable.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * Copyright (C) 2016 The Android Open Source Project
- * Copyright (C) 2017 The DirtyUnicorns 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.navigation.smartbar;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.util.FloatProperty;
-import android.util.Property;
-import android.view.Gravity;
-
-import com.android.systemui.navigation.DarkIntensity;
-import com.android.systemui.navigation.smartbar.SmartBackButtonDrawable;
-
-public class SmartBackButtonDrawable extends LayerDrawable implements DarkIntensity{
-    private float mRotation;
-    private Animator mCurrentAnimator;
-
-    private final boolean mHasDarkDrawable;
-
-    private static final int ANIMATION_DURATION = 200;
-    public static final Property<SmartBackButtonDrawable, Float> ROTATION
-            = new FloatProperty<SmartBackButtonDrawable>("rotation") {
-        @Override
-        public void setValue(SmartBackButtonDrawable object, float value) {
-            object.setRotation(value);
-        }
-
-        @Override
-        public Float get(SmartBackButtonDrawable object) {
-            return object.getRotation();
-        }
-    };
-
-    public static SmartBackButtonDrawable create(Drawable lightDrawable,
-            @Nullable Drawable darkDrawable) {
-        if (darkDrawable != null) {
-            return new SmartBackButtonDrawable(
-                    new Drawable[] { lightDrawable.mutate(), darkDrawable.mutate() });
-        } else {
-            return new SmartBackButtonDrawable(new Drawable[] { lightDrawable.mutate() });
-        }
-    }
-
-    private SmartBackButtonDrawable(Drawable[] drawables) {
-        super(drawables);
-        for (int i = 0; i < drawables.length; i++) {
-            setLayerGravity(i, Gravity.CENTER);
-        }
-        mutate();
-        mHasDarkDrawable = drawables.length > 1;
-        setDarkIntensity(0f);
-    }
-
-    @Override
-    public void setDarkIntensity(float intensity) {
-        if (!mHasDarkDrawable) {
-            return;
-        }
-        getDrawable(0).setAlpha((int) ((1 - intensity) * 255f));
-        getDrawable(1).setAlpha((int) (intensity * 255f));
-        invalidateSelf();
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        rotateCanvas(canvas);
-        getDrawable(0).draw(canvas);
-        if (mHasDarkDrawable)  {
-            getDrawable(1).draw(canvas);
-        }
-    }
-
-    private void rotateCanvas(Canvas c) {
-        final Rect bounds = getDrawable(0).getBounds();
-        final int boundsCenterX = bounds.width() / 2;
-        final int boundsCenterY = bounds.height() / 2;
-
-        c.translate(boundsCenterX, boundsCenterY);
-        c.rotate(mRotation);
-        c.translate(- boundsCenterX, - boundsCenterY);
-    }
-
-    public void setRotation(float rotation) {
-        mRotation = rotation;
-        invalidateSelf();
-    }
-
-    public float getRotation() {
-        return mRotation;
-    }
-
-    public void setImeVisible(boolean ime) {
-        if (mCurrentAnimator != null) {
-            mCurrentAnimator.cancel();
-        }
-
-        final float nextRotation = ime ? - 90 : 0;
-        if (mRotation == nextRotation) {
-            return;
-        }
-
-        if (isVisible() && ActivityManager.isHighEndGfx()) {
-            mCurrentAnimator = ObjectAnimator.ofFloat(this, ROTATION, nextRotation)
-                    .setDuration(ANIMATION_DURATION);
-            mCurrentAnimator.start();
-        } else {
-            setRotation(nextRotation);
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/smartbar/SmartBarEditor.java b/src/com/android/systemui/navigation/smartbar/SmartBarEditor.java
deleted file mode 100644
index d2e5001..0000000
--- a/src/com/android/systemui/navigation/smartbar/SmartBarEditor.java
+++ /dev/null
@@ -1,893 +0,0 @@
-/**
- * Copyright (C) 2016 The DirtyUnicorns Project
- * Copyright (C) 2015 The CyanogenMod Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * Contributions from The CyanogenMod 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.navigation.smartbar;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-import com.android.internal.utils.du.ActionConstants;
-import com.android.internal.utils.du.ActionHandler;
-import com.android.internal.utils.du.Config.ActionConfig;
-import com.android.internal.utils.du.DUActionUtils;
-import com.android.internal.utils.du.Config;
-import com.android.internal.utils.du.Config.ButtonConfig;
-import com.android.systemui.navigation.BaseEditor;
-import com.android.systemui.navigation.BaseNavigationBar;
-import com.android.systemui.navigation.OpaLayout;
-import com.android.systemui.navigation.Res;
-import com.android.systemui.navigation.smartbar.SmartBarEditor;
-import com.android.systemui.navigation.smartbar.SmartBarHelper;
-import com.android.systemui.navigation.smartbar.SmartBarView;
-import com.android.systemui.navigation.smartbar.SmartButtonView;
-import com.android.systemui.navigation.editor.ActionItem;
-import com.android.systemui.navigation.editor.QuickAction;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
-import android.graphics.Point;
-import android.net.Uri;
-import android.os.UserHandle;
-import android.text.TextUtils;
-import android.view.Gravity;
-import android.view.HapticFeedbackConstants;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.ViewGroup.LayoutParams;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.OvershootInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView.ScaleType;
-import android.widget.PopupWindow;
-
-public class SmartBarEditor extends BaseEditor implements View.OnTouchListener {
-    private static final String TAG = SmartBarEditor.class.getSimpleName();
-    // time is takes button pressed to become draggable
-    private static final int QUICK_LONG_PRESS = 200;
-    private static final int POPUP_LONG_PRESS = QUICK_LONG_PRESS + 300;
-    // time popup hide animation takes before we hide the conatiner
-    private static final int POPUP_ANIM_DELAY = 300;
-
-    public static final int MENU_MAP_ACTIONS = 1;
-    public static final int MENU_MAP_ICON = 2;
-    public static final int MENU_MAP_ADD = 3;
-    public static final int MENU_MAP_REMOVE = 4;
-    public static final int MENU_MAP_CANCEL = 5;
-    public static final int MENU_MAP_FINISH = 6;
-    public static final int MENU_MAP_ACTIONS_SINGLE_TAP = 7;
-    public static final int MENU_MAP_ACTIONS_DOUBLE_TAP = 8;
-    public static final int MENU_MAP_ACTIONS_LONG_PRESS = 9;
-    public static final int MENU_MAP_ICON_ICON_PACK = 10;
-    public static final int MENU_MAP_ICON_ICON_GALLERY = 11;
-    public static final int MENU_MAP_ICON_ICON_COLOR = 12;
-    public static final int MENU_MAP_ICON_ICON_RESET = 13;
-
-    static final int POPUP_TYPE_ROOT = 1;
-    static final int POPUP_TYPE_TAP = 2;
-    static final int POPUP_TYPE_ICON = 3;
-
-    public static final String BACK = ActionConstants.Smartbar.BUTTON1_TAG;
-    public static final String HOME = ActionConstants.Smartbar.BUTTON2_TAG;
-
-    public static final int PHONE_MAX_BUTTONS = 7;
-    public static final int TABLET_MAX_BUTTONS = 10;
-
-    private boolean mIsButtonMoving;
-    // true == we're currently checking for long press
-    private boolean mLongPressed;
-    // start point of the current drag operation
-    private float mDragOrigin;
-    // just to avoid reallocations
-    private static final int[] sLocation = new int[2];
-
-    private SmartBarView mHost;
-
-    private FrameLayout mEditContainer;
-    private View mHidden;
-    private Point mOriginPoint = new Point();
-
-    // buttons to animate when changing positions
-    private ArrayList<OpaLayout> mSquatters = new ArrayList<>();
-
-    // which action are we editing
-    private int mTapHasFocusTag;
-
-    // editor popup menu current instance holder
-    private QuickAction mPopup;
-    private Map<Integer, ActionItem> mPrimaryMenuItems = new HashMap<Integer, ActionItem>();
-    private Map<Integer, ActionItem> mTapMenuItems = new HashMap<Integer, ActionItem>();
-    private Map<Integer, ActionItem> mIconMenuItems = new HashMap<Integer, ActionItem>();
-
-    private QuickAction.OnActionItemClickListener mQuickClickListener = new QuickAction.OnActionItemClickListener() {
-        @Override
-        public void onItemClick(QuickAction source, int pos, int actionId) {
-            if (!mIsButtonMoving) { //don't do anything if the user is dragging the button
-                Intent intent;
-                switch (actionId) {
-                    case MENU_MAP_ACTIONS:
-                        postSecondaryPopup(POPUP_TYPE_TAP);
-                        break;
-                    case MENU_MAP_ICON:
-                        postSecondaryPopup(POPUP_TYPE_ICON);
-                        break;
-                    case MENU_MAP_ADD:
-                        addButton();
-                        break;
-                    case MENU_MAP_REMOVE:
-                        removeButton();
-                        break;
-                    case MENU_MAP_CANCEL:
-                        break;
-                    case MENU_MAP_FINISH:
-                        changeEditMode(MODE_OFF);
-                        break;
-                    case MENU_MAP_ACTIONS_SINGLE_TAP:
-                        startActionPicker(ActionConfig.PRIMARY);
-                        break;
-                    case MENU_MAP_ACTIONS_LONG_PRESS:
-                        startActionPicker(ActionConfig.SECOND);
-                        break;
-                    case MENU_MAP_ACTIONS_DOUBLE_TAP:
-                        startActionPicker(ActionConfig.THIRD);
-                        break;
-                    case MENU_MAP_ICON_ICON_PACK:
-                        intent = new Intent();
-                        intent.setAction(Intent.ACTION_MAIN);
-                        intent.setClassName(INTENT_ACTION_EDIT_CLASS,
-                                INTENT_ACTION_ICON_PICKER_COMPONENT);
-                        mContext.startActivityAsUser(intent, UserHandle.CURRENT);
-                        break;
-                    case MENU_MAP_ICON_ICON_GALLERY:
-                        intent = new Intent();
-                        intent.setAction(Intent.ACTION_MAIN);
-                        intent.setClassName(INTENT_ACTION_EDIT_CLASS,
-                                INTENT_ACTION_GALLERY_PICKER_COMPONENT);
-                        mContext.startActivityAsUser(intent, UserHandle.CURRENT);
-                        break;
-                    case MENU_MAP_ICON_ICON_COLOR:
-                        break;
-                    case MENU_MAP_ICON_ICON_RESET:
-                        resetIcon();
-                        break;
-                }
-            }
-        }
-    };
-
-    private final Runnable mHidePopupContainer = new Runnable() {
-        @Override
-        public void run() {
-            mEditContainer.setVisibility(View.GONE);
-        }
-    };
-
-    private PopupWindow.OnDismissListener mPopupDismissListener = new PopupWindow.OnDismissListener() {
-        @Override
-        public void onDismiss() {
-            mHost.postDelayed(mHidePopupContainer, POPUP_ANIM_DELAY);
-        }
-    };
-
-    private View.OnTouchListener mEditorWindowTouchListener = new View.OnTouchListener() {
-        public boolean onTouch(View v, MotionEvent event) {
-            return mPopupTouchWrapper.onTouch(v, event);
-        }
-    };
-
-    private View.OnTouchListener mPopupTouchWrapper = new View.OnTouchListener() {
-        public boolean onTouch(View v, MotionEvent event) {
-            if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
-                mPopup.dismiss();
-                return true;
-            }
-            return false;
-        }
-    };
-
-    private void postSecondaryPopup(final int type) {
-        mHost.removeCallbacks(mHidePopupContainer);
-        refreshPopup(type);
-    }
-
-    private void refreshPopup(int type) {
-        final int x = mPopup.getXpos();
-        int navButtonTopY = mPopup.getNavButtonTopY();
-
-        mPopup.clearViews();
-        boolean hasMaxButtons = getHasMaxButtons();
-        String tag = getEditButtonTag();
-        ActionItem item;
-        if (type == POPUP_TYPE_TAP) {
-            for (int i = 1; i < mTapMenuItems.size() + 1; i++) {
-                item = mTapMenuItems.get(i);
-                int id = item.getActionId();
-                if (id == MENU_MAP_ACTIONS_SINGLE_TAP &&
-                        (tag.equals(BACK) || tag.equals(HOME))) {
-                    continue;
-                }
-                item.setSticky(false);
-                mPopup.addActionItem(item);
-            }
-        } else if (type == POPUP_TYPE_ICON) {
-            for (int i = 1; i < mIconMenuItems.size() + 1; i++) {
-                item = mIconMenuItems.get(i);
-                int id = item.getActionId();
-                if (id == MENU_MAP_ICON_ICON_COLOR) {
-                    continue;
-                }
-                item.setSticky(false);
-                mPopup.addActionItem(item);
-            }
-        }
-
-        View newPopupView = mPopup.mWindow.getContentView();
-        newPopupView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
-        final int height = newPopupView.getMeasuredHeight();
-        mPopup.mWindow.update(x, (navButtonTopY - height), -1, -1);
-    }
-
-    public SmartBarEditor(SmartBarView host) {
-        super(host);
-        mHost = host;
-    }
-
-    private String getEditButtonTag() {
-        return (String) mHidden.getTag();
-    }
-
-    private void resetIcon() {
-        final String buttonFocus = getEditButtonTag();
-        SmartButtonView currentButton = mHost.findCurrentButton(buttonFocus);
-        SmartButtonView otherButton = (SmartButtonView) getHiddenNavButtons().findViewWithTag(
-                buttonFocus);
-        ButtonConfig currentConfig = currentButton.getButtonConfig();
-        ButtonConfig otherConfig = otherButton.getButtonConfig();
-        OpaLayout currentOpa = (OpaLayout) currentButton.getParent();
-        OpaLayout otherOpa = (OpaLayout) otherButton.getParent();
-        currentConfig.clearCustomIconIconUri();
-        otherConfig.clearCustomIconIconUri();
-        currentButton.setButtonConfig(currentConfig);
-        otherButton.setButtonConfig(otherConfig);
-
-        mHost.setButtonDrawable(currentButton);
-        SmartBarHelper.updateButtonScalingAndPadding(currentOpa, isLandscape());
-
-        mHost.setButtonDrawable(otherButton);
-        SmartBarHelper.updateButtonScalingAndPadding(otherOpa, !isLandscape());
-
-        onCommitChanges();
-    }
-
-    @Override
-    protected void onIconPicked(String type, String packageName, String iconName) {
-        final String buttonFocus = getEditButtonTag();
-        SmartButtonView currentButton = mHost.findCurrentButton(buttonFocus);
-        SmartButtonView otherButton = (SmartButtonView) getHiddenNavButtons().findViewWithTag(
-                buttonFocus);
-        ButtonConfig currentConfig = currentButton.getButtonConfig();
-        ButtonConfig otherConfig = otherButton.getButtonConfig();
-        OpaLayout currentOpa = (OpaLayout) currentButton.getParent();
-        OpaLayout otherOpa = (OpaLayout) otherButton.getParent();
-        currentConfig.setCustomIconUri(type, packageName, iconName);
-        otherConfig.setCustomIconUri(type, packageName, iconName);
-        currentButton.setButtonConfig(currentConfig);
-        otherButton.setButtonConfig(otherConfig);
-
-        mHost.setButtonDrawable(currentButton);
-        SmartBarHelper.updateButtonScalingAndPadding(currentOpa, isLandscape());
-
-        mHost.setButtonDrawable(otherButton);
-        SmartBarHelper.updateButtonScalingAndPadding(otherOpa, !isLandscape());
-
-        onCommitChanges();
-    }
-
-    protected void onImagePicked(String uri) {
-        final String buttonFocus = getEditButtonTag();
-        SmartButtonView currentButton = mHost.findCurrentButton(buttonFocus);
-        SmartButtonView otherButton = (SmartButtonView) getHiddenNavButtons().findViewWithTag(
-                buttonFocus);
-        ButtonConfig currentConfig = currentButton.getButtonConfig();
-        ButtonConfig otherConfig = otherButton.getButtonConfig();
-        OpaLayout currentOpa = (OpaLayout) currentButton.getParent();
-        OpaLayout otherOpa = (OpaLayout) otherButton.getParent();
-        currentConfig.setCustomImageUri(Uri.parse(uri));
-        otherConfig.setCustomImageUri(Uri.parse(uri));
-        currentButton.setButtonConfig(currentConfig);
-        otherButton.setButtonConfig(otherConfig);
-
-        mHost.setButtonDrawable(currentButton);
-        SmartBarHelper.updateButtonScalingAndPadding(currentOpa, isLandscape());
-
-        mHost.setButtonDrawable(otherButton);
-        SmartBarHelper.updateButtonScalingAndPadding(otherOpa, !isLandscape());
-
-        onCommitChanges();
-    }
-
-    @Override
-    protected void onActionPicked(String action, ActionConfig actionConfig) {
-        final String buttonFocus = getEditButtonTag();
-        final int tapFocus = mTapHasFocusTag;
-        SmartButtonView currentButton = mHost.findCurrentButton(buttonFocus);
-        SmartButtonView otherButton = (SmartButtonView) getHiddenNavButtons().findViewWithTag(
-                buttonFocus);
-        ActionConfig currentAction = new ActionConfig(mContext, action);
-        ActionConfig otherAction = new ActionConfig(mContext, action);
-        ButtonConfig currentConfig = currentButton.getButtonConfig();
-        ButtonConfig otherConfig = otherButton.getButtonConfig();
-        OpaLayout currentOpa = (OpaLayout) currentButton.getParent();
-        OpaLayout otherOpa = (OpaLayout) otherButton.getParent();
-        currentConfig.setActionConfig(currentAction, tapFocus);
-        otherConfig.setActionConfig(otherAction, tapFocus);
-        currentButton.setButtonConfig(currentConfig);
-        otherButton.setButtonConfig(otherConfig);
-        if (tapFocus == ActionConfig.PRIMARY) { // update icon for single tap only
-            mHost.setButtonDrawable(currentButton);
-            SmartBarHelper.updateButtonScalingAndPadding(currentOpa, isLandscape());
-            mHost.setButtonDrawable(otherButton);
-            SmartBarHelper.updateButtonScalingAndPadding(otherOpa, !isLandscape());
-        }
-        onCommitChanges();
-    }
-
-    private void startActionPicker(int focusActionTap) {
-        mTapHasFocusTag = focusActionTap;
-        Intent intent = new Intent();
-        intent.setAction(Intent.ACTION_MAIN);
-        intent.setClassName(INTENT_ACTION_EDIT_CLASS, INTENT_ACTION_EDIT_COMPONENT);
-        if (mTapHasFocusTag == ActionConfig.PRIMARY) { // exclude single tap back, home, recent
-            String[] exclude = {
-                    ActionHandler.SYSTEMUI_TASK_BACK,
-                    ActionHandler.SYSTEMUI_TASK_HOME
-            };
-            intent.putExtra("excluded_actions", exclude);
-        }
-        mContext.startActivityAsUser(intent, UserHandle.CURRENT);
-    }
-
-    private int getMaxButtons() {
-        return BaseNavigationBar.sIsTablet ? TABLET_MAX_BUTTONS : PHONE_MAX_BUTTONS;
-    }
-
-    private boolean getHasMaxButtons() {
-        return getMaxButtons() == mHost.getCurrentSequence().size();
-    }
-
-    @Override
-    public void onEditModeChanged(int mode) {
-        boolean isOn = isInEditMode();
-        if (isOn) {
-            createPopupContainer();
-        } else {
-            removePopupContainer();
-        }
-        setButtonsEditMode(isOn);
-
-        mHost.setEditMode(isOn);
-    }
-
-    @Override
-    protected void onResetLayout() {
-        mHost.recreateLayouts();
-        setButtonsEditMode(isInEditMode());
-    }
-
-    private void removeButton() {
-        mLockEditMode = true;
-        final String buttonFocus = getEditButtonTag();
-        ArrayList<ButtonConfig> buttonConfigs = Config.getConfig(mContext,
-                ActionConstants.getDefaults(ActionConstants.SMARTBAR));
-        ButtonConfig toRemove = null;
-        for (ButtonConfig config : buttonConfigs) {
-            if (TextUtils.equals(config.getTag(), buttonFocus)) {
-                toRemove = config;
-                break;
-            }
-        }
-        if (toRemove != null) {
-            buttonConfigs.remove(toRemove);
-            Config.setConfig(mContext, ActionConstants.getDefaults(ActionConstants.SMARTBAR),
-                    buttonConfigs);
-            mHost.recreateLayouts();
-            setButtonsEditMode(true);
-        }
-        mLockEditMode = false;
-    }
-
-    private void addButton() {
-        mLockEditMode = true;
-        final String buttonFocus = getEditButtonTag();
-        ArrayList<ButtonConfig> buttonConfigs = Config.getConfig(mContext,
-                ActionConstants.getDefaults(ActionConstants.SMARTBAR));
-        int newIndex = mHost.getCurrentSequence().indexOf(buttonFocus) + 1;
-        String newTag = String.valueOf(System.currentTimeMillis());
-        ButtonConfig newConfig = new ButtonConfig(mContext);
-        newConfig.setTag(newTag);
-        buttonConfigs.add(newIndex, newConfig);
-        Config.setConfig(mContext, ActionConstants.getDefaults(ActionConstants.SMARTBAR),
-                buttonConfigs);
-        mHost.recreateLayouts();
-        setButtonsEditMode(true);
-        mLockEditMode = false;
-    }
-
-    @Override
-    public void onCommitChanges() {
-        ArrayList<ButtonConfig> buttonConfigs = new ArrayList<ButtonConfig>();
-        final int size = mHost.getCurrentSequence().size();
-        for (int i = 0; i < size; i++) {
-            String tag = mHost.getCurrentSequence().get(i);
-            SmartButtonView v = mHost.findCurrentButton(tag);
-            if (v == null)
-                continue;
-            ButtonConfig config = v.getButtonConfig();
-            if (config == null)
-                continue;
-            buttonConfigs.add(config);
-        }
-        Config.setConfig(mContext, ActionConstants.getDefaults(ActionConstants.SMARTBAR),
-                buttonConfigs);
-    }
-
-    @Override
-    protected void onPrepareToReorient() {
-        // if we are in edit mode turn them off
-        // since the new buttons will be visibile very soon
-        if (isInEditMode()) {
-            setButtonsEditMode(false);
-        }
-    }
-
-    @Override
-    protected void onReorient() {
-        // if we are in edit mode turn them on
-        if (isInEditMode()) {
-            setButtonsEditMode(true);
-        }
-    }
-
-    private void setButtonsEditMode(boolean isInEditMode) {
-        for (String buttonTag : mHost.getCurrentSequence()) {
-            SmartButtonView v = mHost.findCurrentButton(buttonTag);
-            if (v != null) {
-                v.setEditMode(isInEditMode);
-                OpaLayout opa = (OpaLayout) v.getParent();
-                opa.setOnTouchListener(isInEditMode ? this : null);
-            }
-        }
-    }
-
-    public boolean isInEditMode() {
-        return getMode() == MODE_ON;
-    }
-
-    private Runnable mCheckLongPress = new Runnable() {
-        public void run() {
-            if (isInEditMode()) {
-                mLongPressed = true;
-                mHost.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
-            }
-        }
-    };
-
-    private Runnable mCheckShowPopup = new Runnable() {
-        public void run() {
-            if (isInEditMode()) {
-                showPopup(POPUP_TYPE_ROOT);
-            }
-        }
-    };
-
-    @Override
-    public boolean onTouch(final View view, MotionEvent event) {
-        if (!isInEditMode()) {
-            return false;
-        }
-        if (event.getAction() == MotionEvent.ACTION_DOWN) {
-            mIsButtonMoving = true;
-            if (mPopup != null) {
-                QuickAction popup = mPopup;
-                popup.dismiss();
-            }
-            view.setPressed(true);
-            view.getLocationOnScreen(sLocation);
-            mDragOrigin = sLocation[mHost.isVertical() ? 1 : 0];
-            mOriginPoint.set(sLocation[0], sLocation[1]);
-            prepareToShowPopup(view);
-            mHost.postDelayed(mCheckLongPress, QUICK_LONG_PRESS);
-            mHost.postDelayed(mCheckShowPopup, POPUP_LONG_PRESS);
-        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
-            // mIsButtonMoving still true;
-            view.setPressed(false);
-            if (!mLongPressed) {
-                return false;
-            }
-            ViewGroup viewParent = (ViewGroup) view.getParent();
-            float pos = mHost.isVertical() ? event.getRawY() : event.getRawX();
-            float buttonSize = mHost.isVertical() ? view.getHeight() : view.getWidth();
-            float min = mHost.isVertical() ? viewParent.getTop()
-                    : (viewParent.getLeft() - buttonSize / 2);
-            float max = mHost.isVertical() ? (viewParent.getTop() + viewParent.getHeight())
-                    : (viewParent.getLeft() + viewParent.getWidth());
-
-            // Prevents user from dragging view outside of bounds
-            if (pos < min || pos > max) {
-                return false;
-            }
-            if (!mHost.isVertical()) {
-                view.setX(pos - viewParent.getLeft() - buttonSize / 2);
-            } else {
-                view.setY(pos - viewParent.getTop() - buttonSize / 2);
-            }
-            View affectedView = findInterceptingView(pos, view);
-            if (affectedView == null) {
-                return false;
-            }
-            mHost.removeCallbacks(mCheckLongPress);
-            mHost.removeCallbacks(mCheckShowPopup);
-            if (mPopup != null) {
-                QuickAction popup = mPopup;
-                popup.dismiss();
-            }
-            switchId(affectedView, view);
-        } else if (event.getAction() == MotionEvent.ACTION_UP
-                || event.getAction() == MotionEvent.ACTION_CANCEL) {
-            mIsButtonMoving = false;
-            view.setPressed(false);
-            mHost.removeCallbacks(mCheckLongPress);
-            mHost.removeCallbacks(mCheckShowPopup);
-            if (mPopup == null || !mPopup.mWindow.isShowing()) {
-                mEditContainer.setVisibility(View.GONE);
-            }
-            if (mLongPressed) {
-                // Reset the dragged view to its original location
-                ViewGroup parent = (ViewGroup) view.getParent();
-                boolean vertical = mHost.isVertical();
-                float slideTo = vertical ? mDragOrigin - parent.getTop() : mDragOrigin
-                        - parent.getLeft();
-                Animator anim = getButtonSlideAnimator(view, vertical, slideTo);
-                anim.setInterpolator(new AccelerateDecelerateInterpolator());
-                anim.setDuration(100);
-                anim.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        mSquatters.clear();
-                        onCommitChanges();
-                    }
-                });
-                anim.start();
-            }
-            mLongPressed = false;
-        }
-        return true;
-    }
-
-    private WindowManager.LayoutParams getEditorParams() {
-        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
-                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
-                        | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
-                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
-                PixelFormat.TRANSLUCENT);
-        lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
-        lp.gravity = Gravity.BOTTOM;
-        lp.setTitle("SmartBar Editor");
-        lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
-                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
-        return lp;
-    }
-
-    private void showPopup(int type) {
-        QuickAction popup = new QuickAction(mHost.getContext(), QuickAction.VERTICAL);
-        boolean hasMaxButtons = getHasMaxButtons();
-        String tag = getEditButtonTag();
-        ActionItem item;
-        for (int i = 1; i < mPrimaryMenuItems.size() + 1; i++) {
-            item = mPrimaryMenuItems.get(i);
-            int id = item.getActionId();
-            if (id == MENU_MAP_ADD && hasMaxButtons) {
-                continue;
-            }
-            if (id == MENU_MAP_REMOVE &&
-                    (tag.equals(BACK) || tag.equals(HOME))) {
-                continue;
-            }
-            if (id == MENU_MAP_ACTIONS || id == MENU_MAP_ICON) {
-                item.setSticky(true);
-            } else {
-                item.setSticky(false);
-            }
-            popup.addActionItem(item);
-        }
-        popup.setOnActionItemClickListener(mQuickClickListener);
-        popup.mWindow.setOnDismissListener(mPopupDismissListener);
-        popup.mWindow.setTouchInterceptor(mPopupTouchWrapper);
-        popup.mWindow.setFocusable(true);
-        final View anchor = (View) mHidden;
-        popup.show(anchor);
-        mPopup = popup;
-    }
-
-    @Override
-    protected void updateResources(Resources res) {
-        // anything themable is created on-the-fly
-    }
-
-    private void prepareToShowPopup(View editView) {
-        mHost.removeCallbacks(mHidePopupContainer);
-        ViewGroup parent = (ViewGroup) editView.getParent();
-        mEditContainer.setVisibility(View.VISIBLE);
-        OpaLayout opa = (OpaLayout) editView;
-        mHidden.setTag(opa.getButton().getTag());
-        mHidden.getLayoutParams().width = editView.getWidth();
-        mHidden.getLayoutParams().height = editView.getHeight();
-        mHidden.setLayoutParams(mHidden.getLayoutParams());
-        mHidden.setX(mOriginPoint.x - parent.getLeft());
-        mHidden.setY(mOriginPoint.y - parent.getTop());
-    }
-
-    private void createPopupContainer() {
-        removePopupContainer();
-        loadPrimaryMenuMap();
-        loadTapMenuMap();
-        loadIconMenuMap();
-        mEditContainer = new FrameLayout(mHost.getContext());
-        mHidden = new SmartButtonView(mHost.getContext());
-        mEditContainer.setOnTouchListener(mEditorWindowTouchListener);
-        mHidden.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
-                LayoutParams.WRAP_CONTENT));
-        mHidden.setVisibility(View.INVISIBLE);
-        mEditContainer.addView(mHidden);
-        mEditContainer.setVisibility(View.GONE);
-        mWindowManager.addView(mEditContainer, getEditorParams());
-    }
-
-    private void removePopupContainer() {
-        if (mPopup != null) {
-            mPopup.dismiss();
-            mPopup = null;
-        }
-        if (mEditContainer != null && mEditContainer.isAttachedToWindow()) {
-            mEditContainer.removeAllViews();
-            mEditContainer.setVisibility(View.GONE);
-            mWindowManager.removeViewImmediate(mEditContainer);
-        }
-        mPrimaryMenuItems.clear();
-        mTapMenuItems.clear();
-        mIconMenuItems.clear();
-    }
-
-    /*
-     * Leave the reflection alone here. Since we don't inflate SmartBar, these vectors need to be
-     * inflated by the library
-     */
-    private void loadPrimaryMenuMap() {
-        mPrimaryMenuItems.clear();
-        ActionItem action = new ActionItem(1,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_actions",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_actions",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mPrimaryMenuItems.put(1, action);
-
-        action = new ActionItem(2,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_icon",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_icon",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mPrimaryMenuItems.put(2, action);
-
-        action = new ActionItem(3,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_add",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_add",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mPrimaryMenuItems.put(3, action);
-
-        action = new ActionItem(4,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_remove",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_remove",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mPrimaryMenuItems.put(4, action);
-
-        action = new ActionItem(5,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_cancel",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_cancel",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mPrimaryMenuItems.put(5, action);
-
-        action = new ActionItem(6,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_finish",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_finish",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mPrimaryMenuItems.put(6, action);
-    }
-
-    private void loadTapMenuMap() {
-        mTapMenuItems.clear();
-        ActionItem action = new ActionItem(7,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_single_tap",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_single_tap",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mTapMenuItems.put(1, action);
-
-        action = new ActionItem(8,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_double_tap",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_double_tap",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mTapMenuItems.put(2, action);
-
-        action = new ActionItem(9,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_long_press",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_long_press",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mTapMenuItems.put(3, action);
-    }
-
-    private void loadIconMenuMap() {
-        mIconMenuItems.clear();
-        ActionItem action = new ActionItem(10,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_icon_pack",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_icon_pack",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mIconMenuItems.put(1, action);
-
-        action = new ActionItem(11,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_icon_gallery",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_icon_gallery",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mIconMenuItems.put(2, action);
-
-        action = new ActionItem(12,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_icon_color",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_icon_color",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mIconMenuItems.put(3, action);
-
-        action = new ActionItem(13,
-                DUActionUtils.getString(mHost.getContext(), "label_smartbar_icon_reset",
-                        DUActionUtils.PACKAGE_SYSTEMUI),
-                DUActionUtils.getDrawable(mHost.getContext(), "ic_smartbar_editor_icon_reset",
-                        DUActionUtils.PACKAGE_SYSTEMUI));
-        mIconMenuItems.put(3, action);
-    }
-
-    /**
-     * Find intersecting view in mButtonViews
-     * 
-     * @param pos - pointer location
-     * @param v - view being dragged
-     * @return intersecting view or null
-     */
-    private View findInterceptingView(float pos, View v) {
-        for (String buttonTag : mHost.getCurrentSequence()) {
-            SmartButtonView otherButton = mHost.findCurrentButton(buttonTag);
-            OpaLayout otherOpa = (OpaLayout)otherButton.getParent();
-            if (otherOpa == v) {
-                continue;
-            }
-            if (mSquatters.contains(otherOpa)) {
-                continue;
-            }
-
-            otherOpa.getLocationOnScreen(sLocation);
-            float otherPos = sLocation[mHost.isVertical() ? 1 : 0];
-            float otherDimension = mHost.isVertical() ? v.getHeight() : v.getWidth();
-
-            if (pos > (otherPos + otherDimension / 4) && pos < (otherPos + otherDimension)) {
-                mSquatters.add(otherOpa);
-                return otherOpa;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Switches positions of two views and updates their mButtonViews entry
-     * 
-     * @param targetView - view to be replaced animate out
-     * @param view - view being dragged
-     */
-    private void switchId(View replaceView, View dragView) {
-        final OpaLayout squatter = (OpaLayout) replaceView;
-        final OpaLayout dragger = (OpaLayout) dragView;
-
-        final boolean vertical = mHost.isVertical();
-
-        ViewGroup parent = (ViewGroup) replaceView.getParent();
-        float slideTo = vertical ? mDragOrigin - parent.getTop() : mDragOrigin - parent.getLeft();
-        replaceView.getLocationOnScreen(sLocation);
-        mDragOrigin = sLocation[vertical ? 1 : 0];
-
-        final int targetIndex = mHost.getCurrentSequence().indexOf(squatter.getButton().getTag());
-        final int draggedIndex = mHost.getCurrentSequence().indexOf(dragger.getButton().getTag());
-        Collections.swap(mHost.getCurrentSequence(), draggedIndex, targetIndex);
-
-        SmartButtonView hidden1 = (SmartButtonView) getHiddenNavButtons().findViewWithTag(
-                squatter.getButton().getTag());
-        SmartButtonView hidden2 = (SmartButtonView) getHiddenNavButtons().findViewWithTag(
-                dragger.getButton().getTag());
-        OpaLayout hidden1Opa = (OpaLayout) hidden1.getParent();
-        OpaLayout hidden2Opa = (OpaLayout) hidden2.getParent();
-        swapConfigs(hidden1Opa, hidden2Opa);
-
-        Animator anim = getButtonSlideAnimator(squatter, vertical, slideTo);
-        anim.setInterpolator(new OvershootInterpolator());
-        anim.setDuration(250);
-        anim.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mSquatters.remove(squatter);
-            }
-        });
-        anim.start();
-    }
-
-    private Animator getButtonSlideAnimator(View v, boolean vertical, float slideTo) {
-        return ObjectAnimator.ofFloat(v, vertical ? View.Y : View.X, slideTo);
-    }
-
-    private void swapConfigs(OpaLayout v1, OpaLayout v2) {
-        ButtonConfig config1 = v1.getButton().getButtonConfig();
-        ButtonConfig config2 = v2.getButton().getButtonConfig();
-        int[] padding1 = SmartBarHelper.getViewPadding(v1);
-        int[] padding2 = SmartBarHelper.getViewPadding(v2);
-        ScaleType scale1 = v1.getButton().getScaleType();
-        ScaleType scale2 = v2.getButton().getScaleType();
-        v1.getButton().setButtonConfig(config2);
-        v2.getButton().setButtonConfig(config1);
-        mHost.setButtonDrawable(v1.getButton());
-        mHost.setButtonDrawable(v2.getButton());
-        SmartBarHelper.applyPaddingToView(v1, padding2);
-        SmartBarHelper.applyPaddingToView(v2, padding1);
-        v1.getButton().setScaleType(scale2);
-        v2.getButton().setScaleType(scale1);
-    }
-
-    private ViewGroup getHiddenNavButtons() {
-        return (ViewGroup) mHost.getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-    }
-
-}
diff --git a/src/com/android/systemui/navigation/smartbar/SmartBarHelper.java b/src/com/android/systemui/navigation/smartbar/SmartBarHelper.java
deleted file mode 100644
index f6e8fdd..0000000
--- a/src/com/android/systemui/navigation/smartbar/SmartBarHelper.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * Copyright (C) 2014 SlimRoms
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * Much love and respect to SlimRoms for some of these layout/padding
- * related methods and static factory methods
- *
- * 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.navigation.smartbar;
-
-import android.content.Context;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.Space;
-import android.widget.ImageView.ScaleType;
-import android.widget.LinearLayout.LayoutParams;
-
-import com.android.internal.utils.du.ActionHandler;
-import com.android.internal.utils.du.DUActionUtils;
-import com.android.internal.utils.du.Config.ButtonConfig;
-import com.android.internal.utils.du.ImageHelper;
-import com.android.systemui.navigation.OpaLayout;
-import com.android.systemui.navigation.BaseNavigationBar;
-import com.android.systemui.navigation.smartbar.SmartBarView;
-import com.android.systemui.navigation.smartbar.SmartButtonView;
-import com.android.systemui.R;
-
-public class SmartBarHelper {
-
-    public static int[] getViewPadding(View v) {
-        int[] padding = new int[4];
-        padding[0] = v.getPaddingStart();
-        padding[1] = v.getPaddingTop();
-        padding[2] = v.getPaddingEnd();
-        padding[3] = v.getPaddingBottom();
-        return padding;
-    }
-
-    public static void applyPaddingToView(View v, int[] padding) {
-        v.setPaddingRelative(padding[0], padding[1],
-                padding[2], padding[3]);
-    }
-
-    static boolean buttonNeedsCustomPadding(OpaLayout v) {
-        boolean hasCustomIcon = v.getButton().getButtonConfig().hasCustomIcon();
-        boolean hasNonSystemIcon = !v.getButton().getButtonConfig().isSystemAction();
-        return hasCustomIcon || hasNonSystemIcon;
-    }
-
-    public static void updateButtonScalingAndPadding(OpaLayout v, boolean landscape) {
-        // all non-system action icons need some extra scaling work
-        v.getButton().setScaleType(ScaleType.CENTER_INSIDE);
-    }
-
-    public static BitmapDrawable resizeCustomButtonIcon(Drawable d, Context ctx, float iconSizeScale) {
-        if (d == null) {
-            d = DUActionUtils.getDrawableForAction(ctx, ActionHandler.SYSTEMUI_TASK_NO_ACTION);
-        }
-        // get custom button icon size
-        final Bitmap bitmap = ImageHelper.drawableToBitmap(d);
-        int originalHeight = bitmap.getHeight();
-        int originalWeight = bitmap.getWidth();
-        // apply the needed scaling to the icon size values to match default system buttons icons size
-        final float scaledWidth = iconSizeScale * originalWeight;
-        final float scaledHeight = iconSizeScale * originalHeight;
-        // later we'll put the icon bitmap (resized to a smaller scaled rectf) into the bigger canvas,
-        // so we need to center the rectf coordinates into the canvas (moving it a bit to right and to bottom)
-        final float leftPadding = (originalWeight - scaledWidth) / 2;
-        final float topPadding = (originalHeight - scaledHeight) / 2;
-        final RectF targetRect = new RectF(leftPadding, topPadding, leftPadding + scaledWidth, topPadding + scaledHeight);
-        // create a new empty canvas with the size of the original icon, then draw into it the icon bitmap scaled to our
-        // smaller rectf size
-        final Bitmap dest = Bitmap.createBitmap(originalWeight, originalHeight, android.graphics.Bitmap.Config.ARGB_8888);
-        final Canvas canvas = new Canvas(dest);
-        final Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
-        paint.setAntiAlias(true);
-        canvas.drawBitmap(bitmap, null, targetRect, paint);
-
-        return new BitmapDrawable(ctx.getResources(), dest);
-    }
-
-    static OpaLayout generatePrimaryKey(Context ctx, SmartBarView host, boolean landscape,
-            ButtonConfig config) {
-        OpaLayout opa = (OpaLayout)View.inflate(ctx, R.layout.opa_smartbutton, null);
-        SmartButtonView v = opa.getButton();
-        v.setHost(host);
-        v.setButtonConfig(config);
-        int width = ctx.getResources().getDimensionPixelSize(R.dimen.navigation_key_width);
-        int height = ctx.getResources().getDimensionPixelSize(R.dimen.navigation_key_height);
-        v.loadRipple();
-        updateButtonScalingAndPadding(opa, landscape);
-        host.setButtonDrawable(v);
-        if (BaseNavigationBar.sIsTablet) {
-            v.setLayoutParams(new FrameLayout.LayoutParams(width, LayoutParams.MATCH_PARENT));
-            opa.setLayoutParams(new LinearLayout.LayoutParams(width, LayoutParams.MATCH_PARENT));
-        } else {
-            if (landscape) {
-                v.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, height));
-                opa.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height));
-            } else {
-                v.setLayoutParams(new FrameLayout.LayoutParams(width, LayoutParams.MATCH_PARENT));
-                opa.setLayoutParams(new LinearLayout.LayoutParams(width, LayoutParams.MATCH_PARENT));
-            }
-        }
-        return opa;
-    }
-
-    static View makeSeparator(Context ctx) {
-        View v;
-        if (BaseNavigationBar.sIsTablet) {
-            v = new Space(ctx);
-        } else {
-            v = new View(ctx);
-        }
-        v.setLayoutParams(new LinearLayout.LayoutParams(
-                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f));
-        v.setVisibility(View.INVISIBLE);
-        return v;
-    }
-
-    static void addViewToRoot(ViewGroup root, View toAdd, boolean landscape) {
-        if (landscape && !BaseNavigationBar.sIsTablet) {
-            root.addView(toAdd, 0);
-        } else {
-            root.addView(toAdd);
-        }
-    }
-
-    static int getButtonSize(Context ctx, int numButtons, boolean landscape) {
-        if (BaseNavigationBar.sIsTablet) {
-            return getTabletButtonSize(ctx, numButtons, landscape);
-        } else {
-            return getPhoneButtonSize(ctx, numButtons, landscape);
-        }
-    }
-
-    static int getTabletButtonSize(Context ctx, int numButtons, boolean landscape) {
-        int origSize = ctx.getResources().getDimensionPixelSize(
-                landscape ? R.dimen.navigation_key_tablet_width_land
-                        : R.dimen.navigation_key_tablet_width_port);
-        if (numButtons < 4) {
-            return origSize;
-        } else {
-            // the more buttons we have the less we shave per button
-            float factor = 1f - ((numButtons - 3) * 0.06f);
-            int size = Math.round(origSize * factor);
-            return size;
-        }
-    }
-
-    static int getPhoneButtonSize(Context ctx, int numButtons, boolean landscape) {
-        // in this case, landscape refers to the vertical bar layout
-        int origSize = ctx.getResources().getDimensionPixelSize(
-                landscape ? R.dimen.navigation_key_height : R.dimen.navigation_key_width);
-        if (numButtons < 4) {
-            return origSize;
-        } else {
-            // create an even distribution
-            int size = Math.round((origSize * 3) / numButtons);
-            return size;
-        }
-    }
-
-    static void updateButtonSize(View v, int size, boolean landscape) {
-        if (BaseNavigationBar.sIsTablet) {
-            updateTabletButtonSize(v, size, landscape);
-        } else {
-            updatePhoneButtonSize(v, size, landscape);
-        }
-    }
-
-    static void updatePhoneButtonSize(View v, int size, boolean landscape) {
-        if (landscape) {
-            v.getLayoutParams().height = size;
-        } else {
-            v.getLayoutParams().width = size;
-        }
-    }
-
-    static void updateTabletButtonSize(View v, int size, boolean landscape) {
-        v.getLayoutParams().width = size;
-    }
-}
diff --git a/src/com/android/systemui/navigation/smartbar/SmartBarTransitions.java b/src/com/android/systemui/navigation/smartbar/SmartBarTransitions.java
deleted file mode 100644
index 348fa5a..0000000
--- a/src/com/android/systemui/navigation/smartbar/SmartBarTransitions.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2013 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.navigation.smartbar;
-
-import android.graphics.drawable.Drawable;
-import android.view.View;
-
-import com.android.internal.utils.du.DUActionUtils;
-import com.android.systemui.R;
-import com.android.systemui.navigation.*;
-import com.android.systemui.navigation.smartbar.SmartBarView;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.phone.LightBarTransitionsController;
-
-public final class SmartBarTransitions extends BarTransitions {
-    private final SmartBarView mView;
-
-    private boolean mLightsOut;
-    private final LightBarTransitionsController mLightTransitionsController;
-
-    public SmartBarTransitions(SmartBarView view) {
-        super(view, R.drawable.nav_background);
-//                R.color.navigation_bar_background_opaque,
-//                R.color.navigation_bar_background_semi_transparent,
-//                R.color.navigation_bar_background_transparent,
-//                com.android.internal.R.color.battery_saver_mode_color);
-        mView = view;
-        mLightTransitionsController = new LightBarTransitionsController(view.getContext(),
-                this::applyDarkIntensity);
-    }
-
-    public void init() {
-        applyModeBackground(-1, getMode(), false /*animate*/);
-        applyMode(getMode(), false /*animate*/, true /*force*/);
-    }
-
-    public LightBarTransitionsController getLightTransitionsController() {
-        return mLightTransitionsController;
-    }
-
-    @Override
-    protected void onTransition(int oldMode, int newMode, boolean animate) {
-        super.onTransition(oldMode, newMode, animate);
-        applyMode(newMode, animate, false /*force*/);
-    }
-
-
-    private void applyMode(int mode, boolean animate, boolean force) {
-        // apply to lights out
-        applyLightsOut(isLightsOut(mode), animate, force);
-    }
-
-    public void reapplyDarkIntensity() {
-        applyDarkIntensity(mLightTransitionsController.getCurrentDarkIntensity());
-    }
-
-    public void applyDarkIntensity(float darkIntensity) {
-        for (SmartButtonView button : DUActionUtils.getAllChildren(mView, SmartButtonView.class)) {
-            button.setRippleDarkIntensity(darkIntensity);
-            Drawable d = button.getDrawable();
-            if (d != null && d instanceof DarkIntensity) {
-                ((DarkIntensity) d).setDarkIntensity(darkIntensity);
-            }
-        }
-    }
-
-    private void applyLightsOut(boolean lightsOut, boolean animate, boolean force) {
-        if (!force && lightsOut == mLightsOut)
-            return;
-
-        mLightsOut = lightsOut;
-
-        final View navButtons = mView.getCurrentView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        final boolean isBarPulseFaded = mView.isBarPulseFaded();
-        final float buttonAlpha = mView.getButtonAlpha();
-        final float fadeAlpha = isBarPulseFaded ? mView.mPulseNavButtonsOpacity : buttonAlpha;
-
-        // ok, everyone, stop it right there
-        navButtons.animate().cancel();
-
-        final float navButtonsAlpha = lightsOut ? 0.5f : fadeAlpha;
-
-        if (!animate) {
-            navButtons.setAlpha(navButtonsAlpha);
-        } else {
-            final int duration = lightsOut ? LIGHTS_OUT_DURATION : LIGHTS_IN_DURATION;
-            navButtons.animate()
-                    .alpha(navButtonsAlpha)
-                    .setDuration(duration)
-                    .start();
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/smartbar/SmartBarView.java b/src/com/android/systemui/navigation/smartbar/SmartBarView.java
deleted file mode 100644
index d1c749d..0000000
--- a/src/com/android/systemui/navigation/smartbar/SmartBarView.java
+++ /dev/null
@@ -1,974 +0,0 @@
-/**
- * Copyright (C) 2016-2017 The DirtyUnicorns Project
- * Copyright (C) 2014 SlimRoms
- *
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * Much love and respect to SlimRoms for writing and inspiring
- * some of the dynamic layout methods
- *
- * 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.
- *
- * A new software key based navigation implementation that just vaporizes
- * AOSP and quite frankly everything currently on the custom firmware scene
- *
- */
-
-package com.android.systemui.navigation.smartbar;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.app.StatusBarManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.animation.Animation;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.LinearLayout;
-
-import com.android.internal.utils.du.ActionConstants;
-import com.android.internal.utils.du.ActionHandler;
-import com.android.internal.utils.du.DUActionUtils;
-import com.android.internal.utils.du.Config;
-import com.android.internal.utils.du.Config.ActionConfig;
-import com.android.internal.utils.du.Config.ButtonConfig;
-import com.android.systemui.navigation.BaseEditor;
-import com.android.systemui.navigation.BaseNavigationBar;
-import com.android.systemui.navigation.Editor;
-import com.android.systemui.navigation.OpaLayout;
-import com.android.systemui.navigation.Res;
-import com.android.systemui.navigation.NavbarOverlayResources;
-import com.android.systemui.navigation.smartbar.SmartBackButtonDrawable;
-import com.android.systemui.navigation.smartbar.SmartBarEditor;
-import com.android.systemui.navigation.smartbar.SmartBarHelper;
-import com.android.systemui.navigation.smartbar.SmartBarTransitions;
-import com.android.systemui.navigation.smartbar.SmartBarView;
-import com.android.systemui.navigation.smartbar.SmartButtonView;
-import com.android.systemui.navigation.pulse.PulseController;
-import com.android.systemui.navigation.utils.SmartObserver.SmartObservable;
-import com.android.systemui.statusbar.phone.BarTransitions;
-import com.android.systemui.statusbar.phone.LightBarTransitionsController;
-import com.android.systemui.statusbar.policy.KeyButtonDrawable;
-import com.android.systemui.R;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-
-public class SmartBarView extends BaseNavigationBar {
-    final static boolean DEBUG = false;
-    final static String TAG = SmartBarView.class.getSimpleName();
-    final static int PULSE_FADE_OUT_DURATION = 250;
-    final static int PULSE_FADE_IN_DURATION = 200;
-
-    static final int IME_HINT_MODE_HIDDEN = 0;
-    static final int IME_HINT_MODE_ARROWS = 1;
-    static final int IME_HINT_MODE_PICKER = 2;
-    static final int IME_AND_MEDIA_HINT_MODE_ARROWS = 3;
-
-    private static Set<Uri> sUris = new HashSet<Uri>();
-    static {
-        sUris.add(Settings.Secure.getUriFor("smartbar_context_menu_mode"));
-        sUris.add(Settings.Secure.getUriFor("smartbar_ime_hint_mode"));
-        sUris.add(Settings.Secure.getUriFor("smartbar_button_animation_style"));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.NAVBAR_BUTTONS_ALPHA));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.PULSE_CUSTOM_BUTTONS_OPACITY));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.SMARTBAR_LONGPRESS_DELAY));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.SMARTBAR_CUSTOM_ICON_SIZE));
-        sUris.add(Settings.Secure.getUriFor(Settings.Secure.SMARTBAR_DOUBLETAP_SLEEP));
-    }
-
-    private SmartObservable mObservable = new SmartObservable() {
-        @Override
-        public Set<Uri> onGetUris() {
-            return sUris;
-        }
-
-        @Override
-        public void onChange(Uri uri) {
-            if (uri.equals(Settings.Secure.getUriFor("smartbar_context_menu_mode"))) {
-                updateContextLayoutSettings();
-            } else if (uri.equals(Settings.Secure.getUriFor("smartbar_ime_hint_mode"))) {
-                updateImeHintModeSettings();
-                refreshImeHintMode();
-            } else if (uri.equals(Settings.Secure.getUriFor("smartbar_button_animation_style"))) {
-                updateAnimationStyle();
-            } else if (uri.equals(Settings.Secure.getUriFor(Settings.Secure.NAVBAR_BUTTONS_ALPHA))) {
-                updateButtonAlpha();
-            } else if (uri.equals(Settings.Secure.getUriFor(Settings.Secure.PULSE_CUSTOM_BUTTONS_OPACITY))) {
-                updatePulseNavButtonsOpacity();
-            } else if (uri.equals(Settings.Secure.getUriFor(Settings.Secure.SMARTBAR_LONGPRESS_DELAY))) {
-                updateButtonLongpressDelay();
-            } else if (uri.equals(Settings.Secure.getUriFor(Settings.Secure.SMARTBAR_CUSTOM_ICON_SIZE))) {
-                updateCustomIconSize();
-                updateCurrentIcons();
-                reapplyDarkIntensity();
-            } else if (uri.equals(Settings.Secure.getUriFor(Settings.Secure.SMARTBAR_DOUBLETAP_SLEEP))) {
-                updateNavDoubletapSetting();
-            }
-        }
-    };
-
-    boolean mShowMenu;
-    int mNavigationIconHints = 0;
-
-    private final SmartBarTransitions mBarTransitions;
-    private SmartBarEditor mEditor;
-
-    // hold a reference to primary buttons in order of appearance on screen
-    private ArrayList<String> mCurrentSequence = new ArrayList<String>();
-    private View mContextRight, mContextLeft, mCurrentContext;
-    private boolean mHasLeftContext;
-    private boolean mMusicStreamMuted;
-    private int mImeHintMode;
-    private int mButtonAnimationStyle;
-    private float mCustomAlpha;
-    private float mCustomIconScale;
-    public float mPulseNavButtonsOpacity;
-    private boolean isNavDoubleTapEnabled;
-
-    private boolean mIsMediaPlaying;
-
-    private AudioManager mAudioManager;
-
-    private GestureDetector mNavDoubleTapToSleep;
-
-    private boolean mRotateButtonVisible;
-    private int mLastRotation = 0;
-
-    @Override
-    public void onReceive(Intent intent) {
-        if (AudioManager.STREAM_MUTE_CHANGED_ACTION.equals(intent.getAction())
-                || (AudioManager.VOLUME_CHANGED_ACTION.equals(intent.getAction()))) {
-            int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
-            if (streamType == AudioManager.STREAM_MUSIC) {
-                boolean muted = isMusicMuted(streamType);
-                if (mMusicStreamMuted != muted) {
-                    mMusicStreamMuted = muted;
-                    Handler mHandler = new Handler();
-                    mHandler.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            setNavigationIconHints(mNavigationIconHints, true);
-                        }
-                    });
-                }
-            }
-        }
-    }
-
-    private boolean isMusicMuted(int streamType) {
-        return streamType == AudioManager.STREAM_MUSIC &&
-                (mAudioManager.isStreamMute(streamType) ||
-                mAudioManager.getStreamVolume(streamType) == 0);
-    }
-
-    @Override
-    public void setRotateSuggestionButtonState(boolean visible, boolean skipAnim) {
-        mRotateButtonVisible = visible;
-        //skipAnim
-        setNavigationIconHints(mNavigationIconHints, true);
-    }
-
-    @Override
-    public void setLastRotation(int rotation) {
-        mLastRotation = rotation;
-    }
-
-    public void rotate() {
-        getRotationController().setRotationLockedAtAngle(true, mLastRotation);
-    }
-
-    public SmartBarView(Context context) {
-        super(context);
-        mBarTransitions = new SmartBarTransitions(this);
-        mEditor = new SmartBarEditor(this);
-        mSmartObserver.addListener(mObservable);
-        createBaseViews();
-
-        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-        mMusicStreamMuted = isMusicMuted(AudioManager.STREAM_MUSIC);
-
-        mNavDoubleTapToSleep = new GestureDetector(context,
-                new GestureDetector.SimpleOnGestureListener() {
-            @Override
-            public boolean onDoubleTap(MotionEvent e) {
-                ActionHandler.performTask(context, ActionHandler.SYSTEMUI_TASK_SCREENOFF);
-                return true;
-            }
-        });
-    }
-
-    private final OnTouchListener mSmartBarTouchListener = new OnTouchListener() {
-        @Override
-        public boolean onTouch(View v, MotionEvent event) {
-            return isNavDoubleTapEnabled && !mEditor.isInEditMode()
-                    ? mNavDoubleTapToSleep.onTouchEvent(event) : true;
-        }
-    };
-
-    @Override
-    public void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        if (getParent() != null) {
-            final View v = (View)getParent();
-            v.setOnTouchListener(mSmartBarTouchListener);
-        }
-    }
-
-    @Override
-    public void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        if (getParent() != null) {
-            final View v = (View)getParent();
-            v.setOnTouchListener(null);
-        }
-    }
-
-    @Override
-    public void setMediaPlaying(boolean playing) {
-        mIsMediaPlaying = playing;
-        setNavigationIconHints(mNavigationIconHints, true);
-        PulseController mPulse = getPulseController();
-        if (mPulse != null) {
-            mPulse.setMediaPlaying(playing);
-        }
-    }
-
-    @Override
-    public void setPulseColors(boolean colorizedMedia, int[] colors) {
-        PulseController mPulse = getPulseController();
-        if (mPulse != null) {
-            mPulse.setPulseColors(colorizedMedia, colors);
-        }
-    }
-
-    ArrayList<String> getCurrentSequence() {
-        return mCurrentSequence;
-    }
-
-    float getButtonAlpha() {
-        return mCustomAlpha;
-    }
-
-    @Override
-    public Editor getEditor() {
-        return mEditor;
-    }
-
-    public void setEditMode(boolean on) {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.smartbar_editmode_color);
-        setBackgroundColor(on ? d : null);
-    }
-
-    @Override
-    public void setResourceMap(NavbarOverlayResources resourceMap) {
-        super.setResourceMap(resourceMap);
-        updateCustomIconSize();
-        updateCurrentIcons();
-        recreateLayouts();
-        updateImeHintModeSettings();
-        updateContextLayoutSettings();
-        updateButtonLongpressDelay();
-        updateNavDoubletapSetting();
-    }
-
-    @Override
-    public BarTransitions getBarTransitions() {
-        return mBarTransitions;
-    }
-
-    @Override
-    public LightBarTransitionsController getLightTransitionsController() {
-        return mBarTransitions.getLightTransitionsController();
-    }
-
-    @Override
-    protected void onInflateFromUser() {
-        mEditor.notifyScreenOn(mScreenOn);
-    }
-
-    @Override
-    public void onRecreateStatusbar() {
-        mEditor.updateResources(null);
-        updateCurrentIcons();
-    }
-
-    @Override
-    public void updateNavbarThemedResources(Resources res){
-        super.updateNavbarThemedResources(res);
-        updateCurrentIcons();
-        updateButtonAlpha();
-    }
-
-    public void updateCurrentIcons() {
-        for (SmartButtonView button : DUActionUtils.getAllChildren(this, SmartButtonView.class)) {
-            setButtonDrawable(button);
-        }
-    }
-
-    public void setButtonDrawable(SmartButtonView button) {
-        ButtonConfig config = button.getButtonConfig();
-        if (config != null) {
-            Context ctx = getContext();
-            KeyButtonDrawable d = null;
-            SmartBackButtonDrawable bd = null;
-            Drawable light = null;
-            Drawable dark = null;
-            boolean isBackButton = TextUtils.equals(config.getTag(), Res.Softkey.BUTTON_BACK);
-            final boolean backAlt = (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
-            if (!config.hasCustomIcon()
-                    && config.isSystemAction()) {
-                light = mResourceMap.getActionDrawable(config.getActionConfig(ActionConfig.PRIMARY).getAction());
-                dark = mResourceMap.getDarkActionDrawable(config.getActionConfig(ActionConfig.PRIMARY).getAction());
-                if (isBackButton) {
-                    bd = SmartBackButtonDrawable.create(light, dark);
-                    bd.setImeVisible(backAlt);
-                    button.setImageDrawable(bd);
-                } else {
-                    d = KeyButtonDrawable.create(light, dark);
-                    button.setImageDrawable(d);
-                }
-            } else {
-                light = SmartBarHelper.resizeCustomButtonIcon(config.getCurrentIcon(ctx), ctx, mCustomIconScale).mutate();
-                dark = SmartBarHelper.resizeCustomButtonIcon(config.getCurrentIcon(ctx), ctx, mCustomIconScale).mutate();
-                dark.setColorFilter(new PorterDuffColorFilter(0x4D353535, PorterDuff.Mode.SRC_ATOP));
-                if (isBackButton) {
-                    bd = SmartBackButtonDrawable.create(light, dark);
-                    bd.setImeVisible(backAlt);
-                    button.setImageDrawable(bd);
-                } else {
-                    d = KeyButtonDrawable.create(light, dark);
-                    button.setImageDrawable(d);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void setNavigationIconHints(int hints) {
-        setNavigationIconHints(hints, false);
-    }
-
-    public SmartButtonView getSmartBackButton() {
-        return (SmartButtonView) mCurrentView.findViewWithTag(Res.Softkey.BUTTON_BACK);
-    }
-
-    public SmartButtonView getSmartHomeButton() {
-        return (SmartButtonView) mCurrentView.findViewWithTag(Res.Softkey.BUTTON_HOME);
-    }
-
-    public SmartButtonView getSmartMenuButton() {
-        return (SmartButtonView) mCurrentContext.findViewWithTag(Res.Softkey.MENU_BUTTON);
-    }
-
-    SmartButtonView getSmartImeSwitchButton() {
-        return (SmartButtonView) mCurrentContext.findViewWithTag(Res.Softkey.IME_SWITCHER);
-    }
-
-    SmartButtonView findCurrentButton(String tag) {
-        return (SmartButtonView) mCurrentView.findViewWithTag(tag);
-    }
-
-    SmartBackButtonDrawable getSmartBackButtonIcon() {
-        return (SmartBackButtonDrawable) getSmartBackButton().getDrawable();
-    }
-
-    private ViewGroup getHiddenContext() {
-        return (ViewGroup) (mCurrentContext == mContextRight ? mContextLeft : mContextRight);
-    }
-
-    private void setImeArrowsVisibility(View currentOrHidden, int visibility) {
-        ViewGroup contextLeft = (ViewGroup)currentOrHidden.findViewWithTag(Res.Softkey.CONTEXT_VIEW_LEFT);
-        contextLeft.findViewWithTag(Res.Softkey.IME_ARROW_LEFT).setVisibility(visibility);
-        ViewGroup contextRight = (ViewGroup)currentOrHidden.findViewWithTag(Res.Softkey.CONTEXT_VIEW_RIGHT);
-        contextRight.findViewWithTag(Res.Softkey.IME_ARROW_RIGHT).setVisibility(visibility);
-    }
-
-    private void setMediaArrowsVisibility(boolean backAlt) {
-        setMediaArrowsVisibility(mCurrentView, (!backAlt && !mRotateButtonVisible && (mIsMediaPlaying /*&& mAudioManager.isMusicActive()*/))
-                ? View.VISIBLE : View.INVISIBLE);
-    }
-
-    private void setMediaArrowsVisibility(View currentOrHidden, int visibility) {
-        ViewGroup contextLeft = (ViewGroup)currentOrHidden.findViewWithTag(Res.Softkey.CONTEXT_VIEW_LEFT);
-        contextLeft.findViewWithTag(Res.Softkey.MEDIA_ARROW_LEFT).setVisibility(visibility);
-        ViewGroup contextRight = (ViewGroup)currentOrHidden.findViewWithTag(Res.Softkey.CONTEXT_VIEW_RIGHT);
-        contextRight.findViewWithTag(Res.Softkey.MEDIA_ARROW_RIGHT).setVisibility(visibility);
-    }
-
-    private void setRotationButtonVisibility() {
-        setRotationButtonVisibility(mCurrentView, mRotateButtonVisible ? View.VISIBLE : View.INVISIBLE);
-    }
-
-    private void setRotationButtonVisibility(View currentOrHidden, int visibility) {
-        final ViewGroup contextRight = (ViewGroup)currentOrHidden.findViewWithTag(Res.Softkey.CONTEXT_VIEW_RIGHT);
-        View current = contextRight.findViewWithTag(Res.Softkey.ROTATION_BUTTON);
-        if (visibility == View.VISIBLE) {
-            current.setVisibility(View.VISIBLE);
-            current.setAlpha(0.0f);
-            current.animate()
-                    .setListener(new AnimatorListenerAdapter() {
-                        @Override
-                        public void onAnimationEnd(Animator _a) {
-                        }
-                    })
-                    .alpha(1.0f)
-                    .setDuration(100)
-                    .start();
-        } else {
-            current.animate()
-                    .alpha(0.0f)
-                    .setDuration(100)
-                    .setListener(new AnimatorListenerAdapter() {
-                        @Override
-                        public void onAnimationEnd(Animator _a) {
-                            current.setVisibility(View.INVISIBLE);
-                        }
-                    })
-                    .start();
-        }
-    }
-
-    @Override
-    protected boolean areAnyHintsActive() {
-        return super.areAnyHintsActive() || mShowMenu;
-    }
-
-    @Override
-    public void setNavigationIconHints(int hints, boolean force) {
-        if (!force && hints == mNavigationIconHints)
-            return;
-        mEditor.changeEditMode(BaseEditor.MODE_OFF);
-        final boolean backAlt = (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
-
-        mNavigationIconHints = hints;
-        getSmartBackButtonIcon().setImeVisible(backAlt);
-
-        setRotationButtonVisibility();
-        if (mRotateButtonVisible) {
-            getSmartImeSwitchButton().setVisibility(View.INVISIBLE);
-            setImeArrowsVisibility(mCurrentView, View.INVISIBLE);
-            setMediaArrowsVisibility(mCurrentView, View.INVISIBLE);
-        } else {
-            final boolean showImeButton = /*(*/(hints /*& StatusBarManager.NAVIGATION_HINT_IME_SHOWN)*/ != 0);
-            switch(mImeHintMode) {
-                case IME_HINT_MODE_ARROWS: // arrows
-                    getSmartImeSwitchButton().setVisibility(View.INVISIBLE);
-                    setImeArrowsVisibility(mCurrentView, backAlt ? View.VISIBLE : View.INVISIBLE);
-                    setMediaArrowsVisibility(mCurrentView, View.INVISIBLE);
-                    break;
-                case IME_AND_MEDIA_HINT_MODE_ARROWS:
-                    getSmartImeSwitchButton().setVisibility(View.INVISIBLE);
-                    setImeArrowsVisibility(mCurrentView, backAlt ? View.VISIBLE : View.INVISIBLE);
-                    setMediaArrowsVisibility(backAlt);
-                    break;
-                case IME_HINT_MODE_PICKER:
-                    getHiddenContext().findViewWithTag(Res.Softkey.IME_SWITCHER).setVisibility(INVISIBLE);
-                    getSmartImeSwitchButton().setVisibility(showImeButton ? View.VISIBLE : View.INVISIBLE);
-                    setImeArrowsVisibility(mCurrentView, View.INVISIBLE);
-                    setMediaArrowsVisibility(mCurrentView, View.INVISIBLE);
-                    break;
-                default: // hidden
-                    getSmartImeSwitchButton().setVisibility(View.INVISIBLE);
-                    setImeArrowsVisibility(mCurrentView, View.INVISIBLE);
-                    setMediaArrowsVisibility(mCurrentView, View.INVISIBLE);
-            }
-        }
-
-        // Update menu button in case the IME state has changed.
-        setMenuVisibility(mShowMenu, true);
-        setDisabledFlags(mDisabledFlags, true);
-
-        reapplyDarkIntensity();
-    }
-
-    private void reapplyDarkIntensity() {
-        mBarTransitions.reapplyDarkIntensity();
-    }
-
-    @Override
-    public void setDisabledFlags(int disabledFlags, boolean force) {
-        super.setDisabledFlags(disabledFlags, force);
-        mEditor.changeEditMode(BaseEditor.MODE_OFF);
-
-        final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
-        final boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0);
-        final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)
-                && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0);
-
-        OpaLayout opaBack = (OpaLayout)getSmartBackButton().getParent();
-        opaBack.setVisibility(disableBack ? View.INVISIBLE : View.VISIBLE);
-        OpaLayout opaHome = (OpaLayout)getSmartHomeButton().getParent();
-        opaHome.setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE);
-
-        // if any stock buttons are disabled, it's likely proper
-        // to disable custom buttons as well
-        for (String buttonTag : mCurrentSequence) {
-            SmartButtonView v = findCurrentButton(buttonTag);
-            OpaLayout opa = (OpaLayout) v.getParent();
-            if (v != null && v != getSmartBackButton() && v != getSmartHomeButton()) {
-                if (disableHome || disableBack || disableRecent) {
-                    opa.setVisibility(View.INVISIBLE);
-                } else {
-                    opa.setVisibility(View.VISIBLE);
-                }
-            }
-        }
-
-        if (disableHome) {
-            if (mImeHintMode == 3) {
-                setMediaArrowsVisibility(mCurrentView, View.INVISIBLE);
-            }
-            setRotationButtonVisibility(mCurrentView, View.INVISIBLE);
-        } else {
-            if (mImeHintMode == 3) {
-                final boolean backAlt = (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
-                setMediaArrowsVisibility(backAlt);
-            }
-            setRotationButtonVisibility();
-        }
-    }
-
-    @Override
-    public void notifyScreenStateChange(boolean screenOn) {
-        super.notifyScreenStateChange(screenOn);
-        mEditor.notifyScreenOn(screenOn);
-        ViewGroup hidden = (ViewGroup) getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        for (String buttonTag : mCurrentSequence) {
-            SmartButtonView v = findCurrentButton(buttonTag);
-            if (v != null) {
-                v.onScreenStateChanged(screenOn);
-            }
-            v = (SmartButtonView) hidden.findViewWithTag(buttonTag);
-            if (v != null) {
-                v.onScreenStateChanged(screenOn);
-            }
-        }
-        // onStopPulse may not have had time to animate alpha to proper value before screen went
-        // off. Reset alpha when we come back on. we should never have pulse running when this is called
-        final View currentNavButtons = getCurrentView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        final View hiddenNavButtons = getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        final float fadeAlpha = mCustomAlpha;
-        if (screenOn && (currentNavButtons.getAlpha() != fadeAlpha || hiddenNavButtons.getAlpha() != fadeAlpha)) {
-            hiddenNavButtons.setAlpha(fadeAlpha);
-            currentNavButtons.setAlpha(fadeAlpha);
-        }
-    }
-
-    @Override
-    protected void onKeyguardShowing(boolean showing) {
-        mEditor.setKeyguardShowing(showing);
-        // TODO: temp hax to address package manager not having activity icons ready yet
-        // this is new to N, likely part of new optimized boot time. In theory, activity
-        // icons should be ready by the time lockscreen goes away. We will be stuck with this
-        // unless we can find a way for package manager to have activity icons ready sooner, but
-        // do so without slowing faster boot time.
-        if (!showing) {
-            ViewGroup hidden = (ViewGroup) getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-            for (String buttonTag : mCurrentSequence) {
-                SmartButtonView v = findCurrentButton(buttonTag);
-                if (v != null) {
-                    ButtonConfig config = v.getButtonConfig();
-                    if (config != null && v.getDrawable() == null) {
-                        v.setImageDrawable(config.getCurrentIcon(getContext()));
-                    }
-                }
-                v = (SmartButtonView) hidden.findViewWithTag(buttonTag);
-                if (v != null) {
-                    ButtonConfig config = v.getButtonConfig();
-                    if (config != null && v.getDrawable() == null) {
-                        v.setImageDrawable(config.getCurrentIcon(getContext()));
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void setMenuVisibility(final boolean show) {
-        setMenuVisibility(show, false);
-    }
-
-    @Override
-    public void setMenuVisibility(final boolean show, final boolean force) {
-        if (!force && mShowMenu == show)
-            return;
-        mEditor.changeEditMode(BaseEditor.MODE_OFF);
-        mShowMenu = show;
-
-        // Only show Menu if IME switcher not shown.
-        final boolean shouldShow = mShowMenu &&
-                /*(*/(mNavigationIconHints == 0 /*& StatusBarManager.NAVIGATION_HINT_IME_SHOWN) == 0*/);
-        getSmartMenuButton().setVisibility(shouldShow ? View.VISIBLE : View.INVISIBLE);
-    }
-
-    void recreateLayouts() {
-        mCurrentSequence.clear();
-        ArrayList<ButtonConfig> buttonConfigs;
-        buttonConfigs = Config.getConfig(getContext(),
-                ActionConstants.getDefaults(ActionConstants.SMARTBAR));
-        recreateButtonLayout(buttonConfigs, false, true);
-        recreateButtonLayout(buttonConfigs, true, false);
-        mContextLeft = mCurrentView.findViewWithTag(Res.Softkey.CONTEXT_VIEW_LEFT);
-        mContextRight = mCurrentView.findViewWithTag(Res.Softkey.CONTEXT_VIEW_RIGHT);
-        mCurrentContext = mHasLeftContext ? mContextLeft : mContextRight;
-        updateCurrentIcons();
-        setDisabledFlags(mDisabledFlags, true);
-        setMenuVisibility(mShowMenu, true);
-        setNavigationIconHints(mNavigationIconHints, true);
-        updateAnimationStyle();
-        updateButtonAlpha();
-        setOpaLandscape(mVertical);
-    }
-
-    @Override
-    protected void onDispose() {
-        removeAllViews();
-    }
-
-    @Override
-    protected void notifyBootCompleted() {
-        updateCurrentIcons();
-    }
-
-    @Override
-    public void reorient() {
-        mEditor.prepareToReorient();
-        super.reorient();
-        mBarTransitions.init();
-        mEditor.reorient(mCurrentView == mRot90);
-        mContextLeft = mCurrentView.findViewWithTag(Res.Softkey.CONTEXT_VIEW_LEFT);
-        mContextRight = mCurrentView.findViewWithTag(Res.Softkey.CONTEXT_VIEW_RIGHT);
-        mCurrentContext = mHasLeftContext ? mContextLeft : mContextRight;
-        setDisabledFlags(mDisabledFlags, true);
-        setMenuVisibility(mShowMenu, true);
-        setNavigationIconHints(mNavigationIconHints, true);
-        setButtonAlpha();
-        updatePulseNavButtonsOpacity();
-        setOpaLandscape(mVertical);
-    }
-
-    private void updateContextLayoutSettings() {
-        boolean onLeft = Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                "smartbar_context_menu_mode", 0, UserHandle.USER_CURRENT) == 1;
-        if (mHasLeftContext != onLeft) {
-            getSmartMenuButton().setVisibility(INVISIBLE);
-            getSmartImeSwitchButton().setVisibility(INVISIBLE);
-            getHiddenContext().findViewWithTag(Res.Softkey.MENU_BUTTON).setVisibility(INVISIBLE);
-            getHiddenContext().findViewWithTag(Res.Softkey.IME_SWITCHER).setVisibility(INVISIBLE);
-            mHasLeftContext = onLeft;
-            mCurrentContext = mHasLeftContext ? mContextLeft : mContextRight;
-            setDisabledFlags(mDisabledFlags, true);
-            setMenuVisibility(mShowMenu, true);
-            setNavigationIconHints(mNavigationIconHints, true);
-        }
-    }
-
-    private void updateImeHintModeSettings() {
-        mImeHintMode = Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                "smartbar_ime_hint_mode", IME_HINT_MODE_HIDDEN, UserHandle.USER_CURRENT);
-    }
-
-    private void updateAnimationStyle() {
-        mButtonAnimationStyle = Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                "smartbar_button_animation_style", SmartButtonView.ANIM_STYLE_RIPPLE, UserHandle.USER_CURRENT);
-        ViewGroup hidden = (ViewGroup) getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        for (String buttonTag : mCurrentSequence) {
-            SmartButtonView v = findCurrentButton(buttonTag);
-            if (v != null) {
-                v.setAnimationStyle(mButtonAnimationStyle);
-            }
-            v = (SmartButtonView) hidden.findViewWithTag(buttonTag);
-            if (v != null) {
-                v.setAnimationStyle(mButtonAnimationStyle);
-            }
-        }
-    }
-
-    private void setOpaLandscape(boolean landscape) {
-        for (String buttonTag : mCurrentSequence) {
-            SmartButtonView v = findCurrentButton(buttonTag);
-            OpaLayout opa = (OpaLayout) v.getParent();
-            opa.setLandscape(landscape);
-        }
-    }
-
-    private void refreshImeHintMode() {
-        getSmartMenuButton().setVisibility(INVISIBLE);
-        getSmartImeSwitchButton().setVisibility(INVISIBLE);
-        getHiddenContext().findViewWithTag(Res.Softkey.MENU_BUTTON).setVisibility(INVISIBLE);
-        getHiddenContext().findViewWithTag(Res.Softkey.IME_SWITCHER).setVisibility(INVISIBLE);
-        setNavigationIconHints(mNavigationIconHints, true);
-    }
-
-    private void updateNavDoubletapSetting() {
-        isNavDoubleTapEnabled = Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                Settings.Secure.SMARTBAR_DOUBLETAP_SLEEP, 1, UserHandle.USER_CURRENT) == 1;
-    }
-
-    void recreateButtonLayout(ArrayList<ButtonConfig> buttonConfigs, boolean landscape,
-            boolean updateCurrentButtons) {
-        int extraKeyWidth = getContext().getResources().getDimensionPixelSize(R.dimen.navigation_extra_key_width);
-        int extraKeyHeight = getContext().getResources().getDimensionPixelSize(R.dimen.navigation_extra_key_height);
-
-        LinearLayout navButtonLayout = (LinearLayout) (landscape ? mRot90
-                .findViewWithTag(Res.Common.NAV_BUTTONS) : mRot0
-                .findViewWithTag(Res.Common.NAV_BUTTONS));
-
-        navButtonLayout.removeAllViews();
-
-        if (buttonConfigs == null) {
-            buttonConfigs = Config.getConfig(getContext(),
-                    ActionConstants.getDefaults(ActionConstants.SMARTBAR));
-        }
-
-        // left context frame layout
-        FrameLayout leftContext = generateContextKeyLayout(landscape,
-                Res.Softkey.CONTEXT_VIEW_LEFT,
-                extraKeyWidth, extraKeyHeight);
-        SmartBarHelper.addViewToRoot(navButtonLayout, leftContext, landscape);
-
-        // tablets get a spacer here
-        if (BaseNavigationBar.sIsTablet) {
-            SmartBarHelper.addViewToRoot(navButtonLayout, SmartBarHelper.makeSeparator(getContext()),
-                    landscape);
-        }
-
-        // softkey buttons
-        ButtonConfig buttonConfig;
-        int dimen = SmartBarHelper.getButtonSize(getContext(), buttonConfigs.size(), landscape);
-
-        for (int j = 0; j < buttonConfigs.size(); j++) {
-            buttonConfig = buttonConfigs.get(j);
-            OpaLayout v = SmartBarHelper.generatePrimaryKey(getContext(), this, landscape, buttonConfig);
-            SmartBarHelper.updateButtonSize(v, dimen, landscape);
-            SmartButtonView sb = v.getButton();
-            SmartBarHelper.updateButtonSize(sb, dimen, landscape);
-            SmartBarHelper.addViewToRoot(navButtonLayout, v, landscape);
-
-            // only add once for master sequence holder
-            if (updateCurrentButtons) {
-                mCurrentSequence.add((String) v.getButton().getTag());
-            }
-
-            // phones get a spacer between each button
-            // tablets get a spacer before first and after last
-            if (j != buttonConfigs.size() - 1 && !BaseNavigationBar.sIsTablet) {
-                // adding spacers between buttons on phones
-                SmartBarHelper.addViewToRoot(navButtonLayout,
-                        SmartBarHelper.makeSeparator(getContext()), landscape);
-            }
-            if (j == buttonConfigs.size() - 1 && BaseNavigationBar.sIsTablet) {
-                // adding spacers after last button on tablets
-                SmartBarHelper.addViewToRoot(navButtonLayout,
-                        SmartBarHelper.makeSeparator(getContext()), landscape);
-            }
-        }
-
-        // right context frame layout
-        FrameLayout rightContext = generateContextKeyLayout(landscape,
-                Res.Softkey.CONTEXT_VIEW_RIGHT,
-                extraKeyWidth, extraKeyHeight);
-        SmartBarHelper.addViewToRoot(navButtonLayout, rightContext, landscape);
-    }
-
-    private FrameLayout generateContextKeyLayout(boolean landscape, String leftOrRight,
-            int extraKeyWidth, int extraKeyHeight) {
-        FrameLayout contextLayout = new FrameLayout(getContext());
-        contextLayout.setLayoutParams(new LinearLayout.LayoutParams(
-                landscape && !BaseNavigationBar.sIsTablet ? LayoutParams.MATCH_PARENT
-                        : extraKeyWidth, landscape && !BaseNavigationBar.sIsTablet ? extraKeyHeight
-                        : LayoutParams.MATCH_PARENT));
-        contextLayout.setTag(leftOrRight);
-
-        SmartButtonView menuKeyView = generateContextKey(landscape, Res.Softkey.MENU_BUTTON);
-        contextLayout.addView(menuKeyView);
-
-        SmartButtonView imeChanger = generateContextKey(landscape, Res.Softkey.IME_SWITCHER);
-        contextLayout.addView(imeChanger);
-
-        if (TextUtils.equals(Res.Softkey.CONTEXT_VIEW_LEFT, leftOrRight)) {
-            SmartButtonView imeArrowLeft = generateContextKey(landscape, Res.Softkey.IME_ARROW_LEFT);
-            contextLayout.addView(imeArrowLeft);
-            SmartButtonView mediaArrowLeft = generateContextKey(landscape, Res.Softkey.MEDIA_ARROW_LEFT);
-            contextLayout.addView(mediaArrowLeft);
-        } else if (TextUtils.equals(Res.Softkey.CONTEXT_VIEW_RIGHT, leftOrRight)) {
-            SmartButtonView imeArrowRight = generateContextKey(landscape, Res.Softkey.IME_ARROW_RIGHT);
-            contextLayout.addView(imeArrowRight);
-            SmartButtonView mediaArrowRight = generateContextKey(landscape, Res.Softkey.MEDIA_ARROW_RIGHT);
-            contextLayout.addView(mediaArrowRight);
-            SmartButtonView rotationButton = generateContextKey(landscape, Res.Softkey.ROTATION_BUTTON);
-            contextLayout.addView(rotationButton);
-        }
-
-        return contextLayout;
-    }
-
-    private SmartButtonView generateContextKey(boolean landscape, String tag) {
-        SmartButtonView v = new SmartButtonView(getContext());
-        ButtonConfig buttonConfig = new ButtonConfig(getContext());
-        ActionConfig actionConfig = new ActionConfig(getContext());
-
-        int extraKeyWidth = getContext().getResources().getDimensionPixelSize(R.dimen.navigation_extra_key_width);
-        int extraKeyHeight = getContext().getResources().getDimensionPixelSize(R.dimen.navigation_extra_key_height);
-
-        v.setHost(this);
-        v.setLayoutParams(new FrameLayout.LayoutParams(
-                landscape && !BaseNavigationBar.sIsTablet ? LayoutParams.MATCH_PARENT : extraKeyWidth,
-                landscape && !BaseNavigationBar.sIsTablet ? extraKeyHeight : LayoutParams.MATCH_PARENT));
-        v.loadRipple();
-        v.setScaleType(ScaleType.CENTER_INSIDE);
-
-        if (tag.equals(Res.Softkey.MENU_BUTTON)) {
-            actionConfig = new ActionConfig(getContext(), ActionHandler.SYSTEMUI_TASK_MENU);
-        } else if (tag.equals(Res.Softkey.IME_SWITCHER)) {
-            actionConfig = new ActionConfig(getContext(), ActionHandler.SYSTEMUI_TASK_IME_SWITCHER);
-        } else if (tag.equals(Res.Softkey.IME_ARROW_LEFT)) {
-            actionConfig = new ActionConfig(getContext(), ActionHandler.SYSTEMUI_TASK_IME_NAVIGATION_LEFT);
-        } else if (tag.equals(Res.Softkey.IME_ARROW_RIGHT)) {
-            actionConfig = new ActionConfig(getContext(), ActionHandler.SYSTEMUI_TASK_IME_NAVIGATION_RIGHT);
-        } else if (tag.equals(Res.Softkey.MEDIA_ARROW_LEFT)) {
-            actionConfig = new ActionConfig(getContext(), ActionHandler.SYSTEMUI_TASK_MEDIA_PREVIOUS);
-        } else if (tag.equals(Res.Softkey.MEDIA_ARROW_RIGHT)) {
-            actionConfig = new ActionConfig(getContext(), ActionHandler.SYSTEMUI_TASK_MEDIA_NEXT);
-        } else if (tag.equals(Res.Softkey.ROTATION_BUTTON)) {
-            actionConfig = new ActionConfig(getContext(), ActionHandler.SYSTEMUI_TASK_ROTATION);
-        }
-
-        buttonConfig.setActionConfig(actionConfig, ActionConfig.PRIMARY);
-        buttonConfig.setTag(tag);
-        v.setButtonConfig(buttonConfig);
-        v.setVisibility(View.INVISIBLE);
-        setButtonDrawable(v);
-        v.setContentDescription(buttonConfig.getActionConfig(ActionConfig.PRIMARY).getLabel());
-        v.setAnimationStyle(SmartButtonView.ANIM_STYLE_RIPPLE);
-        return v;
-    }
-
-    boolean isBarPulseFaded() {
-        if (mPulse == null) {
-            return false;
-        } else {
-            return mPulse.shouldDrawPulse();
-        }
-    }
-
-    private void updateButtonAlpha() {
-        mCustomAlpha = alphaIntToFloat(Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                Settings.Secure.NAVBAR_BUTTONS_ALPHA, 255, UserHandle.USER_CURRENT));
-        setButtonAlpha();
-    }
-
-    private void setButtonAlpha() {
-        // only set this if pulse is not running. If pulse is running
-        // we will set proper alpha when it ends
-        if (!isBarPulseFaded()) {
-            final View currentNavButtons = getCurrentView().findViewWithTag(Res.Common.NAV_BUTTONS);
-            final View hiddenNavButtons = getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-            final float fadeAlpha = mCustomAlpha;
-            currentNavButtons.setAlpha(fadeAlpha);
-            hiddenNavButtons.setAlpha(fadeAlpha);
-        }
-    }
-
-    private void updatePulseNavButtonsOpacity() {
-        mPulseNavButtonsOpacity = alphaIntToFloat(Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                Settings.Secure.PULSE_CUSTOM_BUTTONS_OPACITY, 200, UserHandle.USER_CURRENT));
-        if (isBarPulseFaded()) {
-            final View currentNavButtons = getCurrentView().findViewWithTag(Res.Common.NAV_BUTTONS);
-            final View hiddenNavButtons = getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-            currentNavButtons.setAlpha(mPulseNavButtonsOpacity);
-            hiddenNavButtons.setAlpha(mPulseNavButtonsOpacity);
-        }
-    }
-
-    @Override
-    public boolean onStartPulse(Animation animatePulseIn) {
-        if (mEditor.getMode() == BaseEditor.MODE_ON) {
-            mEditor.changeEditMode(BaseEditor.MODE_OFF);
-        }
-        final View currentNavButtons = getCurrentView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        final View hiddenNavButtons = getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        final float fadeAlpha = mPulseNavButtonsOpacity;
-
-        // no need to animate the GONE view, but keep alpha inline since onStartPulse
-        // is a oneshot call
-        hiddenNavButtons.setAlpha(fadeAlpha);
-        currentNavButtons.animate()
-                .alpha(fadeAlpha)
-                .setDuration(PULSE_FADE_OUT_DURATION)
-                .setListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(Animator _a) {
-                        // shouldn't be null, mPulse just called into us
-                        if (mPulse != null) {
-                            mPulse.turnOnPulse();
-                        }
-                    }
-                })
-                .start();
-        return true;
-    }
-
-    @Override
-    public void onStopPulse(Animation animatePulseOut) {
-        final View currentNavButtons = getCurrentView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        final View hiddenNavButtons = getHiddenView().findViewWithTag(Res.Common.NAV_BUTTONS);
-        final float fadeAlpha = mCustomAlpha;
-        hiddenNavButtons.setAlpha(fadeAlpha);
-        currentNavButtons.animate()
-                .alpha(fadeAlpha)
-                .setDuration(PULSE_FADE_IN_DURATION)
-                .start();
-    }
-
-    private void updateButtonLongpressDelay() {
-        int systemLpDelay = ViewConfiguration.getLongPressTimeout();
-        int userDelay = Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                Settings.Secure.SMARTBAR_LONGPRESS_DELAY, 0, UserHandle.USER_CURRENT);
-        switch (userDelay) {
-            default:
-                SmartButtonView.setButtonLongpressDelay(systemLpDelay - 100);
-                break;
-            case 1:
-                SmartButtonView.setButtonLongpressDelay(systemLpDelay);
-                break;
-            case 2:
-                SmartButtonView.setButtonLongpressDelay(systemLpDelay + 200);
-                break;
-        }
-    }
-
-    private void updateCustomIconSize() {
-        int iconSize = Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                Settings.Secure.SMARTBAR_CUSTOM_ICON_SIZE, 60, UserHandle.USER_CURRENT);
-        mCustomIconScale = 0.01f * iconSize;
-    }
-}
diff --git a/src/com/android/systemui/navigation/smartbar/SmartButtonRipple.java b/src/com/android/systemui/navigation/smartbar/SmartButtonRipple.java
deleted file mode 100644
index 7f6622e..0000000
--- a/src/com/android/systemui/navigation/smartbar/SmartButtonRipple.java
+++ /dev/null
@@ -1,399 +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.navigation.smartbar;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.CanvasProperty;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.Drawable;
-import android.view.DisplayListCanvas;
-import android.view.RenderNodeAnimator;
-import android.view.View;
-import android.view.animation.Interpolator;
-import android.view.animation.PathInterpolator;
-
-import com.android.internal.utils.du.DUActionUtils;
-import com.android.systemui.R;
-import com.android.systemui.navigation.DarkIntensity;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-public class SmartButtonRipple extends Drawable implements DarkIntensity{
-
-    private static final float GLOW_MAX_SCALE_FACTOR = 1.35f;
-    private static final float GLOW_MAX_ALPHA = 0.2f;
-    private static final float GLOW_MAX_ALPHA_DARK = 0.1f;
-    private static final int ANIMATION_DURATION_SCALE = 350;
-    private static final int ANIMATION_DURATION_FADE = 450;
-
-    private Paint mRipplePaint;
-    private CanvasProperty<Float> mLeftProp;
-    private CanvasProperty<Float> mTopProp;
-    private CanvasProperty<Float> mRightProp;
-    private CanvasProperty<Float> mBottomProp;
-    private CanvasProperty<Float> mRxProp;
-    private CanvasProperty<Float> mRyProp;
-    private CanvasProperty<Paint> mPaintProp;
-    private float mGlowAlpha = 0f;
-    private float mGlowScale = 1f;
-    private boolean mPressed;
-    private boolean mDrawingHardwareGlow;
-    private int mMaxWidth;
-    private boolean mLastDark;
-    private boolean mDark;
-
-    private final Interpolator mInterpolator = new LogInterpolator();
-    private final Interpolator mAlphaExitInterpolator = new PathInterpolator(0.4f, 0f, 1f, 1f);
-    private boolean mSupportHardware;
-    private final View mTargetView;
-
-    private final HashSet<Animator> mRunningAnimations = new HashSet<>();
-    private final ArrayList<Animator> mTmpArray = new ArrayList<>();
-
-    private int mRippleColor;
-    private boolean mEnabled;
-
-    public SmartButtonRipple(Context ctx, View targetView) {
-        final Context context = ctx;
-        mMaxWidth = context.getResources().getDimensionPixelSize(R.dimen.key_button_ripple_max_width);
-        mTargetView = targetView;
-        mRippleColor = context.getResources().getColor(R.color.navbutton_ripple_color);
-    }
-
-    public void setDarkIntensity(float darkIntensity) {
-        mDark = darkIntensity >= 0.5f;
-    }
-
-    private Paint getRipplePaint() {
-        if (mRipplePaint == null) {
-            mRipplePaint = new Paint();
-            mRipplePaint.setAntiAlias(true);
-            mRipplePaint.setColor(mLastDark ? 0xff000000 : mRippleColor);
-        }
-        return mRipplePaint;
-    }
-
-    private void drawSoftware(Canvas canvas) {
-        if (mGlowAlpha > 0f) {
-            final Paint p = getRipplePaint();
-            p.setAlpha((int)(mGlowAlpha * 255f));
-
-            final float w = getBounds().width();
-            final float h = getBounds().height();
-            final boolean horizontal = w > h;
-            final float diameter = getRippleSize() * mGlowScale;
-            final float radius = diameter * .5f;
-            final float cx = w * .5f;
-            final float cy = h * .5f;
-            final float rx = horizontal ? radius : cx;
-            final float ry = horizontal ? cy : radius;
-            final float corner = horizontal ? cy : cx;
-
-            canvas.drawRoundRect(cx - rx, cy - ry,
-                    cx + rx, cy + ry,
-                    corner, corner, p);
-        }
-    }
-
-    public void setEnabled(boolean enabled) {
-        mEnabled = enabled;
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        if (mEnabled) {
-            mSupportHardware = canvas.isHardwareAccelerated();
-            if (mSupportHardware) {
-                drawHardware((DisplayListCanvas) canvas);
-            } else {
-                drawSoftware(canvas);
-            }
-        }
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        // Not supported.
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter colorFilter) {
-        // Not supported.
-    }
-
-    @Override
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    private boolean isHorizontal() {
-        return getBounds().width() > getBounds().height();
-    }
-
-    private void drawHardware(DisplayListCanvas c) {
-        if (mDrawingHardwareGlow) {
-            c.drawRoundRect(mLeftProp, mTopProp, mRightProp, mBottomProp, mRxProp, mRyProp,
-                    mPaintProp);
-        }
-    }
-
-    public float getGlowAlpha() {
-        return mGlowAlpha;
-    }
-
-    public void setGlowAlpha(float x) {
-        mGlowAlpha = x;
-        invalidateSelf();
-    }
-
-    public float getGlowScale() {
-        return mGlowScale;
-    }
-
-    public void setGlowScale(float x) {
-        mGlowScale = x;
-        invalidateSelf();
-    }
-
-    private float getMaxGlowAlpha() {
-        return mLastDark ? GLOW_MAX_ALPHA_DARK : GLOW_MAX_ALPHA;
-    }
-
-    @Override
-    protected boolean onStateChange(int[] state) {
-        boolean pressed = false;
-        for (int i = 0; i < state.length; i++) {
-            if (state[i] == android.R.attr.state_pressed) {
-                pressed = true;
-                break;
-            }
-        }
-        if (pressed != mPressed) {
-            setPressed(pressed);
-            mPressed = pressed;
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public void jumpToCurrentState() {
-        cancelAnimations();
-    }
-
-    @Override
-    public boolean isStateful() {
-        return true;
-    }
-
-    @Override
-    public boolean hasFocusStateSpecified() {
-        return true;
-    }
-
-    public void setPressed(boolean pressed) {
-        if (mDark != mLastDark && pressed) {
-            mRipplePaint = null;
-            mLastDark = mDark;
-        }
-        if (mSupportHardware) {
-            setPressedHardware(pressed);
-        } else {
-            setPressedSoftware(pressed);
-        }
-    }
-
-    private void cancelAnimations() {
-        mTmpArray.addAll(mRunningAnimations);
-        int size = mTmpArray.size();
-        for (int i = 0; i < size; i++) {
-            Animator a = mTmpArray.get(i);
-            a.cancel();
-        }
-        mTmpArray.clear();
-        mRunningAnimations.clear();
-    }
-
-    private void setPressedSoftware(boolean pressed) {
-        if (pressed) {
-            enterSoftware();
-        } else {
-            exitSoftware();
-        }
-    }
-
-    private void enterSoftware() {
-        cancelAnimations();
-        mGlowAlpha = getMaxGlowAlpha();
-        ObjectAnimator scaleAnimator = ObjectAnimator.ofFloat(this, "glowScale",
-                0f, GLOW_MAX_SCALE_FACTOR);
-        scaleAnimator.setInterpolator(mInterpolator);
-        scaleAnimator.setDuration(ANIMATION_DURATION_SCALE);
-        scaleAnimator.addListener(mAnimatorListener);
-        scaleAnimator.start();
-        mRunningAnimations.add(scaleAnimator);
-    }
-
-    private void exitSoftware() {
-        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(this, "glowAlpha", mGlowAlpha, 0f);
-        alphaAnimator.setInterpolator(mAlphaExitInterpolator);
-        alphaAnimator.setDuration(ANIMATION_DURATION_FADE);
-        alphaAnimator.addListener(mAnimatorListener);
-        alphaAnimator.start();
-        mRunningAnimations.add(alphaAnimator);
-    }
-
-    private void setPressedHardware(boolean pressed) {
-        if (pressed) {
-            enterHardware();
-        } else {
-            exitHardware();
-        }
-    }
-
-    /**
-     * Sets the left/top property for the round rect to {@code prop} depending on whether we are
-     * horizontal or vertical mode.
-     */
-    private void setExtendStart(CanvasProperty<Float> prop) {
-        if (isHorizontal()) {
-            mLeftProp = prop;
-        } else {
-            mTopProp = prop;
-        }
-    }
-
-    private CanvasProperty<Float> getExtendStart() {
-        return isHorizontal() ? mLeftProp : mTopProp;
-    }
-
-    /**
-     * Sets the right/bottom property for the round rect to {@code prop} depending on whether we are
-     * horizontal or vertical mode.
-     */
-    private void setExtendEnd(CanvasProperty<Float> prop) {
-        if (isHorizontal()) {
-            mRightProp = prop;
-        } else {
-            mBottomProp = prop;
-        }
-    }
-
-    private CanvasProperty<Float> getExtendEnd() {
-        return isHorizontal() ? mRightProp : mBottomProp;
-    }
-
-    private int getExtendSize() {
-        return isHorizontal() ? getBounds().width() : getBounds().height();
-    }
-
-    private int getRippleSize() {
-        int size = isHorizontal() ? getBounds().width() : getBounds().height();
-        return Math.min(size, mMaxWidth);
-    }
-
-    private void enterHardware() {
-        cancelAnimations();
-        mDrawingHardwareGlow = true;
-        setExtendStart(CanvasProperty.createFloat(getExtendSize() / 2));
-        final RenderNodeAnimator startAnim = new RenderNodeAnimator(getExtendStart(),
-                getExtendSize()/2 - GLOW_MAX_SCALE_FACTOR * getRippleSize()/2);
-        startAnim.setDuration(ANIMATION_DURATION_SCALE);
-        startAnim.setInterpolator(mInterpolator);
-        startAnim.addListener(mAnimatorListener);
-        startAnim.setTarget(mTargetView);
-
-        setExtendEnd(CanvasProperty.createFloat(getExtendSize() / 2));
-        final RenderNodeAnimator endAnim = new RenderNodeAnimator(getExtendEnd(),
-                getExtendSize()/2 + GLOW_MAX_SCALE_FACTOR * getRippleSize()/2);
-        endAnim.setDuration(ANIMATION_DURATION_SCALE);
-        endAnim.setInterpolator(mInterpolator);
-        endAnim.addListener(mAnimatorListener);
-        endAnim.setTarget(mTargetView);
-
-        if (isHorizontal()) {
-            mTopProp = CanvasProperty.createFloat(0f);
-            mBottomProp = CanvasProperty.createFloat(getBounds().height());
-            mRxProp = CanvasProperty.createFloat(getBounds().height()/2);
-            mRyProp = CanvasProperty.createFloat(getBounds().height()/2);
-        } else {
-            mLeftProp = CanvasProperty.createFloat(0f);
-            mRightProp = CanvasProperty.createFloat(getBounds().width());
-            mRxProp = CanvasProperty.createFloat(getBounds().width()/2);
-            mRyProp = CanvasProperty.createFloat(getBounds().width()/2);
-        }
-
-        mGlowScale = GLOW_MAX_SCALE_FACTOR;
-        mGlowAlpha = getMaxGlowAlpha();
-        mRipplePaint = getRipplePaint();
-        mRipplePaint.setAlpha((int) (mGlowAlpha * 255));
-        mPaintProp = CanvasProperty.createPaint(mRipplePaint);
-
-        startAnim.start();
-        endAnim.start();
-        mRunningAnimations.add(startAnim);
-        mRunningAnimations.add(endAnim);
-
-        invalidateSelf();
-    }
-
-    private void exitHardware() {
-        mPaintProp = CanvasProperty.createPaint(getRipplePaint());
-        final RenderNodeAnimator opacityAnim = new RenderNodeAnimator(mPaintProp,
-                RenderNodeAnimator.PAINT_ALPHA, 0);
-        opacityAnim.setDuration(ANIMATION_DURATION_FADE);
-        opacityAnim.setInterpolator(mAlphaExitInterpolator);
-        opacityAnim.addListener(mAnimatorListener);
-        opacityAnim.setTarget(mTargetView);
-
-        opacityAnim.start();
-        mRunningAnimations.add(opacityAnim);
-
-        invalidateSelf();
-    }
-
-    private final AnimatorListenerAdapter mAnimatorListener =
-            new AnimatorListenerAdapter() {
-        @Override
-        public void onAnimationEnd(Animator animation) {
-            mRunningAnimations.remove(animation);
-            if (mRunningAnimations.isEmpty() && !mPressed) {
-                mDrawingHardwareGlow = false;
-                invalidateSelf();
-            }
-        }
-    };
-
-    /**
-     * Interpolator with a smooth log deceleration
-     */
-    private static final class LogInterpolator implements Interpolator {
-        @Override
-        public float getInterpolation(float input) {
-            return 1 - (float) Math.pow(400, -input * 1.4);
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/smartbar/SmartButtonView.java b/src/com/android/systemui/navigation/smartbar/SmartButtonView.java
deleted file mode 100644
index d2ec8ac..0000000
--- a/src/com/android/systemui/navigation/smartbar/SmartButtonView.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/**
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.navigation.smartbar;
-
-import com.android.systemui.navigation.smartbar.SmartBarView;
-import com.android.systemui.navigation.smartbar.SmartButtonRipple;
-import com.android.systemui.navigation.OpaLayout;
-import com.android.internal.utils.du.ActionHandler;
-import com.android.internal.utils.du.Config.ActionConfig;
-import com.android.internal.utils.du.Config.ButtonConfig;
-import com.android.systemui.navigation.Res;
-
-import android.animation.ObjectAnimator;
-import android.app.ActivityManager;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.os.Handler;
-import android.os.Looper;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-//import android.content.res.ThemeConfig;
-import android.view.HapticFeedbackConstants;
-import android.view.MotionEvent;
-import android.view.SoundEffectConstants;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.OvershootInterpolator;
-import android.widget.ImageView;
-
-public class SmartButtonView extends ImageView {
-    private static final String TAG = "StatusBar.KeyButtonView";
-    private static final boolean DEBUG = false;
-
-    // AOSP values feel rather slow, shave off some slack
-    // changing double tap timeout also affects single tap
-    // so we can't play so much with it
-    private static final int DT_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
-    private static int sDoubleTapTimeout = DT_TIMEOUT - 100;
-
-    private static int sLongPressTimeout;
-
-    public static final int ANIM_STYLE_RIPPLE = 0;
-    public static final int ANIM_STYLE_FLIP = 2;
-    public static final int ANIM_STYLE_PIXEL = 3;
-    public static final int ANIM_STYLE_PIXEL_HOME = 4;
-    public static final int ANIM_STYLE_PIXEL_HOME_RIPPLE = 5;
-
-    private boolean isDoubleTapPending;
-    private boolean wasConsumed;
-    private boolean mInEditMode;
-    private int mAnimStyle = 0;
-    private ObjectAnimator mFlipAnim = null;
-    private ButtonConfig mConfig;
-    private SmartBarView mHost;
-
-    private boolean mIsRippleEnabled;
-
-    static AudioManager mAudioManager;
-    static AudioManager getAudioManager(Context context) {
-        if (mAudioManager == null)
-            mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-        return mAudioManager;
-    }
-
-    public SmartButtonView(Context context) {
-        this(context, null);
-    }
-
-    public SmartButtonView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public SmartButtonView(Context context, AttributeSet attrs, int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public SmartButtonView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        setClickable(true);
-        setLongClickable(false);
-        mAudioManager = getAudioManager(context);
-    }
-
-    public void setHost(SmartBarView host) {
-        mHost = host;
-    }
-
-    public void setAnimationStyle(int style) {
-        mAnimStyle = style;
-        switch (style) {
-            case ANIM_STYLE_RIPPLE:
-                setPixelEnabled(false, false, false);
-                setRippleEnabled(true);
-                mFlipAnim = null;
-                break;
-            case ANIM_STYLE_FLIP:
-                setPixelEnabled(false, false, false);
-                setRippleEnabled(false);
-                break;
-            case ANIM_STYLE_PIXEL:
-                setPixelEnabled(true, false, false);
-                setRippleEnabled(false);
-                mFlipAnim = null;
-                break;
-            case ANIM_STYLE_PIXEL_HOME:
-                setPixelEnabled(true, true, false);
-                setRippleEnabled(false);
-                mFlipAnim = null;
-                break;
-            case ANIM_STYLE_PIXEL_HOME_RIPPLE:
-                setPixelEnabled(true, true, true);
-                mFlipAnim = null;
-                break;
-        }
-    }
-
-    public void setPixelEnabled(boolean enabled, boolean homeOnly, boolean rippleForOthers) {
-        if (getParent() != null && getParent() instanceof OpaLayout) {
-            OpaLayout opa = (OpaLayout)getParent();
-            opa.setOpaEnabled(enabled);
-            if (enabled) {
-                boolean isHomeButton = TextUtils.equals(mConfig.getTag(), Res.Softkey.BUTTON_HOME);
-                if (!rippleForOthers) {
-                    opa.setOpaVisibilityHome(homeOnly, isHomeButton);
-                } else {
-                    if (isHomeButton) {
-                        opa.setOpaVisibilityHome(homeOnly, isHomeButton);
-                    } else {
-                        opa.setOpaEnabled(!enabled);
-                        setRippleEnabled(enabled);
-                    }
-                }
-            }
-        }
-    }
-
-    private void setRippleEnabled(boolean enabled) {
-        mIsRippleEnabled = enabled;
-        if (getBackground() != null && getBackground() instanceof SmartButtonRipple) {
-            ((SmartButtonRipple) getBackground()).setEnabled(enabled);
-        }
-    }
-
-    public void setRippleDarkIntensity(float darkIntensity) {
-        if (mIsRippleEnabled && getBackground() != null && getBackground() instanceof SmartButtonRipple) {
-            ((SmartButtonRipple) getBackground()).setDarkIntensity(darkIntensity);
-        }
-    }
-
-    private void fireActionIfSecure(String action) {
-        final boolean keyguardShowing = mHost.isKeyguardShowing();
-        if (!keyguardShowing
-                || (keyguardShowing && ActionHandler.SYSTEMUI_TASK_BACK.equals(action))) {
-            if (ActionHandler.SYSTEMUI_TASK_ROTATION.equals(action)) {
-                mHost.rotate();
-            } else {
-                ActionHandler.performTask(mContext, action);
-            }
-        }
-    }
-
-    public void loadRipple() {
-        setBackground(new SmartButtonRipple(mContext, this));
-    }
-
-    public void setEditMode(boolean editMode) {
-        mInEditMode = editMode;
-        if (getParent() != null && getParent() instanceof OpaLayout) {
-            OpaLayout opa = (OpaLayout)getParent();
-            opa.setEditMode(editMode);
-        }
-    }
-
-    public void setButtonConfig(ButtonConfig config) {
-        mConfig = config;
-        setTag(config.getTag());
-        setLongClickable(hasLongAction());
-    }
-
-    private boolean hasSingleAction() {
-        return mConfig != null && !mConfig.getActionConfig(ActionConfig.PRIMARY).hasNoAction();
-    }
-
-    private boolean hasLongAction() {
-        return mConfig != null && !mConfig.getActionConfig(ActionConfig.SECOND).hasNoAction();
-    }
-
-    private boolean hasDoubleAction() {
-        return mConfig != null && !mConfig.getActionConfig(ActionConfig.THIRD).hasNoAction();
-    }
-
-    private boolean hasRecentAction() {
-        return hasRecentsSingle() || hasRecentsLong() || hasRecentsDouble();
-    }
-
-    private boolean hasRecentsSingle() {
-        return mConfig != null && mConfig.getActionConfig(ActionConfig.PRIMARY).isActionRecents();
-    }
-
-    private boolean hasRecentsLong() {
-        return mConfig != null && mConfig.getActionConfig(ActionConfig.SECOND).isActionRecents();
-    }
-
-    private boolean hasRecentsDouble() {
-        return mConfig != null && mConfig.getActionConfig(ActionConfig.THIRD).isActionRecents();
-    }
-
-    private boolean isImeLeftArrowButton() {
-        final String action = mConfig.getActionConfig(ActionConfig.PRIMARY).getAction();
-        return "task_ime_navigation_left".equals(action);
-    }
-
-    private boolean isImeRightArrowButton() {
-        final String action = mConfig.getActionConfig(ActionConfig.PRIMARY).getAction();
-        return "task_ime_navigation_right".equals(action);
-    }
-
-    public ButtonConfig getButtonConfig() {
-        return mConfig;
-    }
-
-    private boolean mIsEmptyFakeButton() {
-        return !hasSingleAction()
-                && !hasLongAction()
-                && !hasDoubleAction();
-    }
-
-    // special case: double tap for screen off we never capture up motion event
-    // add/remove listeners if screen on/off
-    public void onScreenStateChanged(boolean screenOn) {
-        wasConsumed = false;
-        setPressed(false);
-    }
-
-    private void checkAndDoFlipAnim() {
-        if (mAnimStyle == ANIM_STYLE_FLIP) {
-            mFlipAnim = ObjectAnimator.ofFloat(this, "rotationY", 0f, 360f);
-            mFlipAnim.setDuration(1500);
-            mFlipAnim.setInterpolator(new OvershootInterpolator());
-            mFlipAnim.start();
-        }
-    }
-
-    public boolean onTouchEvent(MotionEvent ev) {
-        if (mIsEmptyFakeButton())
-                return false;
-
-        OpaLayout opa = null;
-        if (getParent() != null && getParent() instanceof OpaLayout) {
-            opa = (OpaLayout)getParent();
-        }
-        if (mInEditMode) {
-            return false;
-        }
-
-        final int action = ev.getAction();
-        boolean imeLeft = mConfig != null && isImeLeftArrowButton();
-        boolean imeRight = mConfig != null && isImeRightArrowButton();
-        switch (action) {
-            case MotionEvent.ACTION_DOWN:
-                setPressed(true);
-                if (opa != null) {
-                    opa.startDownAction();
-                }
-                checkAndDoFlipAnim();
-                performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
-                playSoundEffect(SoundEffectConstants.CLICK);
-                if (imeLeft || imeRight) {
-                    moveKbCursor(imeRight, true);
-                } else if (isDoubleTapPending) {
-                    isDoubleTapPending = false;
-                    wasConsumed = true;
-                    removeCallbacks(mDoubleTapTimeout);
-                    doDoubleTap();
-                } else {
-                    wasConsumed = false;
-                    if (hasRecentAction()) {
-                        ActionHandler.preloadRecentApps();
-                    }
-                    if (hasLongAction()) {
-                        removeCallbacks(mCheckLongPress);
-                        postDelayed(mCheckLongPress, sLongPressTimeout);
-                    }
-                }
-                break;
-            case MotionEvent.ACTION_CANCEL:
-                if (hasLongAction()) {
-                    removeCallbacks(mCheckLongPress);
-                }
-                removeCallbacks(mDoubleTapTimeout);
-                wasConsumed = true;
-                isDoubleTapPending = false;
-                setPressed(false); // this will stop also the ime arrows handler
-                if (opa != null) {
-                    opa.startCancelAction();
-                }
-                break;
-            case MotionEvent.ACTION_UP:
-                setPressed(false);
-                checkAndDoFlipAnim();
-                if (opa != null) {
-                    opa.startCancelAction();
-                }
-                if (hasLongAction()) {
-                    removeCallbacks(mCheckLongPress);
-                }
-                if (hasDoubleAction()) {
-                    if (wasConsumed) {
-                        wasConsumed = false;
-                        return true;
-                    }
-                    isDoubleTapPending = true;
-                    postDelayed(mDoubleTapTimeout, sDoubleTapTimeout);
-                } else {
-                    if (!imeLeft && !imeRight && !wasConsumed && hasSingleAction()) {
-                        doSinglePress();
-                    }
-                }
-                break;
-        }
-        return true;
-    }
-
-    private void moveKbCursor(boolean right, boolean firstTrigger) {
-        ActionHandler.performTask(mContext, right ? ActionHandler.SYSTEMUI_TASK_IME_NAVIGATION_RIGHT
-                : ActionHandler.SYSTEMUI_TASK_IME_NAVIGATION_LEFT);
-        final Handler handler = new Handler(Looper.getMainLooper());
-        final Runnable r = new Runnable() {
-            @Override
-            public void run() {
-                if (isPressed()) {
-                    moveKbCursor(right, false);
-                }
-            }
-        };
-        if (isPressed()) {
-            handler.postDelayed(r, firstTrigger ? 500 : 250);
-        }
-    }
-
-    private void doSinglePress() {
-        isDoubleTapPending = false;
-        if (mConfig != null) {
-            String action = mConfig.getActionConfig(ActionConfig.PRIMARY).getAction();
-            fireActionIfSecure(action);
-            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
-        }
-    }
-
-    private void doLongPress() {
-        isDoubleTapPending = false;
-        wasConsumed = true;
-        if (mConfig != null) {
-            String action = mConfig.getActionConfig(ActionConfig.SECOND).getAction();
-            fireActionIfSecure(action);
-            performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
-            playSoundEffect(SoundEffectConstants.CLICK);
-            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
-        }
-    }
-
-    private void doDoubleTap() {
-        isDoubleTapPending = false;
-        wasConsumed = true;
-        if (mConfig != null) {
-            String action = mConfig.getActionConfig(ActionConfig.THIRD).getAction();
-            fireActionIfSecure(action);
-        }
-    }
-
-    private Runnable mDoubleTapTimeout = new Runnable() {
-        @Override
-        public void run() {
-            wasConsumed = false;
-            isDoubleTapPending = false;
-            doSinglePress();
-        }
-    };
-
-    private Runnable mCheckLongPress = new Runnable() {
-        public void run() {
-            if (isPressed()) {
-                wasConsumed = true;
-                isDoubleTapPending = false;
-                removeCallbacks(mDoubleTapTimeout);
-                doLongPress();
-            }
-        }
-    };
-
-    public void playSoundEffect(int soundConstant) {
-        mAudioManager.playSoundEffect(soundConstant, ActivityManager.getCurrentUser());
-    };
-
-    protected static void setButtonLongpressDelay(int delay) {
-        sLongPressTimeout = delay;
-    }
-}
diff --git a/src/com/android/systemui/navigation/utils/SmartObserver.java b/src/com/android/systemui/navigation/utils/SmartObserver.java
deleted file mode 100644
index b0500f6..0000000
--- a/src/com/android/systemui/navigation/utils/SmartObserver.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Copyright (C) 2016 The DirtyUnicorns Project
- * 
- * @author: Randall Rushing <randall.rushing@gmail.com>
- *
- * 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.
- *
- * A simple, semi-pojo ContentObserver subclass to eliminate too many observers
- * in too many places. A class implementing SmartObservable simply provides
- * the desired uris as a set to observe and handles onChange(Uri uri) as normal
- *
- */
-
-package com.android.systemui.navigation.utils;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import android.content.ContentResolver;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.text.TextUtils;
-
-public class SmartObserver extends ContentObserver {
-    public interface SmartObservable {
-        public Set<Uri> onGetUris();
-        public void onChange(Uri uri);
-    }
-
-    private ContentResolver mResolver;
-    private Set<SmartObservable> mListeners = new HashSet<SmartObservable>();
-
-    public SmartObserver(Handler handler, ContentResolver resolver) {
-        super(handler);
-        mResolver = resolver;
-    }
-
-    public void addListener(SmartObservable listener) {
-        if (listener != null) {
-            mListeners.add(listener);
-            for (Uri uri : listener.onGetUris()) {
-                mResolver.registerContentObserver(uri, false, this, UserHandle.USER_ALL);
-            }
-        }
-    }
-
-    /**
-     * Just in case the ContentObserver is unregistered
-     * but we want to keep callbacks registered
-     */
-    public void registerListeners() {
-        for (SmartObservable listener : mListeners) {
-            for (Uri uriz : listener.onGetUris()) {
-                mResolver.registerContentObserver(uriz, false, this, UserHandle.USER_ALL);
-            }
-        }
-    }
-
-    public void cleanUp() {
-        mListeners.clear();
-        mResolver.unregisterContentObserver(this);
-    }
-
-    @Override
-    public void onChange(boolean selfChange, Uri uri) {
-        for (SmartObservable listener : mListeners) {
-            for (Uri uriz : listener.onGetUris()) {
-                if (TextUtils.equals(uriz.toString(), uri.toString())) {
-                    listener.onChange(uri);
-                }
-            }
-        }
-    }
-}
diff --git a/src/com/android/systemui/navigation/pulse/FadingBlockRenderer.java b/src/com/android/systemui/pulse/FadingBlockRenderer.java
similarity index 85%
rename from src/com/android/systemui/navigation/pulse/FadingBlockRenderer.java
rename to src/com/android/systemui/pulse/FadingBlockRenderer.java
index b37b882..3219cb1 100644
--- a/src/com/android/systemui/navigation/pulse/FadingBlockRenderer.java
+++ b/src/com/android/systemui/pulse/FadingBlockRenderer.java
@@ -14,7 +14,7 @@
  *
  */
 
-package com.android.systemui.navigation.pulse;
+package com.android.systemui.pulse;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -36,8 +36,8 @@
 
 import com.android.internal.util.NotificationColorUtil;
 import com.android.systemui.R;
-import com.android.systemui.navigation.pulse.PulseController.PulseObserver;
-import com.android.systemui.navigation.utils.ColorAnimator;
+import com.android.systemui.pulse.PulseController.PulseObserver;
+import com.android.systemui.utils.ColorAnimator;
 
 public class FadingBlockRenderer extends Renderer implements ColorAnimator.ColorAnimationListener {
     //private static final int DEF_PAINT_ALPHA = (byte) 188;
@@ -201,35 +201,35 @@
         void register() {
             ContentResolver resolver = mContext.getContentResolver();
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.FLING_PULSE_COLOR), false, this,
+                    Settings.System.getUriFor(Settings.System.FLING_PULSE_COLOR), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.FLING_PULSE_LAVALAMP_ENABLED), false,
+                    Settings.System.getUriFor(Settings.System.FLING_PULSE_LAVALAMP_ENABLED), false,
                     this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.FLING_PULSE_LAVALAMP_SPEED), false,
+                    Settings.System.getUriFor(Settings.System.FLING_PULSE_LAVALAMP_SPEED), false,
                     this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_CUSTOM_DIMEN), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_CUSTOM_DIMEN), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_CUSTOM_DIV), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_CUSTOM_DIV), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_FILLED_BLOCK_SIZE), false,
+                    Settings.System.getUriFor(Settings.System.PULSE_FILLED_BLOCK_SIZE), false,
                     this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_EMPTY_BLOCK_SIZE), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_EMPTY_BLOCK_SIZE), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_CUSTOM_FUDGE_FACTOR), false,
+                    Settings.System.getUriFor(Settings.System.PULSE_CUSTOM_FUDGE_FACTOR), false,
                     this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_AUTO_COLOR), false,
+                    Settings.System.getUriFor(Settings.System.PULSE_AUTO_COLOR), false,
                     this,
                     UserHandle.USER_ALL);
         }
@@ -243,23 +243,23 @@
             ContentResolver resolver = mContext.getContentResolver();
             final Resources res = mContext.getResources();
 
-            mAutoColor = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_AUTO_COLOR, 0,
+            mAutoColor = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_AUTO_COLOR, 0,
                     UserHandle.USER_CURRENT) == 1;
 
-            mLavaLampEnabled = !mAutoColor && Settings.Secure.getIntForUser(resolver,
-                    Settings.Secure.FLING_PULSE_LAVALAMP_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
+            mLavaLampEnabled = !mAutoColor && Settings.System.getIntForUser(resolver,
+                    Settings.System.FLING_PULSE_LAVALAMP_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
 
-            mUserColor = Settings.Secure.getIntForUser(resolver,
-                    Settings.Secure.FLING_PULSE_COLOR,
+            mUserColor = Settings.System.getIntForUser(resolver,
+                    Settings.System.FLING_PULSE_COLOR,
                     mContext.getResources().getColor(R.color.config_pulseFillColor),
                     UserHandle.USER_CURRENT);
             if (!mLavaLampEnabled) {
                 int lastColor = mController.getAlbumArtColor();
                 mPaint.setColor(mAutoColor && lastColor != -1 ? lastColor : mUserColor);
             }
-            int time = Settings.Secure.getIntForUser(resolver,
-                    Settings.Secure.FLING_PULSE_LAVALAMP_SPEED, 10000,
+            int time = Settings.System.getIntForUser(resolver,
+                    Settings.System.FLING_PULSE_LAVALAMP_SPEED, 10000,
                     UserHandle.USER_CURRENT);
             mLavaLamp.setAnimationTime(time);
             if (mLavaLampEnabled && mIsValidStream) {
@@ -267,20 +267,20 @@
             } else {
                 mLavaLamp.stop();
             }
-            int emptyBlock = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_EMPTY_BLOCK_SIZE, 1,
+            int emptyBlock = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_EMPTY_BLOCK_SIZE, 1,
                     UserHandle.USER_CURRENT);
-            int customDimen = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_CUSTOM_DIMEN, 14,
+            int customDimen = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_CUSTOM_DIMEN, 14,
                     UserHandle.USER_CURRENT);
-            int numDivision = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_CUSTOM_DIV, 16,
+            int numDivision = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_CUSTOM_DIV, 16,
                     UserHandle.USER_CURRENT);
-            int fudgeFactor = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_CUSTOM_FUDGE_FACTOR, 4,
+            int fudgeFactor = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_CUSTOM_FUDGE_FACTOR, 4,
                     UserHandle.USER_CURRENT);
-            int filledBlock = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_FILLED_BLOCK_SIZE, 4,
+            int filledBlock = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_FILLED_BLOCK_SIZE, 4,
                     UserHandle.USER_CURRENT);
 
             mPathEffect1 = getLimitedDimenValue(filledBlock, 4, 8, res);
diff --git a/src/com/android/systemui/navigation/pulse/PulseController.java b/src/com/android/systemui/pulse/PulseController.java
similarity index 94%
rename from src/com/android/systemui/navigation/pulse/PulseController.java
rename to src/com/android/systemui/pulse/PulseController.java
index c69cd39..2df65ce 100644
--- a/src/com/android/systemui/navigation/pulse/PulseController.java
+++ b/src/com/android/systemui/pulse/PulseController.java
@@ -22,9 +22,9 @@
  *
  */
 
-package com.android.systemui.navigation.pulse;
+package com.android.systemui.pulse;
 
-import com.android.systemui.navigation.pulse.PulseController;
+import com.android.systemui.pulse.PulseController;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -149,19 +149,19 @@
 
         void register() {
             mContext.getContentResolver().registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.FLING_PULSE_ENABLED), false, this,
+                    Settings.System.getUriFor(Settings.System.FLING_PULSE_ENABLED), false, this,
                     UserHandle.USER_ALL);
             mContext.getContentResolver().registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_RENDER_STYLE_URI), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_RENDER_STYLE_URI), false, this,
                     UserHandle.USER_ALL);
         }
 
         @Override
         public void onChange(boolean selfChange, Uri uri) {
-            if (uri.equals(Settings.Secure.getUriFor(Settings.Secure.FLING_PULSE_ENABLED))) {
+            if (uri.equals(Settings.System.getUriFor(Settings.System.FLING_PULSE_ENABLED))) {
                 updateEnabled();
                 doLinkage();
-            } else if (uri.equals(Settings.Secure.getUriFor(Settings.Secure.PULSE_RENDER_STYLE_URI))) {
+            } else if (uri.equals(Settings.System.getUriFor(Settings.System.PULSE_RENDER_STYLE_URI))) {
                 updateRenderMode();
                 if (mPulseObserver != null) {
                     loadRenderer();
@@ -175,13 +175,13 @@
         }
 
         void updateEnabled() {
-            mPulseEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                    Settings.Secure.FLING_PULSE_ENABLED, 0, UserHandle.USER_CURRENT) == 1;
+            mPulseEnabled = Settings.System.getIntForUser(mContext.getContentResolver(),
+                    Settings.System.FLING_PULSE_ENABLED, 0, UserHandle.USER_CURRENT) == 1;
         }
 
         void updateRenderMode() {
-            mPulseStyle = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                    Settings.Secure.PULSE_RENDER_STYLE_URI, RENDER_STYLE_CM, UserHandle.USER_CURRENT);
+            mPulseStyle = Settings.System.getIntForUser(mContext.getContentResolver(),
+                    Settings.System.PULSE_RENDER_STYLE_URI, RENDER_STYLE_CM, UserHandle.USER_CURRENT);
         }
     };
 
diff --git a/src/com/android/systemui/navigation/pulse/Renderer.java b/src/com/android/systemui/pulse/Renderer.java
similarity index 94%
rename from src/com/android/systemui/navigation/pulse/Renderer.java
rename to src/com/android/systemui/pulse/Renderer.java
index 09bcff8..b64ce60 100644
--- a/src/com/android/systemui/navigation/pulse/Renderer.java
+++ b/src/com/android/systemui/pulse/Renderer.java
@@ -19,9 +19,9 @@
  *
  */
 
-package com.android.systemui.navigation.pulse;
+package com.android.systemui.pulse;
 
-import com.android.systemui.navigation.pulse.PulseController.PulseObserver;
+import com.android.systemui.pulse.PulseController.PulseObserver;
 
 import android.content.Context;
 import android.graphics.Canvas;
diff --git a/src/com/android/systemui/navigation/pulse/SolidLineRenderer.java b/src/com/android/systemui/pulse/SolidLineRenderer.java
similarity index 87%
rename from src/com/android/systemui/navigation/pulse/SolidLineRenderer.java
rename to src/com/android/systemui/pulse/SolidLineRenderer.java
index ec93e1e..9cd30a0 100644
--- a/src/com/android/systemui/navigation/pulse/SolidLineRenderer.java
+++ b/src/com/android/systemui/pulse/SolidLineRenderer.java
@@ -20,7 +20,7 @@
  *
  */
 
-package com.android.systemui.navigation.pulse;
+package com.android.systemui.pulse;
 
 import android.animation.ValueAnimator;
 import android.content.ContentResolver;
@@ -37,8 +37,8 @@
 import android.provider.Settings;
 
 import com.android.internal.util.NotificationColorUtil;
-import com.android.systemui.navigation.pulse.PulseController.PulseObserver;
-import com.android.systemui.navigation.utils.ColorAnimator;
+import com.android.systemui.pulse.PulseController.PulseObserver;
+import com.android.systemui.utils.ColorAnimator;
 
 public class SolidLineRenderer extends Renderer implements ColorAnimator.ColorAnimationListener {
     private Paint mPaint;
@@ -234,26 +234,26 @@
         void register() {
             ContentResolver resolver = mContext.getContentResolver();
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.FLING_PULSE_COLOR), false, this,
+                    Settings.System.getUriFor(Settings.System.FLING_PULSE_COLOR), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.FLING_PULSE_LAVALAMP_ENABLED), false,
+                    Settings.System.getUriFor(Settings.System.FLING_PULSE_LAVALAMP_ENABLED), false,
                     this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_SOLID_FUDGE_FACTOR), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_SOLID_FUDGE_FACTOR), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_LAVALAMP_SOLID_SPEED), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_LAVALAMP_SOLID_SPEED), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_SOLID_UNITS_COUNT), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_SOLID_UNITS_COUNT), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_SOLID_UNITS_OPACITY), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_SOLID_UNITS_OPACITY), false, this,
                     UserHandle.USER_ALL);
             resolver.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.PULSE_AUTO_COLOR), false, this,
+                    Settings.System.getUriFor(Settings.System.PULSE_AUTO_COLOR), false, this,
                     UserHandle.USER_ALL);
         }
 
@@ -265,23 +265,23 @@
         public void updateSettings() {
             ContentResolver resolver = mContext.getContentResolver();
 
-            mAutoColor = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_AUTO_COLOR, 0,
+            mAutoColor = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_AUTO_COLOR, 0,
                     UserHandle.USER_CURRENT) == 1;
 
-            mLavaLampEnabled = !mAutoColor && Settings.Secure.getIntForUser(resolver,
-                    Settings.Secure.FLING_PULSE_LAVALAMP_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
+            mLavaLampEnabled = !mAutoColor && Settings.System.getIntForUser(resolver,
+                    Settings.System.FLING_PULSE_LAVALAMP_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
 
-            mColor = Settings.Secure.getIntForUser(resolver,
-                    Settings.Secure.FLING_PULSE_COLOR,
+            mColor = Settings.System.getIntForUser(resolver,
+                    Settings.System.FLING_PULSE_COLOR,
                     Color.WHITE,
                     UserHandle.USER_CURRENT);
             if (!mLavaLampEnabled) {
                 int lastColor = mController.getAlbumArtColor();
                 mPaint.setColor(mAutoColor && lastColor != -1 ? lastColor : mColor);
             }
-            int lavaLampSpeed = Settings.Secure.getIntForUser(resolver,
-                    Settings.Secure.PULSE_LAVALAMP_SOLID_SPEED, 10 * 1000,
+            int lavaLampSpeed = Settings.System.getIntForUser(resolver,
+                    Settings.System.PULSE_LAVALAMP_SOLID_SPEED, 10 * 1000,
                     UserHandle.USER_CURRENT);
             mLavaLamp.setAnimationTime(lavaLampSpeed);
             if (mLavaLampEnabled && mIsValidStream) {
@@ -290,21 +290,21 @@
                 mLavaLamp.stop();
             }
             // putFloat, getFloat is better. catch it next time
-            mDbFuzzFactor = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_SOLID_FUDGE_FACTOR, 5,
+            mDbFuzzFactor = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_SOLID_FUDGE_FACTOR, 5,
                     UserHandle.USER_CURRENT);
 
             int oldUnits = mUnits;
-            mUnits = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_SOLID_UNITS_COUNT, 64,
+            mUnits = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_SOLID_UNITS_COUNT, 64,
                     UserHandle.USER_CURRENT);
             if (mUnits != oldUnits) {
                 mFFTPoints = new float[mUnits * 4];
                 onSizeChanged(0, 0, 0, 0);
             }
 
-            int solidUnitsColor = Settings.Secure.getIntForUser(
-                    resolver, Settings.Secure.PULSE_SOLID_UNITS_OPACITY, 200,
+            int solidUnitsColor = Settings.System.getIntForUser(
+                    resolver, Settings.System.PULSE_SOLID_UNITS_OPACITY, 200,
                     UserHandle.USER_CURRENT);
             mFadePaint.setColor(Color.argb(mAutoColor ? 255 : solidUnitsColor, 255, 255, 255));
         }
diff --git a/src/com/android/systemui/navigation/pulse/VisualizerStreamHandler.java b/src/com/android/systemui/pulse/VisualizerStreamHandler.java
similarity index 98%
rename from src/com/android/systemui/navigation/pulse/VisualizerStreamHandler.java
rename to src/com/android/systemui/pulse/VisualizerStreamHandler.java
index 6745530..7122627 100644
--- a/src/com/android/systemui/navigation/pulse/VisualizerStreamHandler.java
+++ b/src/com/android/systemui/pulse/VisualizerStreamHandler.java
@@ -20,7 +20,7 @@
  *
  */
 
-package com.android.systemui.navigation.pulse;
+package com.android.systemui.pulse;
 
 import android.content.Context;
 import android.media.audiofx.Visualizer;
diff --git a/src/com/android/systemui/navigation/utils/ColorAnimator.java b/src/com/android/systemui/utils/ColorAnimator.java
similarity index 98%
rename from src/com/android/systemui/navigation/utils/ColorAnimator.java
rename to src/com/android/systemui/utils/ColorAnimator.java
index c04390e..32b11f4 100644
--- a/src/com/android/systemui/navigation/utils/ColorAnimator.java
+++ b/src/com/android/systemui/utils/ColorAnimator.java
@@ -19,7 +19,7 @@
  * 
  */
 
-package com.android.systemui.navigation.utils;
+package com.android.systemui.utils;
 
 import android.animation.ValueAnimator;
 import android.graphics.Color;
