diff --git a/res/layout/app_grid_item.xml b/res/layout/app_grid_item.xml
deleted file mode 100644
index 0b1644c..0000000
--- a/res/layout/app_grid_item.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2016 The OmniROM 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 2 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/>.
- -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ImageView
-        android:id="@+id/appIcon"
-        android:layout_width="@android:dimen/app_icon_size"
-        android:layout_height="@android:dimen/app_icon_size"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:background="?android:attr/selectableItemBackground"
-        android:scaleType="centerInside" />
-</RelativeLayout>
diff --git a/res/layout/app_select_item.xml b/res/layout/app_select_item.xml
deleted file mode 100644
index 92a9b9a..0000000
--- a/res/layout/app_select_item.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2016 The OmniROM 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 2 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/>.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="64dp"
-    android:paddingStart="6dp"
-    android:gravity="center_vertical"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:orientation="horizontal" >
-
-    <ImageView
-        android:id="@+id/app_icon"
-        android:layout_width="@android:dimen/app_icon_size"
-        android:layout_height="@android:dimen/app_icon_size"
-        android:layout_marginEnd="8dip"
-        android:layout_gravity="center_vertical"
-        android:scaleType="centerInside"
-        android:contentDescription="@null" />
-
-    <TextView
-        android:id="@+id/app_name"
-        android:layout_width="0dip"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_gravity="center_vertical"
-        android:singleLine="true"
-        android:ellipsize="end"
-        android:focusable="false"
-        android:textAppearance="?android:attr/textAppearanceListItem"
-        android:textAlignment="viewStart" />
-
-    <CheckBox android:id="@android:id/checkbox"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="8dip"
-        android:layout_gravity="center_vertical"
-        android:clickable="false"
-        android:focusable="false" />
-
-</LinearLayout>
-
diff --git a/res/layout/applist_preference_icon.xml b/res/layout/applist_preference_icon.xml
deleted file mode 100644
index 12644d0..0000000
--- a/res/layout/applist_preference_icon.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 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.
--->
-
-<!-- Layout for a Preference in a PreferenceActivity. The
-     Preference is able to place a specific widget for its particular
-     type in the "widget_frame" layout. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/widget_frame"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="64dp"
-    android:gravity="center_vertical"
-    android:paddingStart="6dp"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/selectableItemBackground">
-
-    <ImageView
-        android:id="@+id/icon"
-        android:layout_width="@android:dimen/app_icon_size"
-        android:layout_height="@android:dimen/app_icon_size"
-        android:layout_gravity="center_vertical"
-        android:layout_marginEnd="8dip"
-        android:scaleType="centerInside" />
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="0dip"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_gravity="center_vertical"
-        android:ellipsize="end"
-        android:focusable="false"
-        android:singleLine="true"
-        android:textAlignment="viewStart"
-        android:textAppearance="?android:attr/textAppearanceListItem" />
-
-</LinearLayout>
diff --git a/res/layout/dialog_battery_settings.xml b/res/layout/dialog_battery_settings.xml
deleted file mode 100644
index 139e914..0000000
--- a/res/layout/dialog_battery_settings.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2010 Daniel Nilsson
-     Copyright (C) 2012 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:paddingTop="@dimen/alert_dialog_padding_material"
-    android:paddingStart="@dimen/alert_dialog_padding_material"
-    android:paddingEnd="@dimen/alert_dialog_padding_material" >
-    <org.omnirom.omnigears.ui.ColorPickerView
-        android:id="@+id/color_picker_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="10dp"
-        android:layout_marginStart="10dp" />
-    <LinearLayout
-        android:id="@+id/color_panel_view"
-        android:layout_width="match_parent"
-        android:layout_height="40dp"
-        android:layout_marginEnd="10dp"
-        android:layout_marginStart="10dp"
-        android:layout_marginTop="4dp"
-        android:orientation="horizontal" >
-        <EditText
-            android:id="@+id/hex_color_input"
-            android:layout_width="0px"
-            android:layout_height="match_parent"
-            android:layout_weight="0.5"
-            android:digits="0123456789ABCDEFabcdef"
-            android:inputType="textNoSuggestions"
-            android:maxLength="6" />
-        <org.omnirom.omnigears.ui.ColorPanelView
-            android:id="@+id/color_panel"
-            android:layout_width="0px"
-            android:layout_height="match_parent"
-            android:layout_marginStart="10dp"
-            android:layout_weight="0.5" />
-    </LinearLayout>
-    <LinearLayout
-        android:id="@+id/color_list_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="10dp"
-        android:layout_marginStart="10dp"
-        android:layout_marginTop="4dp"
-        android:orientation="horizontal" >
-        <Spinner
-            android:id="@+id/color_list_spinner"
-            android:layout_width="0px"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:layout_weight="0.5" />
-        <org.omnirom.omnigears.ui.ColorPanelView
-            android:id="@+id/color_list_panel"
-            android:layout_width="0px"
-            android:layout_height="40dp"
-            android:layout_gravity="center_vertical"
-            android:layout_marginStart="10dp"
-            android:layout_weight="0.5" />
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/led_color_item.xml b/res/layout/led_color_item.xml
deleted file mode 100644
index 9052caf..0000000
--- a/res/layout/led_color_item.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/textViewName"
-    android:paddingStart="4dp"
-    android:paddingEnd="4dp"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp"
-    android:textAppearance="?android:attr/textAppearanceMedium" >
-
-</TextView>
diff --git a/res/layout/preference_app_list.xml b/res/layout/preference_app_list.xml
deleted file mode 100644
index 97177b9..0000000
--- a/res/layout/preference_app_list.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2016 The OmniROM 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 2 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/>.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:paddingStart="@dimen/alert_dialog_padding_material"
-    android:paddingEnd="@dimen/alert_dialog_padding_material">
-
-    <ListView
-        android:id="@+id/app_list"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:divider="@null" />
-</LinearLayout>
-
diff --git a/res/layout/preference_app_select.xml b/res/layout/preference_app_select.xml
deleted file mode 100644
index 39ebee3..0000000
--- a/res/layout/preference_app_select.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 The OmniROM 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 2 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/>.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/selectableItemBackground"
-    android:clipToPadding="false"
-    android:orientation="horizontal" >
-
-    <LinearLayout
-        android:id="@+id/icon_frame"
-        style="@style/preference_icon_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="start|center_vertical"
-        android:orientation="horizontal"
-        android:clipToPadding="false"
-        android:paddingEnd="12dp"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp">
-        <com.android.internal.widget.PreferenceImageView
-            android:id="@android:id/icon"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:gravity="center"
-            android:scaleType="centerInside" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:gravity="center_vertical"
-        android:layout_weight="1" >
-
-        <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="6dip"
-            android:layout_marginTop="10dip"
-            android:layout_marginBottom="6dip" >
-
-            <TextView android:id="@android:id/title"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:singleLine="true"
-                android:textAppearance="?android:attr/textAppearanceListItem"
-                android:ellipsize="marquee" />
-
-            <TextView android:id="@android:id/summary"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_below="@android:id/title"
-                android:layout_alignStart="@android:id/title"
-                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-                android:textColor="?android:attr/textColorSecondary"
-                android:maxLines="10"
-                android:ellipsize="end" />
-
-        </RelativeLayout>
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/preference_color_select.xml b/res/layout/preference_color_select.xml
deleted file mode 100644
index dc53867..0000000
--- a/res/layout/preference_color_select.xml
+++ /dev/null
@@ -1,82 +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.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/selectableItemBackground"
-    android:clipToPadding="false" >
-
-    <LinearLayout
-        android:id="@+id/icon_frame"
-        style="@style/preference_icon_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="start|center_vertical"
-        android:orientation="horizontal"
-        android:clipToPadding="false"
-        android:paddingEnd="12dp"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp">
-        <com.android.internal.widget.PreferenceImageView
-            android:id="@android:id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:maxWidth="48dp"
-            android:maxHeight="48dp" />
-    </LinearLayout>
-
-    <RelativeLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingTop="12dp"
-        android:paddingBottom="12dp">
-
-        <TextView android:id="@android:id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:textAppearance="?android:attr/textAppearanceListItem"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal" />
-
-        <TextView android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/title"
-            android:layout_alignStart="@android:id/title"
-            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-            android:textColor="?android:attr/textColorSecondary"
-            android:maxLines="1" />
-    </RelativeLayout>
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="8dp">
-
-        <ImageView
-            android:id="@+id/light_color"
-            android:layout_width="@dimen/color_preference_width"
-            android:layout_height="@dimen/color_preference_height"
-            android:layout_gravity="center" />
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/preference_font_picker.xml b/res/layout/preference_font_picker.xml
deleted file mode 100644
index fd34b75..0000000
--- a/res/layout/preference_font_picker.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2016 The OmniROM 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 2 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/>.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/selectableItemBackground"
-    android:clipToPadding="false" >
-
-    <LinearLayout
-        android:id="@+id/icon_frame"
-        style="@style/preference_icon_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="start|center_vertical"
-        android:orientation="horizontal"
-        android:clipToPadding="false"
-        android:paddingEnd="12dp"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp">
-        <com.android.internal.widget.PreferenceImageView
-            android:id="@android:id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:maxWidth="48dp"
-            android:maxHeight="48dp" />
-    </LinearLayout>
-
-    <RelativeLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingTop="16dp"
-        android:paddingBottom="16dp">
-
-        <TextView android:id="@android:id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:textAppearance="?android:attr/textAppearanceListItem"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal" />
-
-        <TextView android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/title"
-            android:layout_alignStart="@android:id/title"
-            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-            android:textColor="?android:attr/textColorSecondary"
-            android:maxLines="1" />
-    </RelativeLayout>
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="8dp">
-
-        <TextView android:id="@+id/font_sample"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:layout_gravity="center"
-            android:text="@string/font_sample_text" />
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/preference_seek_bar.xml b/res/layout/preference_seek_bar.xml
deleted file mode 100644
index d988419..0000000
--- a/res/layout/preference_seek_bar.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2016 The OmniROM 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 2 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/>.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/selectableItemBackground"
-    android:clipToPadding="false"
-    android:orientation="horizontal" >
-
-    <LinearLayout
-        android:id="@+id/icon_frame"
-        style="@style/preference_icon_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="start|center_vertical"
-        android:orientation="horizontal"
-        android:clipToPadding="false"
-        android:paddingEnd="12dp"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp">
-        <com.android.internal.widget.PreferenceImageView
-            android:id="@android:id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:maxWidth="48dp"
-            android:maxHeight="48dp" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:gravity="center_vertical"
-        android:layout_weight="1" >
-
-        <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="6dip"
-            android:layout_marginTop="10dip"
-            android:layout_marginBottom="6dip" >
-
-            <TextView android:id="@android:id/title"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:singleLine="true"
-                android:textAppearance="?android:attr/textAppearanceListItem"
-                android:ellipsize="marquee" />
-
-            <TextView android:id="@android:id/summary"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_below="@android:id/title"
-                android:layout_alignStart="@android:id/title"
-                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-                android:textColor="?android:attr/textColorSecondary"
-                android:maxLines="10"
-                android:ellipsize="end" />
-
-        </RelativeLayout>
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:layout_marginStart="10dip"
-            android:layout_marginEnd="6dip"
-            android:layout_marginTop="5dip"
-            android:layout_marginBottom="10dip">
-
-            <TextView android:id="@+id/seekBarPrefUnitsLeft"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-
-            <SeekBar android:id="@+id/seekbar"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:paddingLeft="5dp"
-                android:paddingRight="5dp" />
-
-            <TextView android:id="@+id/seekBarPrefValue"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:paddingRight="5dp"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-
-            <TextView android:id="@+id/seekBarPrefUnitsRight"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/preference_selected_apps_view.xml b/res/layout/preference_selected_apps_view.xml
deleted file mode 100644
index 05480dd..0000000
--- a/res/layout/preference_selected_apps_view.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--  Copyright (C) 2016 The OmniROM 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 2 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/>.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@android:drawable/list_selector_background"
-    android:gravity="center_vertical"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingEnd="?android:attr/scrollbarSize">
-
-    <RelativeLayout
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="6dip"
-        android:layout_marginEnd="6dip"
-        android:layout_marginStart="8dip"
-        android:layout_marginTop="6dip"
-        android:layout_weight="1">
-
-        <HorizontalScrollView
-            android:id="@+id/appsScrollView"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:layout_marginBottom="8dip"
-            android:layout_marginTop="8dip"
-            android:scrollbars="none" >
-
-            <LinearLayout
-                android:id="@+id/selected_apps"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal" />
-        </HorizontalScrollView>
-
-    </RelativeLayout>
-
-    <!-- Preference should place its actual preference widget here. -->
-    <LinearLayout
-        android:id="@android:id/widget_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:gravity="center_vertical"
-        android:orientation="vertical" />
-
-</LinearLayout>
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index c66d832..aa51e77 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -365,7 +365,6 @@
     <string name="global_actions_advanced_reboot_title">Enable advanced restart</string>
     <string name="global_actions_advanced_reboot_summary_new">Show more options in restart menu if not locked</string>
 
-    <string name="font_sample_text">11:57</string>
 
     <string name="screenshot_crop_and_share_title">Screenshot crop &amp; share</string>
     <string name="screenshot_crop_and_share_summary">Show an editor window after taking a screenshot in order to do some operations like cropping, saving or sharing it</string>
diff --git a/res/xml/bars_settings.xml b/res/xml/bars_settings.xml
index 2a4fbed..020f01c 100644
--- a/res/xml/bars_settings.xml
+++ b/res/xml/bars_settings.xml
@@ -23,19 +23,19 @@
             android:key="category_statusbar"
             android:title="@string/statusbar_title">
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="double_tap_sleep_gesture"
                 android:title="@string/double_tap_to_sleep_title"
                 android:summary="@string/double_tap_to_sleep_summary"
                 android:defaultValue="false" />
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="status_bar_brightness_control"
                 android:title="@string/status_bar_toggle_brightness"
                 android:summary="@string/status_bar_toggle_brightness_summary"
                 android:defaultValue="false" />
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="status_bar_ime_notification"
                 android:title="@string/status_bar_ime_notification_title"
                 android:summary="@string/status_bar_ime_notification_summary"
@@ -47,7 +47,7 @@
                 android:summary="@string/network_traffic_summary"
                 android:fragment="org.omnirom.omnigears.interfacesettings.NetworkTraffic" />
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="status_bar_logo"
                 android:title="@string/status_bar_logo_title"
                 android:summary="@string/status_bar_logo_summary"
@@ -78,13 +78,13 @@
             android:key="category_navigationbar"
             android:title="@string/navigationbar_title">
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="navigation_bar_ime_button"
                 android:title="@string/navigation_bar_ime_button_title"
                 android:summary="@string/navigation_bar_ime_button_summary"
                 android:defaultValue="true"/>
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="navigation_bar_menu_arrow_keys"
                 android:title="@string/navigation_bar_menu_arrow_keys_title"
                 android:summary="@string/navigation_bar_menu_arrow_keys_summary"
@@ -108,20 +108,20 @@
             android:key="aspect_ratio_category"
             android:title="@string/aspect_ratio_category_title">
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="aspect_ratio_apps_enabled"
                 android:title="@string/aspect_ratio_apps_enabled_title"
                 android:summary="@string/aspect_ratio_apps_enabled_summary"
                 android:defaultValue="false" />
 
-            <org.omnirom.omnigears.preference.AppMultiSelectListPreference
+            <org.omnirom.omnilib.preference.AppMultiSelectListPreference
                 android:dependency="aspect_ratio_apps_enabled"
                 android:key="aspect_ratio_apps_list"
                 android:persistent="false"
                 android:summary="@string/aspect_ratio_apps_list_summary"
                 android:title="@string/aspect_ratio_apps_list_title" />
 
-            <org.omnirom.omnigears.preference.ScrollAppsViewPreference
+            <org.omnirom.omnilib.preference.ScrollAppsViewPreference
                 android:dependency="aspect_ratio_apps_enabled"
                 android:key="aspect_ratio_apps_list_scroller"
                 android:persistent="false"
diff --git a/res/xml/battery_light_settings.xml b/res/xml/battery_light_settings.xml
index ad962fb..c44bada 100644
--- a/res/xml/battery_light_settings.xml
+++ b/res/xml/battery_light_settings.xml
@@ -19,7 +19,7 @@
         android:key="led_settings"
         android:title="@string/battery_light_settings_title" >
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="battery_light_enabled"
         android:title="@string/battery_light_enable"
         android:persistent="false"/>
@@ -28,13 +28,13 @@
         android:key="general_section"
         android:title="@string/notification_light_general_title">
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="battery_light_pulse"
             android:title="@string/battery_low_pulse_title"
             android:dependency="battery_light_enabled"
             android:persistent="false" />
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="battery_light_only_fully_charged"
             android:title="@string/battery_light_only_full_charge_title"
             android:dependency="battery_light_enabled"
@@ -47,25 +47,25 @@
         android:title="@string/battery_light_list_title"
         android:dependency="battery_light_enabled" >
 
-        <org.omnirom.omnigears.preference.ColorSelectPreference
+        <org.omnirom.omnilib.preference.ColorSelectPreference
             android:key="low_color"
             ledPreview="true"
             android:title="@string/battery_light_low_color_title"
             android:persistent="false" />
 
-        <org.omnirom.omnigears.preference.ColorSelectPreference
+        <org.omnirom.omnilib.preference.ColorSelectPreference
             android:key="medium_color"
             ledPreview="true"
             android:title="@string/battery_light_medium_color_title"
             android:persistent="false" />
 
-        <org.omnirom.omnigears.preference.ColorSelectPreference
+        <org.omnirom.omnilib.preference.ColorSelectPreference
             android:key="full_color"
             ledPreview="true"
             android:title="@string/battery_light_full_color_title"
             android:persistent="false" />
 
-        <org.omnirom.omnigears.preference.ColorSelectPreference
+        <org.omnirom.omnilib.preference.ColorSelectPreference
             android:key="really_full_color"
             ledPreview="true"
             android:title="@string/battery_light_really_full_color_title"
@@ -78,13 +78,13 @@
         android:title="@string/fast_color_cat_title"
         android:dependency="battery_light_enabled" >
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="fast_charging_led_enabled"
             android:title="@string/fast_charging_led_enabled_title"
             android:summary="@string/fast_charging_led_enabled_summary"
             android:defaultValue="false" />
 
-        <org.omnirom.omnigears.preference.ColorSelectPreference
+        <org.omnirom.omnilib.preference.ColorSelectPreference
             android:key="fast_color"
             ledPreview="true"
             android:title="@string/fast_charging_light_color_title"
diff --git a/res/xml/button_brightness_settings.xml b/res/xml/button_brightness_settings.xml
index 928a649..1f88019 100644
--- a/res/xml/button_brightness_settings.xml
+++ b/res/xml/button_brightness_settings.xml
@@ -19,25 +19,25 @@
         android:key="button_brightness"
         android:title="@string/button_backlight_title" >
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="button_backlight_enable"
         android:title="@string/button_backlight_enable_title"
         android:defaultValue="true"/>
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="custom_button_use_screen_brightness"
         android:title="@string/button_link_brightness"
         android:summary="@string/button_link_brightness_summary"
         android:defaultValue="false"
         android:dependency="button_backlight_enable"
         android:disableDependentsState="true" />
-    <org.omnirom.omnigears.preference.SeekBarPreference
+    <org.omnirom.omnilib.preference.SeekBarPreference
         android:key="button_manual_brightness_new"
         android:title="@string/button_manual_brightness"
         android:max="255"
         settings:min="1"
         android:persistent="false"
         android:dependency="custom_button_use_screen_brightness" />
-    <org.omnirom.omnigears.preference.SeekBarPreference
+    <org.omnirom.omnilib.preference.SeekBarPreference
         android:key="button_timeout"
         android:title="@string/button_timeout_title"
         android:summary="@string/button_timeout_summary"
@@ -47,7 +47,7 @@
         settings:unitsRight="@string/unit_sec"
         android:persistent="false"
         android:dependency="button_backlight_enable" />
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="button_backlight_on_touch_only"
         android:title="@string/button_backlight_on_touch_only_title"
         android:summary="@string/button_backlight_on_touch_only_summary"
diff --git a/res/xml/button_settings.xml b/res/xml/button_settings.xml
index 2d2360a..8992d78 100644
--- a/res/xml/button_settings.xml
+++ b/res/xml/button_settings.xml
@@ -23,26 +23,26 @@
         android:key="button_volume_keys"
         android:title="@string/button_volume_keys_title" >
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="swap_volume_buttons"
             android:title="@string/swap_volume_buttons_title"
             android:summary="@string/swap_volume_buttons_summary"
             android:defaultValue="false" />
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="volume_button_force_media"
             android:title="@string/volume_button_force_media_title"
             android:summary="@string/volume_button_force_media_summary"
             android:defaultValue="false" />
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="volume_button_wake"
             android:title="@string/button_volume_wake_title"
             android:summary="@string/button_volume_wake_summary"
             android:disableDependentsState="true"
             android:defaultValue="false" />
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="volume_button_music_control"
             android:title="@string/volume_button_music_control_title"
             android:summary="@string/volume_button_music_control_summary"
@@ -83,13 +83,13 @@
             android:summary="@string/global_actions_summary"
             android:fragment="org.omnirom.omnigears.interfacesettings.GlobalActionsSettings" />
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="long_press_power_torch"
             android:title="@string/long_press_power_torch_title"
             android:summary="@string/long_press_power_torch_summary"
             android:defaultValue="false" />
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="system_proxi_check_enabled"
             android:title="@string/system_proxi_check_enabled_title"
             android:summary="@string/system_proxi_check_enabled_summary"
@@ -127,7 +127,7 @@
             android:entryValues="@array/long_press_home_action_values"
             android:persistent="false"/>
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="button_back_kill_enable"
             android:title="@string/button_back_kill_enable_title"
             android:summary="@string/button_back_kill_enable_summary"
diff --git a/res/xml/event_service_settings.xml b/res/xml/event_service_settings.xml
index 3a9a510..3dd950e 100644
--- a/res/xml/event_service_settings.xml
+++ b/res/xml/event_service_settings.xml
@@ -37,7 +37,7 @@
             android:persistent="false"
             android:summary="@string/category_media_player_info_title" />
 
-        <org.omnirom.omnigears.preference.AppMultiSelectListPreference
+        <org.omnirom.omnilib.preference.AppMultiSelectListPreference
             android:dependency="event_service_enabled"
             android:icon="@drawable/ic_settings_bluetooth"
             android:key="bt_a2dp_connect_app_string"
@@ -45,13 +45,13 @@
             android:summary="@string/bt_a2dp_connect_app_list_summary"
             android:title="@string/bt_a2dp_connect_app_list_title" />
 
-        <org.omnirom.omnigears.preference.ScrollAppsViewPreference
+        <org.omnirom.omnilib.preference.ScrollAppsViewPreference
             android:dependency="event_service_enabled"
             android:key="a2dp_app_list"
             android:persistent="false"
             android:selectable="false" />
 
-        <org.omnirom.omnigears.preference.AppMultiSelectListPreference
+        <org.omnirom.omnilib.preference.AppMultiSelectListPreference
             android:dependency="event_service_enabled"
             android:icon="@drawable/ic_headset_24dp"
             android:key="headset_connect_app_string"
@@ -59,7 +59,7 @@
             android:summary="@string/headset_connect_app_list_summary"
             android:title="@string/headset_connect_app_list_title" />
 
-        <org.omnirom.omnigears.preference.ScrollAppsViewPreference
+        <org.omnirom.omnilib.preference.ScrollAppsViewPreference
             android:dependency="event_service_enabled"
             android:key="headset_app_list"
             android:persistent="false"
@@ -86,7 +86,7 @@
             android:persistent="false"
             android:title="@string/media_player_autostart_title" />
 
-        <org.omnirom.omnigears.preference.SeekBarPreference
+        <org.omnirom.omnilib.preference.SeekBarPreference
             android:dependency="event_service_enabled"
             android:key="app_chooser_timeout"
             android:max="60"
@@ -104,7 +104,7 @@
             android:persistent="false"
             android:title="@string/app_chooser_position_title" />
 
-        <org.omnirom.omnigears.preference.SeekBarPreference
+        <org.omnirom.omnilib.preference.SeekBarPreference
             android:dependency="event_service_enabled"
             android:key="wired_events_threshold"
             android:max="6"
diff --git a/res/xml/global_actions.xml b/res/xml/global_actions.xml
index 58c89da..7e38cbe 100644
--- a/res/xml/global_actions.xml
+++ b/res/xml/global_actions.xml
@@ -20,13 +20,13 @@
         android:key="global_actions"
         android:title="@string/global_actions_title">
 
-    <org.omnirom.omnigears.preference.SecureSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SecureSettingSwitchPreference
         android:key="advanced_reboot"
         android:title="@string/global_actions_advanced_reboot_title"
         android:summary="@string/global_actions_advanced_reboot_summary_new"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SecureSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SecureSettingSwitchPreference
         android:key="lockscreen_power_menu_disabled"
         android:title="@string/lockscreen_power_menu_disabled_title"
         android:summary="@string/lockscreen_power_menu_disabled_summary"
diff --git a/res/xml/lockscreen_settings.xml b/res/xml/lockscreen_settings.xml
index 3c6b3e7..48c1544 100644
--- a/res/xml/lockscreen_settings.xml
+++ b/res/xml/lockscreen_settings.xml
@@ -34,19 +34,19 @@
         android:summary="@string/lockscreen_item_summary"
         android:fragment="org.omnirom.omnigears.interfacesettings.LockscreenItemSettings" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="lockscreen_hide_media"
         android:title="@string/lockscreen_hide_media_title"
         android:summary="@string/lockscreen_hide_media_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="double_tap_sleep_lockscreen"
         android:title="@string/double_tap_sleep_lockscreen_title"
         android:summary="@string/double_tap_sleep_lockscreen_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SecureSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SecureSettingSwitchPreference
         android:key="lockscreen_qs_disabled"
         android:title="@string/lockscreen_qs_disabled_title"
         android:summary="@string/lockscreen_qs_disabled_summary"
diff --git a/res/xml/lockscreenitems.xml b/res/xml/lockscreenitems.xml
index 395c698..daee8b6 100644
--- a/res/xml/lockscreenitems.xml
+++ b/res/xml/lockscreenitems.xml
@@ -20,43 +20,43 @@
     android:title="@string/lockscreen_item_title"
     android:key="lockscreen_item">
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="hide_lockscreen_status_bar"
         android:title="@string/hide_lockscreen_status_bar_title"
         android:summary="@string/hide_lockscreen_status_bar_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="hide_lockscreen_clock"
         android:title="@string/hide_lockscreen_clock_title"
         android:summary="@string/hide_lockscreen_clock_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="hide_lockscreen_date"
         android:title="@string/hide_lockscreen_date_title"
         android:summary="@string/hide_lockscreen_date_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="hide_lockscreen_alarm"
         android:title="@string/hide_lockscreen_alarm_title"
         android:summary="@string/hide_lockscreen_alarm_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="hide_lockscreen_indicator_display"
         android:title="@string/hide_lockscreen_indicator_display_title"
         android:summary="@string/hide_lockscreen_indicator_display_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="hide_lockscreen_icon"
         android:title="@string/hide_lockscreen_icon_title"
         android:summary="@string/hide_lockscreen_icon_summary"
         android:defaultValue="false" />
 
-    <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+    <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
         android:key="lockscreen_weather"
         android:title="@string/lockscreen_weather_title"
         android:summary="@string/lockscreen_weather_summary"
diff --git a/res/xml/more_settings.xml b/res/xml/more_settings.xml
index af90a69..e24fc64 100644
--- a/res/xml/more_settings.xml
+++ b/res/xml/more_settings.xml
@@ -23,7 +23,7 @@
             android:key="category_other"
             android:title="@string/other_category">
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="volume_dialog_headers"
                 android:title="@string/volume_dialog_headers_title"
                 android:summary="@string/volume_dialog_headers_summary"
@@ -57,7 +57,7 @@
                 android:summary="@string/doze_settings_summary"
                 android:fragment="org.omnirom.omnigears.system.DozeSettings" />
 
-            <org.omnirom.omnigears.preference.GlobalSettingSwitchPreference
+            <org.omnirom.omnilib.preference.GlobalSettingSwitchPreference
                 android:key="show_cpu_overlay"
                 android:title="@string/show_cpu_title"
                 android:summary="@string/show_cpu_summary"
@@ -76,7 +76,7 @@
                 android:entryValues="@array/screen_off_animation_values"
                 android:persistent="false"/>
 
-            <org.omnirom.omnigears.preference.GlobalSettingSwitchPreference
+            <org.omnirom.omnilib.preference.GlobalSettingSwitchPreference
                 android:key="wake_when_plugged_or_unplugged"
                 android:title="@string/wake_when_plugged_or_unplugged_title"
                 android:summary="@string/wake_when_plugged_or_unplugged_summary"
diff --git a/res/xml/network_traffic.xml b/res/xml/network_traffic.xml
index 6b73836..ada186d 100644
--- a/res/xml/network_traffic.xml
+++ b/res/xml/network_traffic.xml
@@ -19,7 +19,7 @@
         android:key="category_network_traffic"
         android:title="@string/network_traffic_title">
 
-           <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+           <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="network_traffic_enable"
                 android:title="@string/network_traffic_enable_title"
                 android:defaultValue="false"/>
@@ -49,14 +49,14 @@
                 android:persistent="false"
                 android:dependency="network_traffic_enable" />
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="network_traffic_autohide"
                 android:title="@string/network_traffic_autohide_title"
                 android:summary="@string/network_traffic_autohide_summary"
                 android:defaultValue="false"
                 android:dependency="network_traffic_enable" />
 
-            <org.omnirom.omnigears.preference.SeekBarPreference
+            <org.omnirom.omnilib.preference.SeekBarPreference
                 android:key="network_traffic_autohide_threshold"
                 android:title="@string/network_traffic_autohide_threshold"
                 android:max="100"
diff --git a/res/xml/statusbar_battery_settings.xml b/res/xml/statusbar_battery_settings.xml
index ac47c09..5ba2974 100644
--- a/res/xml/statusbar_battery_settings.xml
+++ b/res/xml/statusbar_battery_settings.xml
@@ -35,19 +35,19 @@
             android:persistent="false"
             android:defaultValue="0"/>
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="statusbar_battery_percent_inside"
             android:title="@string/statusbar_percent_inside_title"
             android:summary="@string/statusbar_percent_inside_summary"
             android:defaultValue="false"/>
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="statusbar_battery_dotted_line"
             android:title="@string/statusbar_battery_dotted_line_title"
             android:summary="@string/statusbar_battery_dotted_line_summary"
             android:defaultValue="false"/>
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="statusbar_battery_low_color_enable"
             android:title="@string/statusbar_battery_low_color_enable_title"
             android:summary="@string/statusbar_battery_low_color_enable_summary"
@@ -57,17 +57,17 @@
             android:key="statusbar_category_charging"
             android:title="@string/statusbar_category_charging_title">
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="statusbar_battery_charging_image"
                 android:title="@string/statusbar_charging_image_title"
                 android:summary="@string/statusbar_charging_image_summary"
                 android:defaultValue="true"/>
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
                 android:key="statusbar_battery_charging_color_enable"
                 android:title="@string/statusbar_battery_charging_color_enable_title"
                 android:summary="@string/statusbar_battery_charging_color_enable_summary"
                 android:defaultValue="false"/>
-            <org.omnirom.omnigears.preference.ColorSelectPreference
+            <org.omnirom.omnilib.preference.ColorSelectPreference
                 android:key="statusbar_battery_charging_color"
                 android:title="@string/statusbar_battery_charging_color_title"
                 android:persistent="false"
diff --git a/res/xml/statusbar_clock_settings.xml b/res/xml/statusbar_clock_settings.xml
index d2ae3c7..22847da 100644
--- a/res/xml/statusbar_clock_settings.xml
+++ b/res/xml/statusbar_clock_settings.xml
@@ -18,12 +18,12 @@
             android:title="@string/clock_title"
             android:key="statusbar_clock">
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="status_bar_clock"
             android:title="@string/status_bar_show_clock_title"
             android:defaultValue="true" />
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="status_bar_clock_seconds"
             android:title="@string/status_bar_clock_seconds_title"
             android:defaultValue="false"
diff --git a/res/xml/style_settings.xml b/res/xml/style_settings.xml
index b03adb2..3a25d72 100644
--- a/res/xml/style_settings.xml
+++ b/res/xml/style_settings.xml
@@ -60,7 +60,7 @@
         android:key="category_custom_header"
         android:title="@string/custom_header_title">
 
-        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+        <org.omnirom.omnilib.preference.SystemSettingSwitchPreference
             android:key="status_bar_custom_header"
             android:title="@string/status_bar_custom_header_title"
             android:defaultValue="false" />
@@ -98,7 +98,7 @@
             android:dependency="status_bar_custom_header" >
         </Preference>
 
-        <org.omnirom.omnigears.preference.SeekBarPreference
+        <org.omnirom.omnilib.preference.SeekBarPreference
             android:key="status_bar_custom_header_shadow"
             android:title="@string/status_bar_custom_header_shadow_title"
             android:summary="@string/status_bar_custom_header_shadow_summary"
diff --git a/src/org/omnirom/omnigears/ButtonBrightnessSettings.java b/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
index d4870b8..3072c13 100644
--- a/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
+++ b/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
@@ -21,34 +21,15 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.os.Bundle;
-import android.os.Handler;
 import android.os.PowerManager;
-import android.support.v7.preference.CheckBoxPreference;
-import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v7.preference.PreferenceCategory;
 import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.ListPreference;
-import android.support.v14.preference.SwitchPreference;
 import android.provider.Settings;
 import android.provider.SearchIndexableResource;
-import android.view.View;
-import android.util.Log;
-import android.app.AlertDialog;
-import android.text.TextWatcher;
-import android.text.Editable;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.SeekBar;
-import android.widget.TextView;
 
-import org.omnirom.omnigears.R;
-import org.omnirom.omnigears.preference.SeekBarPreference;
+import org.omnirom.omnilib.preference.SeekBarPreference;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -56,8 +37,6 @@
 
 import java.util.List;
 import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.Iterator;
 
 public class ButtonBrightnessSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Indexable {
diff --git a/src/org/omnirom/omnigears/batterylight/BatteryLightSettings.java b/src/org/omnirom/omnigears/batterylight/BatteryLightSettings.java
index 3175368..57a2d32 100644
--- a/src/org/omnirom/omnigears/batterylight/BatteryLightSettings.java
+++ b/src/org/omnirom/omnigears/batterylight/BatteryLightSettings.java
@@ -20,18 +20,15 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.os.Bundle;
-import android.support.v7.preference.PreferenceCategory;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
-import android.support.v14.preference.PreferenceFragment;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
 import com.android.settings.R;
@@ -39,8 +36,8 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
-import org.omnirom.omnigears.preference.SystemSettingSwitchPreference;
-import org.omnirom.omnigears.preference.ColorSelectPreference;
+import org.omnirom.omnilib.preference.SystemSettingSwitchPreference;
+import org.omnirom.omnilib.preference.ColorSelectPreference;
 
 import java.util.List;
 import java.util.ArrayList;
diff --git a/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java b/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
index 2d1c12d..f37de41 100644
--- a/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
@@ -18,37 +18,27 @@
 package org.omnirom.omnigears.interfacesettings;
 
 import android.content.Context;
-import android.content.ContentResolver;
-import android.content.Intent;
 import android.content.res.Resources;
 import android.net.TrafficStats;
 import android.os.Bundle;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 import android.text.TextUtils;
-import android.util.Log;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
-import android.support.v7.preference.CheckBoxPreference;
 import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
 import android.support.v7.preference.PreferenceCategory;
 
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.R;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
-import com.android.internal.util.omni.DeviceUtils;
-import com.android.settings.Utils;
-
-import org.omnirom.omnigears.preference.AppMultiSelectListPreference;
-import org.omnirom.omnigears.preference.ScrollAppsViewPreference;
+import org.omnirom.omnilib.preference.AppMultiSelectListPreference;
+import org.omnirom.omnilib.preference.ScrollAppsViewPreference;
 
 import java.util.Arrays;
 import java.util.ArrayList;
diff --git a/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java b/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java
index 10ddc50..5f47393 100644
--- a/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/GlobalActionsSettings.java
@@ -20,20 +20,11 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.os.Bundle;
-import android.os.UserManager;
-import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceManager;
 import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v14.preference.SwitchPreference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.Log;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
 import com.android.settings.R;
@@ -42,11 +33,9 @@
 import com.android.settings.search.Indexable;
 
 import java.util.List;
-import java.util.Arrays;
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 
-import org.omnirom.omnigears.preference.SecureSettingSwitchPreference;
+import org.omnirom.omnilib.preference.SecureSettingSwitchPreference;
 
 public class GlobalActionsSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Indexable {
diff --git a/src/org/omnirom/omnigears/interfacesettings/NetworkTraffic.java b/src/org/omnirom/omnigears/interfacesettings/NetworkTraffic.java
index d69d06c..8797781 100644
--- a/src/org/omnirom/omnigears/interfacesettings/NetworkTraffic.java
+++ b/src/org/omnirom/omnigears/interfacesettings/NetworkTraffic.java
@@ -17,36 +17,27 @@
 
 package org.omnirom.omnigears.interfacesettings;
 
-import android.app.AlertDialog;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.net.TrafficStats;
 import android.os.Bundle;
-import android.os.RemoteException;
 import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.PreferenceCategory;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
 
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.R;
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.omni.DeviceUtils;
-import com.android.settings.Utils;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
 import java.util.List;
 import java.util.ArrayList;
 
-import org.omnirom.omnigears.preference.SeekBarPreference;
+import org.omnirom.omnilib.preference.SeekBarPreference;
 
 public class NetworkTraffic extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Indexable {
diff --git a/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java b/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java
index c0689fb..b7ea971 100644
--- a/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java
@@ -17,43 +17,27 @@
 */
 package org.omnirom.omnigears.interfacesettings;
 
-import android.app.AlertDialog;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.DialogInterface;
-import android.content.res.Resources;
-import android.net.TrafficStats;
 import android.os.Bundle;
-import android.os.RemoteException;
-import android.support.v7.preference.CheckBoxPreference;
 import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v14.preference.SwitchPreference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.omni.DeviceUtils;
-import com.android.settings.Utils;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
-import com.android.internal.util.omni.OmniSwitchConstants;
-import com.android.internal.util.omni.PackageUtils;
-
 import java.util.List;
 import java.util.ArrayList;
 
-import org.omnirom.omnigears.preference.ColorSelectPreference;
-import org.omnirom.omnigears.preference.SeekBarPreference;
-import org.omnirom.omnigears.preference.SystemCheckBoxPreference;
+import org.omnirom.omnilib.preference.ColorSelectPreference;
+import org.omnirom.omnilib.preference.SeekBarPreference;
+import org.omnirom.omnilib.preference.SystemCheckBoxPreference;
 
 public class StatusbarBatterySettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Indexable {
diff --git a/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java b/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
index d8b94e5..86b1b6d 100644
--- a/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
@@ -22,29 +22,22 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
 import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
-import android.util.Log;
 
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.omni.PackageUtils;
 
 import com.android.settings.R;
-import com.android.settings.Utils;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
-import com.android.settingslib.core.AbstractPreferenceController;
 
-import org.omnirom.omnigears.preference.SystemSettingSwitchPreference;
-import org.omnirom.omnigears.preference.SeekBarPreference;
+import org.omnirom.omnilib.preference.SystemSettingSwitchPreference;
+import org.omnirom.omnilib.preference.SeekBarPreference;
 
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/src/org/omnirom/omnigears/preference/AppMultiSelectListPreference.java b/src/org/omnirom/omnigears/preference/AppMultiSelectListPreference.java
deleted file mode 100644
index 4d7e5d1..0000000
--- a/src/org/omnirom/omnigears/preference/AppMultiSelectListPreference.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- *  Copyright (C) 2016 The OmniROM 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 2 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/>.
- *
- */
-package org.omnirom.omnigears.preference;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.CheckBox;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.android.settings.R;
-import com.android.settingslib.CustomDialogPreference;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-public class AppMultiSelectListPreference extends CustomDialogPreference {
-    private static final String TAG = "AppMultiSelectList";
-    private static final boolean DEBUG = false;
-
-    private final List<PackageItem> mPackageInfoList = new ArrayList<PackageItem>();
-    private AppListAdapter mAdapter;
-    private List<String> mValues = new ArrayList<String>();
-    private PackageManager mPm;
-
-    public AppMultiSelectListPreference(Context context) {
-        this(context, null);
-    }
-
-    public AppMultiSelectListPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setDialogLayoutResource(R.layout.preference_app_list);
-
-        mPm = context.getPackageManager();
-
-        final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
-        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
-        List<ResolveInfo> installedAppsInfo = getContext().getPackageManager().queryIntentActivities(
-                mainIntent, 0);
-
-        for (ResolveInfo info : installedAppsInfo) {
-            ComponentName componentName = new ComponentName(
-                    info.activityInfo.applicationInfo.packageName,
-                    info.activityInfo.name);
-
-            try {
-                final PackageItem item = new PackageItem(
-                        info.activityInfo.loadLabel(mPm), 0, componentName);
-                mPackageInfoList.add(item);
-            } catch (Exception e) {
-                if (DEBUG) Log.e(TAG, "Load installed apps", e);
-            }
-        }
-        Collections.sort(mPackageInfoList);
-
-        setPositiveButtonText(R.string.action_save);
-        setNegativeButtonText(android.R.string.cancel);
-    }
-
-    public void setValues(Collection<String> values) {
-        mValues.clear();
-        mValues.addAll(values);
-    }
-
-    public Collection<String> getValues() {
-        return mValues;
-    }
-
-    @Override
-    protected void onBindDialogView(View view) {
-        super.onBindDialogView(view);
-
-        mAdapter = new AppListAdapter(getContext());
-        final ListView listView = (ListView) view.findViewById(R.id.app_list);
-        listView.setAdapter(mAdapter);
-        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                final AppViewHolder holder = (AppViewHolder) view.getTag();
-                final boolean isChecked = !holder.checkBox.isChecked();
-
-                holder.checkBox.setChecked(isChecked);
-                PackageItem info = mAdapter.getItem(position);
-
-                if (isChecked) {
-                    mValues.add(info.mValue);
-                } else {
-                    mValues.remove(info.mValue);
-                }
-            }
-        });
-    }
-
-    @Override
-    protected void onDialogClosed(boolean positiveResult) {
-        super.onDialogClosed(positiveResult);
-        if (positiveResult) {
-            callChangeListener(mValues.size() > 0 ? mValues : null);
-        }
-    }
-
-    public class PackageItem implements Comparable<PackageItem> {
-        public final CharSequence mTitle;
-        public final int mAppIconResourceId;
-        public final ComponentName mComponentName;
-        public final String mValue;
-
-        PackageItem(CharSequence title, int iconResourceId, ComponentName componentName) {
-            mTitle = title;
-            mAppIconResourceId = iconResourceId;
-            mComponentName = componentName;
-            mValue = componentName.flattenToString();
-        }
-
-        PackageItem(CharSequence title, int iconResourceId, String value) {
-            mTitle = title;
-            mAppIconResourceId = iconResourceId;
-            mComponentName = null;
-            mValue = value;
-        }
-
-        @Override
-        public int compareTo(PackageItem another) {
-            return mTitle.toString().toUpperCase().compareTo(another.mTitle.toString().toUpperCase());
-        }
-
-        @Override
-        public int hashCode() {
-            return mValue.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object another) {
-            if (another == null || !(another instanceof PackageItem)) {
-                return false;
-            }
-            return mValue.equals(((PackageItem) another).mValue);
-        }
-    }
-
-    public class AppListAdapter extends ArrayAdapter<PackageItem> {
-        private final LayoutInflater mInflater;
-
-        public AppListAdapter(Context context) {
-            super(context, 0);
-            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            addAll(mPackageInfoList);
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            AppViewHolder holder = AppViewHolder.createOrRecycle(mInflater, convertView);
-            convertView = holder.rootView;
-            PackageItem info = getItem(position);
-            holder.appName.setText(info.mTitle);
-            if (info.mAppIconResourceId != 0) {
-                holder.appIcon.setImageResource(info.mAppIconResourceId);
-            } else {
-                Drawable d = resolveAppIcon(info);
-                holder.appIcon.setImageDrawable(d);
-            }
-            holder.checkBox.setChecked(mValues.contains(info.mValue));
-            return convertView;
-        }
-
-        @Override
-        public PackageItem getItem(int position) {
-            return mPackageInfoList.get(position);
-        }
-    }
-
-    public static class AppViewHolder {
-        public View rootView;
-        public TextView appName;
-        public ImageView appIcon;
-        public CheckBox checkBox;
-
-        public static AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView) {
-            if (convertView == null) {
-                convertView = inflater.inflate(R.layout.app_select_item, null);
-
-                // Creates a ViewHolder and store references to the two children views
-                // we want to bind data to.
-                AppViewHolder holder = new AppViewHolder();
-                holder.rootView = convertView;
-                holder.appName = (TextView) convertView.findViewById(R.id.app_name);
-                holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
-                holder.checkBox = (CheckBox) convertView.findViewById(android.R.id.checkbox);
-                convertView.setTag(holder);
-                return holder;
-            } else {
-                // Get the ViewHolder back to get fast access to the TextView
-                // and the ImageView.
-                return (AppViewHolder) convertView.getTag();
-            }
-        }
-    }
-
-    private Drawable getDefaultActivityIcon() {
-        return getContext().getResources().getDrawable(android.R.drawable.sym_def_app_icon);
-    }
-
-    private Drawable resolveAppIcon(PackageItem item) {
-        Drawable appIcon = null;
-        try {
-            appIcon = mPm.getActivityIcon(item.mComponentName);
-        } catch (PackageManager.NameNotFoundException e) {
-            if (DEBUG) Log.e(TAG, "resolveAppIcon", e);
-        }
-        if (appIcon == null) {
-            appIcon = getDefaultActivityIcon();
-        }
-        return appIcon;
-    }
-}
-
diff --git a/src/org/omnirom/omnigears/preference/AppSelectListPreference.java b/src/org/omnirom/omnigears/preference/AppSelectListPreference.java
deleted file mode 100644
index 2110725..0000000
--- a/src/org/omnirom/omnigears/preference/AppSelectListPreference.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
-* Copyright (C) 2017 The OmniROM 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 2 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/>.
-*
-*/
-package org.omnirom.omnigears.preference;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Message;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.support.v14.preference.PreferenceDialogFragment;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-import com.android.settingslib.CustomDialogPreference;
-import com.android.settings.R;
-
-public class AppSelectListPreference extends CustomDialogPreference {
-
-    private static String TAG = "AppSelectListPreference";
-    public static final String DISABLED_ENTRY = "disabled";
-
-    private AppSelectListAdapter mAdapter;
-    private Drawable mAppIconDrawable;
-    private int mAppIconResourceId;
-    private CharSequence mTitle;
-    private String mValue;
-    private PackageManager mPm;
-
-    public class PackageItem implements Comparable<PackageItem> {
-        public final CharSequence mTitle;
-        public final int mAppIconResourceId;
-        public final ComponentName mComponentName;
-        public final String mValue;
-
-        PackageItem(CharSequence title, int iconResourceId, ComponentName componentName) {
-            mTitle = title;
-            mAppIconResourceId = iconResourceId;
-            mComponentName = componentName;
-            mValue = componentName.flattenToString();
-        }
-
-        PackageItem(CharSequence title, int iconResourceId, String value) {
-            mTitle = title;
-            mAppIconResourceId = iconResourceId;
-            mComponentName = null;
-            mValue = value;
-        }
-
-        @Override
-        public int compareTo(PackageItem another) {
-            return mTitle.toString().toUpperCase().compareTo(another.mTitle.toString().toUpperCase());
-        }
-
-        @Override
-        public int hashCode() {
-            return mValue.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object another) {
-            if (another == null || !(another instanceof PackageItem)) {
-                return false;
-            }
-            return mValue.equals(((PackageItem) another).mValue);
-        }
-    }
-
-    public class AppSelectListAdapter extends BaseAdapter implements Runnable {
-        private LayoutInflater mInflater;
-        private List<PackageItem> mInstalledPackages = new LinkedList<PackageItem>();
-
-        private final Handler mHandler = new Handler() {
-            @Override
-            public void handleMessage(Message msg) {
-                PackageItem disabledItem = new PackageItem(getContext().getResources().getString(R.string.disabled_entry),
-                        R.drawable.ic_disabled, DISABLED_ENTRY);
-                mInstalledPackages.add(0, disabledItem);
-
-                notifyDataSetChanged();
-                updatePreferenceViews();
-            }
-        };
-
-        public AppSelectListAdapter(Context context) {
-            mInflater = LayoutInflater.from(context);
-            reloadList();
-        }
-
-        @Override
-        public int getCount() {
-            return mInstalledPackages.size();
-        }
-
-        @Override
-        public PackageItem getItem(int position) {
-            return mInstalledPackages.get(position);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return mInstalledPackages.get(position).hashCode();
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            ViewHolder holder;
-            if (convertView != null) {
-                holder = (ViewHolder) convertView.getTag();
-            } else {
-                convertView = mInflater.inflate(R.layout.applist_preference_icon, null, false);
-                holder = new ViewHolder();
-                convertView.setTag(holder);
-                holder.title = (TextView) convertView.findViewById(R.id.title);
-                holder.icon = (ImageView) convertView.findViewById(R.id.icon);
-            }
-
-            PackageItem applicationInfo = getItem(position);
-            holder.title.setText(applicationInfo.mTitle);
-            if (applicationInfo.mAppIconResourceId != 0) {
-                holder.icon.setImageResource(applicationInfo.mAppIconResourceId);
-            } else {
-                Drawable d = resolveAppIcon(applicationInfo);
-                holder.icon.setImageDrawable(d);
-            }
-            return convertView;
-        }
-
-        private void reloadList() {
-            mInstalledPackages.clear();
-            new Thread(this).start();
-        }
-
-        @Override
-        public void run() {
-            final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
-            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
-            List<ResolveInfo> installedAppsInfo = mPm.queryIntentActivities(mainIntent, 0);
-
-            for (ResolveInfo info : installedAppsInfo) {
-                ActivityInfo activity = info.activityInfo;
-                ApplicationInfo appInfo = activity.applicationInfo;
-                ComponentName componentName = new ComponentName(appInfo.packageName, activity.name);
-                CharSequence label = null;
-                try {
-                    label = activity.loadLabel(mPm);
-                } catch (Exception e) {
-                }
-                if (label != null) {
-                    final PackageItem item = new PackageItem(activity.loadLabel(mPm), 0, componentName);
-                    mInstalledPackages.add(item);
-                }
-            }
-            Collections.sort(mInstalledPackages);
-            mHandler.obtainMessage(0).sendToTarget();
-        }
-
-        private PackageItem resolveApplication(ComponentName componentName) {
-            for (PackageItem item : mInstalledPackages) {
-                if (item.mComponentName != null && item.mComponentName.equals(componentName)) {
-                    return item;
-                }
-            }
-            return null;
-        }
-
-        private class ViewHolder {
-            TextView title;
-            TextView summary;
-            ImageView icon;
-        }
-    }
-
-    public AppSelectListPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init();
-    }
-
-    public AppSelectListPreference(Context context, int color) {
-        super(context, null);
-        init();
-    }
-
-    private void init() {
-        mPm = getContext().getPackageManager();
-        setDialogLayoutResource(R.layout.preference_app_list);
-        setLayoutResource(R.layout.preference_app_select);
-        setNegativeButtonText(android.R.string.cancel);
-        setPositiveButtonText(null);
-        setDialogTitle(R.string.choose_app);
-        setDialogIcon(null);
-        mAdapter = new AppSelectListAdapter(getContext());
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
-        super.onSetInitialValue(restorePersistedValue, defaultValue);
-        if (mTitle != null) {
-            setSummary(mTitle);
-        } else {
-            setSummary(getContext().getResources().getString(R.string.not_ready_summary));
-        }
-        mAppIconResourceId = R.drawable.ic_disabled;
-        setIcon(mAppIconResourceId);
-    }
-
-    @Override
-    protected void onBindDialogView(View view) {
-        super.onBindDialogView(view);
-
-        final ListView list = (ListView) view.findViewById(R.id.app_list);
-        list.setAdapter(mAdapter);
-        list.setOnItemClickListener(new OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                PackageItem info = (PackageItem) parent.getItemAtPosition(position);
-                mValue = info.mValue;
-                if (shouldPersist()) {
-                    persistString(mValue);
-                }
-                mTitle = info.mTitle;
-                mAppIconDrawable = null;
-                mAppIconResourceId = 0;
-                if (info.mComponentName != null) {
-                    mAppIconDrawable = resolveAppIcon(info);
-                } else {
-                    mAppIconResourceId = info.mAppIconResourceId;
-                }
-
-                updatePreferenceViews();
-                callChangeListener(mValue);
-                getDialog().dismiss();
-            }
-        });
-    }
-
-    private void updatePreferenceViews() {
-        String name = null;
-        if (shouldPersist()) {
-            name = getPersistedString(null);
-        } else {
-            name = mValue;
-        }
-        mAppIconResourceId = R.drawable.ic_disabled;
-
-        if (name != null) {
-            if (name.equals(DISABLED_ENTRY)) {
-                mTitle = getContext().getResources().getString(R.string.disabled_entry);
-                mAppIconResourceId = R.drawable.ic_disabled;
-            } else {
-                mAppIconDrawable = null;
-                ComponentName componentName = ComponentName.unflattenFromString(name);
-                PackageItem item = mAdapter.resolveApplication(componentName);
-                if (item != null) {
-                    mTitle = item.mTitle;
-                    mAppIconDrawable = resolveAppIcon(item);
-                } else {
-                    mTitle = getContext().getResources().getString(R.string.resolve_failed_summary);
-                }
-            }
-        } else {
-            mTitle = getContext().getResources().getString(R.string.disabled_entry);
-            mAppIconResourceId = R.drawable.ic_disabled;
-        }
-
-        setSummary(mTitle);
-        if (mAppIconDrawable != null) {
-            setIcon(mAppIconDrawable);
-        } else {
-            setIcon(mAppIconResourceId);
-        }
-    }
-
-    private Drawable getDefaultActivityIcon() {
-        return getContext().getResources().getDrawable(android.R.drawable.sym_def_app_icon);
-    }
-
-    public String getValue() {
-        return mValue;
-    }
-
-    public void setValue(String value) {
-        mValue = value;
-    }
-
-    private Drawable resolveAppIcon(PackageItem item) {
-        Drawable appIcon = null;
-        try {
-            appIcon = mPm.getActivityIcon(item.mComponentName);
-        } catch (PackageManager.NameNotFoundException e) {
-        }
-        if (appIcon == null) {
-            appIcon = getDefaultActivityIcon();
-        }
-        return appIcon;
-    }
-
-    public static class AppSelectListPreferenceDialogFragment
-            extends CustomDialogPreference.CustomPreferenceDialogFragment {
-        public static CustomDialogPreference.CustomPreferenceDialogFragment
-                newInstance(String key) {
-            return CustomDialogPreference.CustomPreferenceDialogFragment.newInstance(key);
-        }
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/ColorSelectDialog.java b/src/org/omnirom/omnigears/preference/ColorSelectDialog.java
deleted file mode 100644
index 14a7516..0000000
--- a/src/org/omnirom/omnigears/preference/ColorSelectDialog.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (C) 2010 Daniel Nilsson
- * Copyright (C) 2012 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 org.omnirom.omnigears.preference;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.PixelFormat;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.text.InputFilter;
-import android.text.InputFilter.LengthFilter;
-import android.util.Pair;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnFocusChangeListener;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.Spinner;
-import android.widget.SpinnerAdapter;
-import android.widget.TextView;
-
-import com.android.settings.R;
-import org.omnirom.omnigears.ui.ColorPanelView;
-import org.omnirom.omnigears.ui.ColorPickerView;
-import org.omnirom.omnigears.ui.ColorPickerView.OnColorChangedListener;
-
-import java.util.ArrayList;
-import java.util.IllegalFormatException;
-import java.util.Locale;
-
-public class ColorSelectDialog extends AlertDialog implements
-        ColorPickerView.OnColorChangedListener, TextWatcher, OnFocusChangeListener {
-
-    private static final String TAG = "ColorSelectDialog";
-    private final static String STATE_KEY_COLOR = "BatteryLightDialog:color";
-
-    private ColorPickerView mColorPicker;
-
-    private EditText mHexColorInput;
-    private ColorPanelView mNewColor;
-    private LayoutInflater mInflater;
-    private boolean mMultiColor = true;
-    private Spinner mColorList;
-    private LinearLayout mColorListView;
-    private LinearLayout mColorPanelView;
-    private ColorPanelView mNewListColor;
-    private LedColorAdapter mLedColorAdapter;
-    private boolean mWithAlpha;
-
-    private boolean mShowLedPreview;
-    private NotificationManager mNoMan;
-    private Context mContext;
-
-    protected ColorSelectDialog(Context context, int initialColor, boolean showLedPreview) {
-        super(context);
-        mContext = context;
-        mShowLedPreview = showLedPreview;
-        mWithAlpha = false;
-        mMultiColor = getContext().getResources().getBoolean(R.bool.config_has_multi_color_led);
-        init(initialColor);
-    }
-
-    private void init(int color) {
-        // To fight color banding.
-        getWindow().setFormat(PixelFormat.RGBA_8888);
-        setUp(color);
-    }
-
-    /**
-     * This function sets up the dialog with the proper values.  If the speedOff parameters
-     * has a -1 value disable both spinners
-     *
-     * @param color - the color to set
-     * @param speedOn - the flash time in ms
-     * @param speedOff - the flash length in ms
-     */
-    private void setUp(int color) {
-        mInflater = (LayoutInflater) getContext()
-                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        View layout = mInflater.inflate(R.layout.dialog_battery_settings, null);
-
-        mNoMan = (NotificationManager)
-                mContext.getSystemService(Context.NOTIFICATION_SERVICE);
-
-        mColorPicker = (ColorPickerView) layout.findViewById(R.id.color_picker_view);
-        mHexColorInput = (EditText) layout.findViewById(R.id.hex_color_input);
-        mNewColor = (ColorPanelView) layout.findViewById(R.id.color_panel);
-        mColorPanelView = (LinearLayout) layout.findViewById(R.id.color_panel_view);
-
-        mColorListView = (LinearLayout) layout.findViewById(R.id.color_list_view);
-        mColorList = (Spinner) layout.findViewById(R.id.color_list_spinner);
-        mNewListColor = (ColorPanelView) layout.findViewById(R.id.color_list_panel);
-
-        mColorPicker.setOnColorChangedListener(this);
-        mHexColorInput.setOnFocusChangeListener(this);
-        setAlphaSliderVisible(mWithAlpha);
-        mColorPicker.setColor(color, true);
-        showLed(color);
-
-        mColorList = (Spinner) layout.findViewById(R.id.color_list_spinner);
-        mLedColorAdapter = new LedColorAdapter(
-                R.array.entries_led_colors,
-                R.array.values_led_colors);
-        mColorList.setAdapter(mLedColorAdapter);
-        mColorList.setSelection(mLedColorAdapter.getColorPosition(color));
-        mColorList.setOnItemSelectedListener(mColorListListener);
-
-        setView(layout);
-
-        // show and hide the correct UI depending if we have multi-color led or not
-        if (mMultiColor){
-            mColorListView.setVisibility(View.GONE);
-            mColorPicker.setVisibility(View.VISIBLE);
-            mColorPanelView.setVisibility(View.VISIBLE);
-        } else {
-            mColorListView.setVisibility(View.VISIBLE);
-            mColorPicker.setVisibility(View.GONE);
-            mColorPanelView.setVisibility(View.GONE);
-        }
-    }
-
-    private AdapterView.OnItemSelectedListener mColorListListener = new AdapterView.OnItemSelectedListener() {
-
-        @Override
-        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-            int color = mLedColorAdapter.getColor(position);
-            mNewListColor.setColor(color);
-        }
-
-        @Override
-        public void onNothingSelected(AdapterView<?> parent) {
-        }
-    };
-
-    @Override
-    public Bundle onSaveInstanceState() {
-        Bundle state = super.onSaveInstanceState();
-        state.putInt(STATE_KEY_COLOR, getColor());
-        switchOffLed();
-        return state;
-    }
-
-    @Override
-    public void onRestoreInstanceState(Bundle state) {
-        super.onRestoreInstanceState(state);
-        mColorPicker.setColor(state.getInt(STATE_KEY_COLOR), true);
-    }
-
-    @Override
-    public void onColorChanged(int color) {
-        final boolean hasAlpha = mWithAlpha;
-        final String format = hasAlpha ? "%08x" : "%06x";
-        final int mask = hasAlpha ? 0xFFFFFFFF : 0x00FFFFFF;
-
-        mNewColor.setColor(color);
-        mHexColorInput.setText(String.format(Locale.US, format, color & mask));
-
-        showLed(color);
-    }
-
-    private void showLed(int color) {
-        if (mShowLedPreview) {
-            if (color == 0xFFFFFFFF) {
-                // argb white doesn't work
-                color = 0xffffff;
-            }
-            mNoMan.forceShowLedLight(color);
-        }
-    }
-
-    public void switchOffLed() {
-        if (mShowLedPreview) {
-            mNoMan.forceShowLedLight(-1);
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        switchOffLed();
-    }
-
-    public void setAlphaSliderVisible(boolean visible) {
-        mHexColorInput.setFilters(new InputFilter[] { new InputFilter.LengthFilter(visible ? 8 : 6) } );
-        mColorPicker.setAlphaSliderVisible(visible);
-    }
-
-    public int getColor() {
-        if (mMultiColor){
-            return mColorPicker.getColor();
-        } else {
-            return mNewListColor.getColor();
-        }
-    }
-
-    class LedColorAdapter extends BaseAdapter implements SpinnerAdapter {
-        private ArrayList<Pair<String, Integer>> mColors;
-
-        public LedColorAdapter(int ledColorResource, int ledValueResource) {
-            mColors = new ArrayList<Pair<String, Integer>>();
-
-            String[] color_names = getContext().getResources().getStringArray(ledColorResource);
-            String[] color_values = getContext().getResources().getStringArray(ledValueResource);
-
-            for(int i = 0; i < color_values.length; ++i) {
-                try {
-                    int color = Color.parseColor(color_values[i]);
-                    mColors.add(new Pair<String, Integer>(color_names[i], color));
-                } catch (IllegalArgumentException ex) {
-                    // Number format is incorrect, ignore entry
-                }
-            }
-        }
-
-        /**
-         * Will return the position of the spinner entry with the specified
-         * color. Returns 0 if there is no such entry.
-         */
-        public int getColorPosition(int color) {
-            for (int position = 0; position < getCount(); ++position) {
-                if (getItem(position).second.equals(color)) {
-                    return position;
-                }
-            }
-
-            return 0;
-        }
-
-        public int getColor(int position) {
-            Pair<String, Integer> item = getItem(position);
-            if (item != null){
-                return item.second;
-            }
-
-            // -1 is white
-            return -1;
-        }
-
-        @Override
-        public int getCount() {
-            return mColors.size();
-        }
-
-        @Override
-        public Pair<String, Integer> getItem(int position) {
-            return mColors.get(position);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public View getView(int position, View view, ViewGroup parent) {
-            if (view == null) {
-                view = mInflater.inflate(R.layout.led_color_item, null);
-            }
-
-            Pair<String, Integer> entry = getItem(position);
-            ((TextView) view.findViewById(R.id.textViewName)).setText(entry.first);
-
-            return view;
-        }
-    }
-
-    @Override
-    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-    }
-
-    @Override
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
-    }
-
-    @Override
-    public void afterTextChanged(Editable s) {
-        String hexColor = mHexColorInput.getText().toString();
-        if (!hexColor.isEmpty()) {
-            try {
-                int color = Color.parseColor('#' + hexColor);
-                if (!mWithAlpha) {
-                    color |= 0xFF000000; // set opaque
-                }
-                mColorPicker.setColor(color);
-                mNewColor.setColor(color);
-            } catch (IllegalArgumentException ex) {
-                // Number format is incorrect, ignore
-            }
-        }
-    }
-
-    @Override
-    public void onFocusChange(View v, boolean hasFocus) {
-        if (!hasFocus) {
-            mHexColorInput.removeTextChangedListener(this);
-            InputMethodManager inputMethodManager = (InputMethodManager) getContext()
-                    .getSystemService(Activity.INPUT_METHOD_SERVICE);
-            inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
-        } else {
-            mHexColorInput.addTextChangedListener(this);
-        }
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/ColorSelectPreference.java b/src/org/omnirom/omnigears/preference/ColorSelectPreference.java
deleted file mode 100644
index 8b98240..0000000
--- a/src/org/omnirom/omnigears/preference/ColorSelectPreference.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2012 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 org.omnirom.omnigears.preference;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.res.Resources;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.RectShape;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-import android.widget.ImageView;
-
-import com.android.settings.R;
-
-public class ColorSelectPreference extends Preference implements DialogInterface.OnDismissListener {
-
-    private static String TAG = "ColorSelectPreference";
-    public static final int DEFAULT_COLOR = 0xFFFFFF; //White
-
-    private ImageView mLightColorView;
-    private Resources mResources;
-    private int mColorValue;
-    private Dialog mDialog;
-
-    private boolean mShowLedPreview;
-
-    /**
-     * @param context
-     * @param attrs
-     */
-    public ColorSelectPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mColorValue = DEFAULT_COLOR;
-        init(context, attrs);
-    }
-
-    public ColorSelectPreference(Context context, int color) {
-        super(context, null);
-        mColorValue = color;
-        init(context, null);
-    }
-
-    public ColorSelectPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        mColorValue = DEFAULT_COLOR;
-        init(context, attrs);
-    }
-
-    private void init(Context context, AttributeSet attrs) {
-        setLayoutResource(R.layout.preference_color_select);
-        mResources = getContext().getResources();
-        mShowLedPreview = attrs.getAttributeBooleanValue(null, "ledPreview", false);
-    }
-
-    public void setColor(int color) {
-        mColorValue = color;
-        updatePreferenceViews();
-    }
-
-    public int getColor() {
-        return mColorValue;
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-
-        mLightColorView = (ImageView) holder.findViewById(R.id.light_color);
-
-        updatePreferenceViews();
-    }
-
-    private void updatePreferenceViews() {
-        final int width = (int) mResources.getDimension(R.dimen.color_preference_width);
-        final int height = (int) mResources.getDimension(R.dimen.color_preference_height);
-
-        if (mLightColorView != null) {
-            mLightColorView.setEnabled(true);
-            mLightColorView.setImageDrawable(createRectShape(width, height, 0xFF000000 | mColorValue));
-        }
-    }
-
-    @Override
-    protected void onClick() {
-        if (mDialog != null && mDialog.isShowing()) return;
-        mDialog = getDialog();
-        mDialog.setOnDismissListener(this);
-        mDialog.show();
-    }
-
-    public Dialog getDialog() {
-        final ColorSelectDialog d = new ColorSelectDialog(getContext(),
-                0xFF000000 | mColorValue, mShowLedPreview);
-
-        d.setButton(AlertDialog.BUTTON_POSITIVE, mResources.getString(R.string.ok),
-                new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                if (mShowLedPreview) {
-                    mColorValue =  d.getColor() & 0x00FFFFFF; // strip alpha, led does not support it
-                    d.switchOffLed();
-                } else {
-                    mColorValue =  d.getColor();
-                }
-                updatePreferenceViews();
-                callChangeListener(new Integer(mColorValue));
-            }
-        });
-        d.setButton(AlertDialog.BUTTON_NEGATIVE, mResources.getString(R.string.cancel),
-                new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                d.switchOffLed();
-            }
-        });
-
-        return d;
-    }
-
-    private static ShapeDrawable createRectShape(int width, int height, int color) {
-        ShapeDrawable shape = new ShapeDrawable(new RectShape());
-        shape.setIntrinsicHeight(height);
-        shape.setIntrinsicWidth(width);
-        shape.getPaint().setColor(color);
-        return shape;
-    }
-
-    @Override
-    public void onDismiss(DialogInterface dialog) {
-        mDialog = null;
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/GlobalCheckBoxPreference.java b/src/org/omnirom/omnigears/preference/GlobalCheckBoxPreference.java
deleted file mode 100644
index 1658b48..0000000
--- a/src/org/omnirom/omnigears/preference/GlobalCheckBoxPreference.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2013 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 org.omnirom.omnigears.preference;
-
-import android.content.Context;
-import android.support.v7.preference.CheckBoxPreference;
-import android.provider.Settings;
-import android.util.AttributeSet;
-
-public class GlobalCheckBoxPreference extends CheckBoxPreference {
-    public GlobalCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public GlobalCheckBoxPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public GlobalCheckBoxPreference(Context context) {
-        super(context, null);
-    }
-
-    @Override
-    protected boolean persistBoolean(boolean value) {
-        if (shouldPersist()) {
-            if (value == getPersistedBoolean(!value)) {
-                // It's already there, so the same as persisting
-                return true;
-            }
-
-            Settings.Global.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-
-        return Settings.Global.getInt(getContext().getContentResolver(),
-                getKey(), defaultReturnValue ? 1 : 0) != 0;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        setChecked(Settings.Global.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
-                : (Boolean) defaultValue);
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/GlobalSettingSwitchPreference.java b/src/org/omnirom/omnigears/preference/GlobalSettingSwitchPreference.java
deleted file mode 100644
index 4f989af..0000000
--- a/src/org/omnirom/omnigears/preference/GlobalSettingSwitchPreference.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.
- */
-
-package org.omnirom.omnigears.preference;
-
-import android.content.Context;
-import android.support.v14.preference.SwitchPreference;
-import android.provider.Settings;
-import android.util.AttributeSet;
-
-public class GlobalSettingSwitchPreference extends SwitchPreference {
-    public GlobalSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public GlobalSettingSwitchPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public GlobalSettingSwitchPreference(Context context) {
-        super(context, null);
-    }
-
-    @Override
-    protected boolean persistBoolean(boolean value) {
-        if (shouldPersist()) {
-            if (value == getPersistedBoolean(!value)) {
-                // It's already there, so the same as persisting
-                return true;
-            }
-            Settings.Global.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-        return Settings.Global.getInt(getContext().getContentResolver(),
-                getKey(), defaultReturnValue ? 1 : 0) != 0;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        setChecked(Settings.Global.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
-                : (Boolean) defaultValue);
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/ScrollAppsViewPreference.java b/src/org/omnirom/omnigears/preference/ScrollAppsViewPreference.java
deleted file mode 100644
index 7583ebe..0000000
--- a/src/org/omnirom/omnigears/preference/ScrollAppsViewPreference.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2017 The OmniROM 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 2 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/>.
- *
- */
-package org.omnirom.omnigears.preference;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.android.settings.R;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-public class ScrollAppsViewPreference extends Preference {
-    private static final String TAG = "ScrollAppsPreference";
-
-    private Context mContext;
-    private List<String> mValues = new ArrayList<String>();
-    private PackageManager mPm;
-    private LayoutInflater mInflater;
-
-    public ScrollAppsViewPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        initPreference(context);
-    }
-
-    public ScrollAppsViewPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        initPreference(context);
-    }
-
-    public ScrollAppsViewPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        initPreference(context);
-    }
-
-    public void setValues(Collection<String> values) {
-        mValues.clear();
-        mValues.addAll(values);
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        LinearLayout linearLayout = (LinearLayout) holder.findViewById(R.id.selected_apps);
-        if (linearLayout.getChildCount() > 0) linearLayout.removeAllViews();
-
-        for (String value : mValues) {
-            try {
-                View v = mInflater.inflate(R.layout.app_grid_item, null);
-                ComponentName componentName = ComponentName.unflattenFromString(value);
-                Drawable icon = mPm.getActivityIcon(componentName);
-                ((ImageView) v.findViewById(R.id.appIcon)).setImageDrawable(icon);
-                v.setPadding(10, 5, 10, 5);
-                linearLayout.addView(v);
-            } catch (PackageManager.NameNotFoundException e) {
-                Log.e(TAG, "Set app icon", e);
-            }
-        }
-    }
-
-    private void initPreference(Context context) {
-        mContext = context;
-        setLayoutResource(R.layout.preference_selected_apps_view);
-        mPm = context.getPackageManager();
-        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/SecureCheckBoxPreference.java b/src/org/omnirom/omnigears/preference/SecureCheckBoxPreference.java
deleted file mode 100644
index 60e3165..0000000
--- a/src/org/omnirom/omnigears/preference/SecureCheckBoxPreference.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2013 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 org.omnirom.omnigears.preference;
-
-import android.content.Context;
-import android.support.v7.preference.CheckBoxPreference;
-import android.provider.Settings;
-import android.util.AttributeSet;
-
-public class SecureCheckBoxPreference extends CheckBoxPreference {
-    public SecureCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public SecureCheckBoxPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public SecureCheckBoxPreference(Context context) {
-        super(context, null);
-    }
-
-    @Override
-    protected boolean persistBoolean(boolean value) {
-        if (shouldPersist()) {
-            if (value == getPersistedBoolean(!value)) {
-                // It's already there, so the same as persisting
-                return true;
-            }
-
-            Settings.Secure.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-
-        return Settings.Secure.getInt(getContext().getContentResolver(),
-                getKey(), defaultReturnValue ? 1 : 0) != 0;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        setChecked(Settings.Secure.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
-                : (Boolean) defaultValue);
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/SecureSettingSwitchPreference.java b/src/org/omnirom/omnigears/preference/SecureSettingSwitchPreference.java
deleted file mode 100644
index b55f347..0000000
--- a/src/org/omnirom/omnigears/preference/SecureSettingSwitchPreference.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2015 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 org.omnirom.omnigears.preference;
-
-import android.content.Context;
-import android.support.v14.preference.SwitchPreference;
-import android.util.AttributeSet;
-
-import android.provider.Settings;
-
-public class SecureSettingSwitchPreference extends SwitchPreference {
-    public SecureSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public SecureSettingSwitchPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public SecureSettingSwitchPreference(Context context) {
-        super(context, null);
-    }
-
-    @Override
-    protected boolean persistBoolean(boolean value) {
-        if (shouldPersist()) {
-            if (value == getPersistedBoolean(!value)) {
-                // It's already there, so the same as persisting
-                return true;
-            }
-            Settings.Secure.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-        return Settings.Secure.getInt(getContext().getContentResolver(),
-                getKey(), defaultReturnValue ? 1 : 0) != 0;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        setChecked(Settings.Secure.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
-                : (Boolean) defaultValue);
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/SeekBarPreference.java b/src/org/omnirom/omnigears/preference/SeekBarPreference.java
deleted file mode 100644
index 260ae96..0000000
--- a/src/org/omnirom/omnigears/preference/SeekBarPreference.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
-** Copyright 2013, The ChameleonOS Open Source Project
-** Copyright 2016, The OmniROM 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 org.omnirom.omnigears.preference;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-import com.android.settings.R;
-
-public class SeekBarPreference extends Preference implements OnSeekBarChangeListener {
-
-    private final String TAG = getClass().getName();
-
-    private static final String ANDROIDNS = "http://schemas.android.com/apk/res/android";
-    private static final String SETTINGS = "http://schemas.android.com/apk/res/com.android.settings";
-    private static final int DEFAULT_VALUE = 50;
-
-    private int mMaxValue      = 100;
-    private int mMinValue      = 0;
-    private int mInterval      = 1;
-    private int mCurrentValue;
-    private String mUnitsLeft  = "";
-    private String mUnitsRight = "";
-    private SeekBar mSeekBar;
-    private TextView mStatusText;
-
-    public SeekBarPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        initPreference(context, attrs);
-    }
-
-    public SeekBarPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        initPreference(context, attrs);
-    }
-
-    private void initPreference(Context context, AttributeSet attrs) {
-        setValuesFromXml(attrs);
-        setLayoutResource(R.layout.preference_seek_bar);
-    }
-
-    private void setValuesFromXml(AttributeSet attrs) {
-        final TypedArray typedArray = getContext().obtainStyledAttributes(
-                      attrs, R.styleable.SeekBarPreference);
-
-        mMaxValue = attrs.getAttributeIntValue(ANDROIDNS, "max", 100);
-        mMinValue = attrs.getAttributeIntValue(SETTINGS, "min", 0);
-        mUnitsLeft = getAttributeStringValue(attrs, SETTINGS, "unitsLeft", "");
-        String units = getAttributeStringValue(attrs, SETTINGS, "units", "");
-        mUnitsRight = getAttributeStringValue(attrs, SETTINGS, "unitsRight", units);
-
-        Integer id = typedArray.getResourceId(R.styleable.SeekBarPreference_unitsRight, 0);
-        if (id > 0) {
-            mUnitsRight = getContext().getResources().getString(id);
-        }
-        id = typedArray.getResourceId(R.styleable.SeekBarPreference_unitsLeft, 0);
-        if (id > 0) {
-            mUnitsLeft = getContext().getResources().getString(id);
-        }
-
-        try {
-            String newInterval = attrs.getAttributeValue(SETTINGS, "interval");
-            if(newInterval != null)
-                mInterval = Integer.parseInt(newInterval);
-        } catch(Exception e) {
-            Log.e(TAG, "Invalid interval value", e);
-        }
-        typedArray.recycle();
-    }
-
-    private String getAttributeStringValue(AttributeSet attrs, String namespace, String name, String defaultValue) {
-        String value = attrs.getAttributeValue(namespace, name);
-        if(value == null) {
-            value = defaultValue;
-        }
-        return value;
-    }
-
-    @Override
-    public void onDependencyChanged(Preference dependency, boolean disableDependent) {
-        super.onDependencyChanged(dependency, disableDependent);
-        this.setShouldDisableView(true);
-        if (mSeekBar != null) {
-            mSeekBar.setEnabled(!disableDependent);
-        }
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-
-        mSeekBar = (SeekBar) holder.findViewById(R.id.seekbar);
-        mSeekBar.setMax(mMaxValue - mMinValue);
-        mSeekBar.setProgress(mCurrentValue - mMinValue);
-        mSeekBar.setOnSeekBarChangeListener(this);
-        mSeekBar.setEnabled(isEnabled());
-
-        mStatusText = (TextView)holder.findViewById(R.id.seekBarPrefValue);
-        mStatusText.setText(String.valueOf(mCurrentValue));
-        mStatusText.setMinimumWidth(30);
-
-        TextView unitsRight = (TextView)holder.findViewById(R.id.seekBarPrefUnitsRight);
-        unitsRight.setText(mUnitsRight);
-        TextView unitsLeft = (TextView)holder.findViewById(R.id.seekBarPrefUnitsLeft);
-        unitsLeft.setText(mUnitsLeft);
-    }
-
-    @Override
-    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-        int newValue = progress + mMinValue;
-
-        if(newValue > mMaxValue) {
-            newValue = mMaxValue;
-        } else if(newValue < mMinValue) {
-            newValue = mMinValue;
-        } else if(mInterval != 1 && newValue % mInterval != 0) {
-            newValue = Math.round(((float)newValue)/mInterval)*mInterval;
-        }
-
-        // change rejected, revert to the previous value
-        if (!callChangeListener(newValue)) {
-            seekBar.setProgress(mCurrentValue - mMinValue);
-            return;
-        }
-
-        // change accepted, store it
-        mCurrentValue = newValue;
-        mStatusText.setText(String.valueOf(newValue));
-        persistInt(newValue);
-    }
-
-    @Override
-    public void onStartTrackingTouch(SeekBar seekBar) {}
-
-    @Override
-    public void onStopTrackingTouch(SeekBar seekBar) {
-        notifyChanged();
-    }
-
-    @Override
-    protected Object onGetDefaultValue(TypedArray ta, int index){
-        int defaultValue = ta.getInt(index, DEFAULT_VALUE);
-        return defaultValue;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        if (restoreValue) {
-            mCurrentValue = getPersistedInt(mCurrentValue);
-        } else {
-            int temp = 0;
-            try {
-                temp = (Integer)defaultValue;
-            } catch(Exception ex) {
-                Log.e(TAG, "Invalid default value: " + defaultValue.toString());
-            }
-            persistInt(temp);
-            mCurrentValue = temp;
-        }
-    }
-
-    public void setValue(int value) {
-        mCurrentValue = value;
-    }
-
-    public void setMaxValue(int value) {
-        mMaxValue = value;
-        if (mSeekBar != null) {
-            mSeekBar.setMax(mMaxValue - mMinValue);
-        }
-    }
-
-    public void setMinValue(int value) {
-        mMinValue = value;
-        if (mSeekBar != null) {
-            mSeekBar.setMax(mMaxValue - mMinValue);
-        }
-    }
-
-    @Override
-    public void setEnabled (boolean enabled) {
-        if (mSeekBar != null) {
-            mSeekBar.setEnabled(enabled);
-        }
-        super.setEnabled(enabled);
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/SystemCheckBoxPreference.java b/src/org/omnirom/omnigears/preference/SystemCheckBoxPreference.java
deleted file mode 100644
index 9c4a852..0000000
--- a/src/org/omnirom/omnigears/preference/SystemCheckBoxPreference.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2013 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 org.omnirom.omnigears.preference;
-
-import android.content.Context;
-import android.support.v7.preference.CheckBoxPreference;
-import android.provider.Settings;
-import android.util.AttributeSet;
-
-public class SystemCheckBoxPreference extends CheckBoxPreference {
-    public SystemCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public SystemCheckBoxPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public SystemCheckBoxPreference(Context context) {
-        super(context, null);
-    }
-
-    @Override
-    protected boolean persistBoolean(boolean value) {
-        if (shouldPersist()) {
-            if (value == getPersistedBoolean(!value)) {
-                // It's already there, so the same as persisting
-                return true;
-            }
-
-            Settings.System.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-
-        return Settings.System.getInt(getContext().getContentResolver(),
-                getKey(), defaultReturnValue ? 1 : 0) != 0;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        setChecked(Settings.System.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
-                : (Boolean) defaultValue);
-    }
-}
diff --git a/src/org/omnirom/omnigears/preference/SystemSettingSwitchPreference.java b/src/org/omnirom/omnigears/preference/SystemSettingSwitchPreference.java
deleted file mode 100644
index 17322d6..0000000
--- a/src/org/omnirom/omnigears/preference/SystemSettingSwitchPreference.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2013 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 org.omnirom.omnigears.preference;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
-import android.util.AttributeSet;
-
-public class SystemSettingSwitchPreference extends SwitchPreference {
-    public SystemSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public SystemSettingSwitchPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public SystemSettingSwitchPreference(Context context) {
-        super(context, null);
-    }
-
-    @Override
-    protected boolean persistBoolean(boolean value) {
-        if (shouldPersist()) {
-            if (value == getPersistedBoolean(!value)) {
-                // It's already there, so the same as persisting
-                return true;
-            }
-            Settings.System.putInt(getContext().getContentResolver(), getKey(), value ? 1 : 0);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-        return Settings.System.getInt(getContext().getContentResolver(),
-                getKey(), defaultReturnValue ? 1 : 0) != 0;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        setChecked(Settings.System.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
-                : (Boolean) defaultValue);
-    }
-}
diff --git a/src/org/omnirom/omnigears/service/EventServiceSettings.java b/src/org/omnirom/omnigears/service/EventServiceSettings.java
index 99aafb8..2dabdbf 100644
--- a/src/org/omnirom/omnigears/service/EventServiceSettings.java
+++ b/src/org/omnirom/omnigears/service/EventServiceSettings.java
@@ -37,9 +37,9 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
-import org.omnirom.omnigears.preference.AppMultiSelectListPreference;
-import org.omnirom.omnigears.preference.ScrollAppsViewPreference;
-import org.omnirom.omnigears.preference.SeekBarPreference;
+import org.omnirom.omnilib.preference.AppMultiSelectListPreference;
+import org.omnirom.omnilib.preference.ScrollAppsViewPreference;
+import org.omnirom.omnilib.preference.SeekBarPreference;
 
 import java.util.Arrays;
 import java.util.ArrayList;
diff --git a/src/org/omnirom/omnigears/ui/AlphaPatternDrawable.java b/src/org/omnirom/omnigears/ui/AlphaPatternDrawable.java
deleted file mode 100644
index dbe4b77..0000000
--- a/src/org/omnirom/omnigears/ui/AlphaPatternDrawable.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2010 Daniel Nilsson
- * Copyright (C) 2012 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 org.omnirom.omnigears.ui;
-
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.Bitmap.Config;
-import android.graphics.drawable.Drawable;
-
-/**
- * This drawable that draws a simple white and gray chess board pattern. It's
- * pattern you will often see as a background behind a partly transparent image
- * in many applications.
- *
- * @author Daniel Nilsson
- */
-public class AlphaPatternDrawable extends Drawable {
-
-    private int mRectangleSize = 10;
-
-    private Paint mPaint = new Paint();
-    private Paint mPaintWhite = new Paint();
-    private Paint mPaintGray = new Paint();
-
-    private int numRectanglesHorizontal;
-    private int numRectanglesVertical;
-
-    /**
-     * Bitmap in which the pattern will be cached.
-     */
-    private Bitmap mBitmap;
-
-    public AlphaPatternDrawable(int rectangleSize) {
-        mRectangleSize = rectangleSize;
-        mPaintWhite.setColor(0xffffffff);
-        mPaintGray.setColor(0xffcbcbcb);
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        if (mBitmap != null) {
-            canvas.drawBitmap(mBitmap, null, getBounds(), mPaint);
-        }
-    }
-
-    @Override
-    public int getOpacity() {
-        return 0;
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        throw new UnsupportedOperationException("Alpha is not supported by this drawwable.");
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter cf) {
-        throw new UnsupportedOperationException("ColorFilter is not supported by this drawwable.");
-    }
-
-    @Override
-    protected void onBoundsChange(Rect bounds) {
-        super.onBoundsChange(bounds);
-
-        int height = bounds.height();
-        int width = bounds.width();
-
-        numRectanglesHorizontal = (int) Math.ceil((width / mRectangleSize));
-        numRectanglesVertical = (int) Math.ceil(height / mRectangleSize);
-
-        generatePatternBitmap();
-    }
-
-    /**
-     * This will generate a bitmap with the pattern as big as the rectangle we
-     * were allow to draw on. We do this to cache the bitmap so we don't need
-     * to recreate it each time draw() is called since it takes a few
-     * milliseconds.
-     */
-    private void generatePatternBitmap() {
-
-        if (getBounds().width() <= 0 || getBounds().height() <= 0) {
-            return;
-        }
-
-        mBitmap = Bitmap.createBitmap(getBounds().width(), getBounds().height(), Config.ARGB_8888);
-        Canvas canvas = new Canvas(mBitmap);
-
-        Rect r = new Rect();
-        boolean verticalStartWhite = true;
-        for (int i = 0; i <= numRectanglesVertical; i++) {
-            boolean isWhite = verticalStartWhite;
-            for (int j = 0; j <= numRectanglesHorizontal; j++) {
-                r.top = i * mRectangleSize;
-                r.left = j * mRectangleSize;
-                r.bottom = r.top + mRectangleSize;
-                r.right = r.left + mRectangleSize;
-
-                canvas.drawRect(r, isWhite ? mPaintWhite : mPaintGray);
-
-                isWhite = !isWhite;
-            }
-
-            verticalStartWhite = !verticalStartWhite;
-        }
-    }
-}
diff --git a/src/org/omnirom/omnigears/ui/ColorPanelView.java b/src/org/omnirom/omnigears/ui/ColorPanelView.java
deleted file mode 100644
index 5941bf1..0000000
--- a/src/org/omnirom/omnigears/ui/ColorPanelView.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2010 Daniel Nilsson
- * Copyright (C) 2012 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 org.omnirom.omnigears.ui;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.util.AttributeSet;
-import android.view.View;
-
-/**
- * This class draws a panel which which will be filled with a color which can be
- * set. It can be used to show the currently selected color which you will get
- * from the {@link ColorPickerView}.
- *
- * @author Daniel Nilsson
- */
-public class ColorPanelView extends View {
-
-    /**
-     * The width in pixels of the border surrounding the color panel.
-     */
-    private final static float BORDER_WIDTH_PX = 1;
-
-    private static float mDensity = 1f;
-
-    private int mBorderColor = 0xff6E6E6E;
-    private int mColor = 0xff000000;
-
-    private Paint mBorderPaint;
-    private Paint mColorPaint;
-
-    private RectF mDrawingRect;
-    private RectF mColorRect;
-
-    private AlphaPatternDrawable mAlphaPattern;
-
-    public ColorPanelView(Context context) {
-        this(context, null);
-    }
-
-    public ColorPanelView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ColorPanelView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        init();
-    }
-
-    private void init() {
-        mBorderPaint = new Paint();
-        mColorPaint = new Paint();
-        mDensity = getContext().getResources().getDisplayMetrics().density;
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-
-        final RectF rect = mColorRect;
-
-        if (BORDER_WIDTH_PX > 0) {
-            mBorderPaint.setColor(mBorderColor);
-            canvas.drawRect(mDrawingRect, mBorderPaint);
-        }
-
-        if (mAlphaPattern != null) {
-            mAlphaPattern.draw(canvas);
-        }
-
-        mColorPaint.setColor(mColor);
-
-        canvas.drawRect(rect, mColorPaint);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
-        int width = MeasureSpec.getSize(widthMeasureSpec);
-        int height = MeasureSpec.getSize(heightMeasureSpec);
-
-        setMeasuredDimension(width, height);
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-
-        mDrawingRect = new RectF();
-        mDrawingRect.left = getPaddingLeft();
-        mDrawingRect.right = w - getPaddingRight();
-        mDrawingRect.top = getPaddingTop();
-        mDrawingRect.bottom = h - getPaddingBottom();
-
-        setUpColorRect();
-
-    }
-
-    private void setUpColorRect() {
-        final RectF dRect = mDrawingRect;
-
-        float left = dRect.left + BORDER_WIDTH_PX;
-        float top = dRect.top + BORDER_WIDTH_PX;
-        float bottom = dRect.bottom - BORDER_WIDTH_PX;
-        float right = dRect.right - BORDER_WIDTH_PX;
-
-        mColorRect = new RectF(left, top, right, bottom);
-
-        mAlphaPattern = new AlphaPatternDrawable((int) (5 * mDensity));
-
-        mAlphaPattern.setBounds(Math.round(mColorRect.left),
-                Math.round(mColorRect.top),
-                Math.round(mColorRect.right),
-                Math.round(mColorRect.bottom));
-
-    }
-
-    /**
-     * Set the color that should be shown by this view.
-     *
-     * @param color
-     */
-    public void setColor(int color) {
-        mColor = color;
-        invalidate();
-    }
-
-    /**
-     * Get the color currently show by this view.
-     *
-     * @return
-     */
-    public int getColor() {
-        return mColor;
-    }
-
-    /**
-     * Set the color of the border surrounding the panel.
-     *
-     * @param color
-     */
-    public void setBorderColor(int color) {
-        mBorderColor = color;
-        invalidate();
-    }
-
-    /**
-     * Get the color of the border surrounding the panel.
-     */
-    public int getBorderColor() {
-        return mBorderColor;
-    }
-
-}
diff --git a/src/org/omnirom/omnigears/ui/ColorPickerView.java b/src/org/omnirom/omnigears/ui/ColorPickerView.java
deleted file mode 100644
index 72316f3..0000000
--- a/src/org/omnirom/omnigears/ui/ColorPickerView.java
+++ /dev/null
@@ -1,841 +0,0 @@
-/*
- * Copyright (C) 2010 Daniel Nilsson
- * Copyright (C) 2012 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 org.omnirom.omnigears.ui;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ComposeShader;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Point;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.graphics.Paint.Align;
-import android.graphics.Paint.Style;
-import android.graphics.Shader.TileMode;
-import android.os.Build;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-/**
- * Displays a color picker to the user and allow them to select a color. A
- * slider for the alpha channel is also available. Enable it by setting
- * setAlphaSliderVisible(boolean) to true.
- *
- * @author Daniel Nilsson
- */
-public class ColorPickerView extends View {
-
-    public interface OnColorChangedListener {
-        public void onColorChanged(int color);
-    }
-
-    private final static int PANEL_SAT_VAL = 0;
-    private final static int PANEL_HUE = 1;
-    private final static int PANEL_ALPHA = 2;
-
-    /**
-     * The width in pixels of the border surrounding all color panels.
-     */
-    private final static float BORDER_WIDTH_PX = 1;
-
-    /**
-     * The width in dp of the hue panel.
-     */
-    private float HUE_PANEL_WIDTH = 30f;
-    /**
-     * The height in dp of the alpha panel
-     */
-    private float ALPHA_PANEL_HEIGHT = 20f;
-    /**
-     * The distance in dp between the different color panels.
-     */
-    private float PANEL_SPACING = 10f;
-    /**
-     * The radius in dp of the color palette tracker circle.
-     */
-    private float PALETTE_CIRCLE_TRACKER_RADIUS = 5f;
-    /**
-     * The dp which the tracker of the hue or alpha panel will extend outside of
-     * its bounds.
-     */
-    private float RECTANGLE_TRACKER_OFFSET = 2f;
-
-    private static float mDensity = 1f;
-
-    private OnColorChangedListener mListener;
-
-    private Paint mSatValPaint;
-    private Paint mSatValTrackerPaint;
-
-    private Paint mHuePaint;
-    private Paint mHueTrackerPaint;
-
-    private Paint mAlphaPaint;
-    private Paint mAlphaTextPaint;
-
-    private Paint mBorderPaint;
-
-    private Shader mValShader;
-    private Shader mSatShader;
-    private Shader mHueShader;
-    private Shader mAlphaShader;
-
-    private int mAlpha = 0xff;
-    private float mHue = 360f;
-    private float mSat = 0f;
-    private float mVal = 0f;
-
-    private String mAlphaSliderText = "Alpha";
-    private int mSliderTrackerColor = 0xff1c1c1c;
-    private int mBorderColor = 0xff6E6E6E;
-    private boolean mShowAlphaPanel = false;
-
-    /*
-     * To remember which panel that has the "focus" when processing hardware
-     * button data.
-     */
-    private int mLastTouchedPanel = PANEL_SAT_VAL;
-
-    /**
-     * Offset from the edge we must have or else the finger tracker will get
-     * clipped when it is drawn outside of the view.
-     */
-    private float mDrawingOffset;
-
-    /*
-     * Distance form the edges of the view of where we are allowed to draw.
-     */
-    private RectF mDrawingRect;
-
-    private RectF mSatValRect;
-    private RectF mHueRect;
-    private RectF mAlphaRect;
-
-    private AlphaPatternDrawable mAlphaPattern;
-
-    private Point mStartTouchPoint = null;
-
-    public ColorPickerView(Context context) {
-        this(context, null);
-    }
-
-    public ColorPickerView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ColorPickerView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init();
-    }
-
-    private void init() {
-        mDensity = getContext().getResources().getDisplayMetrics().density;
-        PALETTE_CIRCLE_TRACKER_RADIUS *= mDensity;
-        RECTANGLE_TRACKER_OFFSET *= mDensity;
-        HUE_PANEL_WIDTH *= mDensity;
-        ALPHA_PANEL_HEIGHT *= mDensity;
-        PANEL_SPACING = PANEL_SPACING * mDensity;
-
-        mDrawingOffset = calculateRequiredOffset();
-        initPaintTools();
-
-        // Needed for receiving track ball motion events.
-        setFocusableInTouchMode(true);
-        setFocusable(true);
-        setClickable(true);
-    }
-
-    private void initPaintTools() {
-        mSatValPaint = new Paint();
-        mSatValTrackerPaint = new Paint();
-        mHuePaint = new Paint();
-        mHueTrackerPaint = new Paint();
-        mAlphaPaint = new Paint();
-        mAlphaTextPaint = new Paint();
-        mBorderPaint = new Paint();
-
-        mSatValTrackerPaint.setStyle(Style.STROKE);
-        mSatValTrackerPaint.setStrokeWidth(2f * mDensity);
-        mSatValTrackerPaint.setAntiAlias(true);
-
-        mHueTrackerPaint.setColor(mSliderTrackerColor);
-        mHueTrackerPaint.setStyle(Style.STROKE);
-        mHueTrackerPaint.setStrokeWidth(2f * mDensity);
-        mHueTrackerPaint.setAntiAlias(true);
-
-        mAlphaTextPaint.setColor(0xff1c1c1c);
-        mAlphaTextPaint.setTextSize(14f * mDensity);
-        mAlphaTextPaint.setAntiAlias(true);
-        mAlphaTextPaint.setTextAlign(Align.CENTER);
-        mAlphaTextPaint.setFakeBoldText(true);
-    }
-
-    private float calculateRequiredOffset() {
-        float offset = Math.max(PALETTE_CIRCLE_TRACKER_RADIUS, RECTANGLE_TRACKER_OFFSET);
-        offset = Math.max(offset, BORDER_WIDTH_PX * mDensity);
-
-        return offset * 1.5f;
-    }
-
-    private int[] buildHueColorArray() {
-        int[] hue = new int[361];
-
-        int count = 0;
-        for (int i = hue.length - 1; i >= 0; i--, count++) {
-            hue[count] = Color.HSVToColor(new float[] {
-                    i, 1f, 1f
-            });
-        }
-        return hue;
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        if (mDrawingRect.width() <= 0 || mDrawingRect.height() <= 0) {
-            return;
-        }
-        drawSatValPanel(canvas);
-        drawHuePanel(canvas);
-        drawAlphaPanel(canvas);
-    }
-
-    private void drawSatValPanel(Canvas canvas) {
-        final RectF rect = mSatValRect;
-        int rgb = Color.HSVToColor(new float[] {
-                mHue, 1f, 1f
-        });
-
-        if (BORDER_WIDTH_PX > 0) {
-            mBorderPaint.setColor(mBorderColor);
-            canvas.drawRect(mDrawingRect.left, mDrawingRect.top, rect.right + BORDER_WIDTH_PX,
-                    rect.bottom + BORDER_WIDTH_PX, mBorderPaint);
-        }
-
-        // On Honeycomb+ we need to use software rendering to create the shader properly
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
-            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-        }
-
-        // Get the overlaying gradients ready and create the ComposeShader
-        if (mValShader == null) {
-            mValShader = new LinearGradient(rect.left, rect.top, rect.left, rect.bottom,
-                    0xffffffff, 0xff000000, TileMode.CLAMP);
-        }
-        mSatShader = new LinearGradient(rect.left, rect.top, rect.right, rect.top,
-                0xffffffff, rgb, TileMode.CLAMP);
-        ComposeShader mShader = new ComposeShader(mValShader, mSatShader, Mode.MULTIPLY);
-        mSatValPaint.setShader(mShader);
-        canvas.drawRect(rect, mSatValPaint);
-
-        Point p = satValToPoint(mSat, mVal);
-        mSatValTrackerPaint.setColor(0xff000000);
-        canvas.drawCircle(p.x, p.y, PALETTE_CIRCLE_TRACKER_RADIUS - 1f * mDensity,
-                mSatValTrackerPaint);
-
-        mSatValTrackerPaint.setColor(0xffdddddd);
-        canvas.drawCircle(p.x, p.y, PALETTE_CIRCLE_TRACKER_RADIUS, mSatValTrackerPaint);
-    }
-
-    private void drawHuePanel(Canvas canvas) {
-        final RectF rect = mHueRect;
-
-        if (BORDER_WIDTH_PX > 0) {
-            mBorderPaint.setColor(mBorderColor);
-            canvas.drawRect(rect.left - BORDER_WIDTH_PX,
-                    rect.top - BORDER_WIDTH_PX,
-                    rect.right + BORDER_WIDTH_PX,
-                    rect.bottom + BORDER_WIDTH_PX,
-                    mBorderPaint);
-        }
-
-        if (mHueShader == null) {
-            mHueShader = new LinearGradient(rect.left, rect.top, rect.left, rect.bottom,
-                    buildHueColorArray(), null, TileMode.CLAMP);
-            mHuePaint.setShader(mHueShader);
-        }
-
-        canvas.drawRect(rect, mHuePaint);
-
-        float rectHeight = 4 * mDensity / 2;
-
-        Point p = hueToPoint(mHue);
-
-        RectF r = new RectF();
-        r.left = rect.left - RECTANGLE_TRACKER_OFFSET;
-        r.right = rect.right + RECTANGLE_TRACKER_OFFSET;
-        r.top = p.y - rectHeight;
-        r.bottom = p.y + rectHeight;
-
-        canvas.drawRoundRect(r, 2, 2, mHueTrackerPaint);
-
-    }
-
-    private void drawAlphaPanel(Canvas canvas) {
-        if (!mShowAlphaPanel || mAlphaRect == null || mAlphaPattern == null) {
-            return;
-        }
-
-        final RectF rect = mAlphaRect;
-
-        if (BORDER_WIDTH_PX > 0) {
-            mBorderPaint.setColor(mBorderColor);
-            canvas.drawRect(rect.left - BORDER_WIDTH_PX,
-                    rect.top - BORDER_WIDTH_PX,
-                    rect.right + BORDER_WIDTH_PX,
-                    rect.bottom + BORDER_WIDTH_PX,
-                    mBorderPaint);
-        }
-
-        mAlphaPattern.draw(canvas);
-
-        float[] hsv = new float[] {
-                mHue, mSat, mVal
-        };
-        int color = Color.HSVToColor(hsv);
-        int acolor = Color.HSVToColor(0, hsv);
-
-        mAlphaShader = new LinearGradient(rect.left, rect.top, rect.right, rect.top,
-                color, acolor, TileMode.CLAMP);
-
-        mAlphaPaint.setShader(mAlphaShader);
-
-        canvas.drawRect(rect, mAlphaPaint);
-
-        if (mAlphaSliderText != null && mAlphaSliderText != "") {
-            canvas.drawText(mAlphaSliderText, rect.centerX(), rect.centerY() + 4 * mDensity,
-                    mAlphaTextPaint);
-        }
-
-        float rectWidth = 4 * mDensity / 2;
-        Point p = alphaToPoint(mAlpha);
-
-        RectF r = new RectF();
-        r.left = p.x - rectWidth;
-        r.right = p.x + rectWidth;
-        r.top = rect.top - RECTANGLE_TRACKER_OFFSET;
-        r.bottom = rect.bottom + RECTANGLE_TRACKER_OFFSET;
-
-        canvas.drawRoundRect(r, 2, 2, mHueTrackerPaint);
-    }
-
-    private Point hueToPoint(float hue) {
-        final RectF rect = mHueRect;
-        final float height = rect.height();
-
-        Point p = new Point();
-        p.y = (int) (height - (hue * height / 360f) + rect.top);
-        p.x = (int) rect.left;
-        return p;
-    }
-
-    private Point satValToPoint(float sat, float val) {
-
-        final RectF rect = mSatValRect;
-        final float height = rect.height();
-        final float width = rect.width();
-
-        Point p = new Point();
-
-        p.x = (int) (sat * width + rect.left);
-        p.y = (int) ((1f - val) * height + rect.top);
-
-        return p;
-    }
-
-    private Point alphaToPoint(int alpha) {
-        final RectF rect = mAlphaRect;
-        final float width = rect.width();
-
-        Point p = new Point();
-        p.x = (int) (width - (alpha * width / 0xff) + rect.left);
-        p.y = (int) rect.top;
-        return p;
-    }
-
-    private float[] pointToSatVal(float x, float y) {
-        final RectF rect = mSatValRect;
-        float[] result = new float[2];
-        float width = rect.width();
-        float height = rect.height();
-
-        if (x < rect.left) {
-            x = 0f;
-        } else if (x > rect.right) {
-            x = width;
-        } else {
-            x = x - rect.left;
-        }
-
-        if (y < rect.top) {
-            y = 0f;
-        } else if (y > rect.bottom) {
-            y = height;
-        } else {
-            y = y - rect.top;
-        }
-
-        result[0] = 1.f / width * x;
-        result[1] = 1.f - (1.f / height * y);
-        return result;
-    }
-
-    private float pointToHue(float y) {
-        final RectF rect = mHueRect;
-        float height = rect.height();
-
-        if (y < rect.top) {
-            y = 0f;
-        } else if (y > rect.bottom) {
-            y = height;
-        } else {
-            y = y - rect.top;
-        }
-        return 360f - (y * 360f / height);
-    }
-
-    private int pointToAlpha(int x) {
-        final RectF rect = mAlphaRect;
-        final int width = (int) rect.width();
-
-        if (x < rect.left) {
-            x = 0;
-        } else if (x > rect.right) {
-            x = width;
-        } else {
-            x = x - (int) rect.left;
-        }
-        return 0xff - (x * 0xff / width);
-    }
-
-    @Override
-    public boolean onTrackballEvent(MotionEvent event) {
-        float x = event.getX();
-        float y = event.getY();
-        boolean update = false;
-
-        if (event.getAction() == MotionEvent.ACTION_MOVE) {
-            switch (mLastTouchedPanel) {
-                case PANEL_SAT_VAL:
-                    float sat,
-                    val;
-                    sat = mSat + x / 50f;
-                    val = mVal - y / 50f;
-                    if (sat < 0f) {
-                        sat = 0f;
-                    } else if (sat > 1f) {
-                        sat = 1f;
-                    }
-
-                    if (val < 0f) {
-                        val = 0f;
-                    } else if (val > 1f) {
-                        val = 1f;
-                    }
-                    mSat = sat;
-                    mVal = val;
-                    update = true;
-                    break;
-                case PANEL_HUE:
-                    float hue = mHue - y * 10f;
-                    if (hue < 0f) {
-                        hue = 0f;
-                    } else if (hue > 360f) {
-                        hue = 360f;
-                    }
-                    mHue = hue;
-                    update = true;
-                    break;
-                case PANEL_ALPHA:
-                    if (!mShowAlphaPanel || mAlphaRect == null) {
-                        update = false;
-                    } else {
-                        int alpha = (int) (mAlpha - x * 10);
-                        if (alpha < 0) {
-                            alpha = 0;
-                        } else if (alpha > 0xff) {
-                            alpha = 0xff;
-                        }
-                        mAlpha = alpha;
-                        update = true;
-                    }
-                    break;
-            }
-        }
-
-        if (update) {
-            if (mListener != null) {
-                mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[] {
-                        mHue, mSat, mVal
-                }));
-            }
-            invalidate();
-            return true;
-        }
-        return super.onTrackballEvent(event);
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        boolean update = false;
-
-        switch (event.getAction()) {
-            case MotionEvent.ACTION_DOWN:
-                mStartTouchPoint = new Point((int) event.getX(), (int) event.getY());
-                update = moveTrackersIfNeeded(event);
-                break;
-            case MotionEvent.ACTION_MOVE:
-                update = moveTrackersIfNeeded(event);
-                break;
-            case MotionEvent.ACTION_UP:
-                mStartTouchPoint = null;
-                update = moveTrackersIfNeeded(event);
-                break;
-        }
-
-        if (update) {
-            requestFocus();
-            if (mListener != null) {
-                mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[] {
-                        mHue, mSat, mVal
-                }));
-            }
-            invalidate();
-            return true;
-        }
-
-        return super.onTouchEvent(event);
-    }
-
-    private boolean moveTrackersIfNeeded(MotionEvent event) {
-
-        if (mStartTouchPoint == null)
-            return false;
-
-        boolean update = false;
-        int startX = mStartTouchPoint.x;
-        int startY = mStartTouchPoint.y;
-
-        if (mHueRect.contains(startX, startY)) {
-            mLastTouchedPanel = PANEL_HUE;
-            mHue = pointToHue(event.getY());
-            update = true;
-        } else if (mSatValRect.contains(startX, startY)) {
-            mLastTouchedPanel = PANEL_SAT_VAL;
-            float[] result = pointToSatVal(event.getX(), event.getY());
-            mSat = result[0];
-            mVal = result[1];
-            update = true;
-        } else if (mAlphaRect != null && mAlphaRect.contains(startX, startY)) {
-            mLastTouchedPanel = PANEL_ALPHA;
-            mAlpha = pointToAlpha((int) event.getX());
-            update = true;
-        }
-
-        return update;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int width = 0;
-        int height = 0;
-
-        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-
-        int widthAllowed = MeasureSpec.getSize(widthMeasureSpec);
-        int heightAllowed = MeasureSpec.getSize(heightMeasureSpec);
-
-        widthAllowed = chooseWidth(widthMode, widthAllowed);
-        heightAllowed = chooseHeight(heightMode, heightAllowed);
-
-        if (!mShowAlphaPanel) {
-            height = (int) (widthAllowed - PANEL_SPACING - HUE_PANEL_WIDTH);
-
-            // If calculated height (based on the width) is more than the
-            // allowed height.
-            if (height > heightAllowed && heightMode != MeasureSpec.UNSPECIFIED) {
-                height = heightAllowed;
-                width = (int) (height + PANEL_SPACING + HUE_PANEL_WIDTH);
-            } else {
-                width = widthAllowed;
-            }
-        } else {
-
-            width = (int) (heightAllowed - ALPHA_PANEL_HEIGHT + HUE_PANEL_WIDTH);
-
-            if (width > widthAllowed && widthMode != MeasureSpec.UNSPECIFIED) {
-                width = widthAllowed;
-                height = (int) (widthAllowed - HUE_PANEL_WIDTH + ALPHA_PANEL_HEIGHT);
-            } else {
-                height = heightAllowed;
-            }
-        }
-        setMeasuredDimension(width, height);
-    }
-
-    private int chooseWidth(int mode, int size) {
-        if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {
-            return size;
-        } else { // (mode == MeasureSpec.UNSPECIFIED)
-            return getPrefferedWidth();
-        }
-    }
-
-    private int chooseHeight(int mode, int size) {
-        if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {
-            return size;
-        } else { // (mode == MeasureSpec.UNSPECIFIED)
-            return getPrefferedHeight();
-        }
-    }
-
-    private int getPrefferedWidth() {
-        int width = getPrefferedHeight();
-        if (mShowAlphaPanel) {
-            width -= (PANEL_SPACING + ALPHA_PANEL_HEIGHT);
-        }
-        return (int) (width + HUE_PANEL_WIDTH + PANEL_SPACING);
-    }
-
-    private int getPrefferedHeight() {
-        int height = (int) (200 * mDensity);
-        if (mShowAlphaPanel) {
-            height += PANEL_SPACING + ALPHA_PANEL_HEIGHT;
-        }
-        return height;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-
-        mDrawingRect = new RectF();
-        mDrawingRect.left = mDrawingOffset + getPaddingLeft();
-        mDrawingRect.right = w - mDrawingOffset - getPaddingRight();
-        mDrawingRect.top = mDrawingOffset + getPaddingTop();
-        mDrawingRect.bottom = h - mDrawingOffset - getPaddingBottom();
-
-        setUpSatValRect();
-        setUpHueRect();
-        setUpAlphaRect();
-    }
-
-    private void setUpSatValRect() {
-        final RectF dRect = mDrawingRect;
-        float panelSide = dRect.height() - BORDER_WIDTH_PX * 2;
-
-        if (mShowAlphaPanel) {
-            panelSide -= PANEL_SPACING + ALPHA_PANEL_HEIGHT;
-        }
-
-        float left = dRect.left + BORDER_WIDTH_PX;
-        float top = dRect.top + BORDER_WIDTH_PX;
-        float bottom = top + panelSide;
-        float right = left + panelSide;
-        mSatValRect = new RectF(left, top, right, bottom);
-    }
-
-    private void setUpHueRect() {
-        final RectF dRect = mDrawingRect;
-
-        float left = dRect.right - HUE_PANEL_WIDTH + BORDER_WIDTH_PX;
-        float top = dRect.top + BORDER_WIDTH_PX;
-        float bottom = dRect.bottom - BORDER_WIDTH_PX
-                - (mShowAlphaPanel ? (PANEL_SPACING + ALPHA_PANEL_HEIGHT) : 0);
-        float right = dRect.right - BORDER_WIDTH_PX;
-
-        mHueRect = new RectF(left, top, right, bottom);
-    }
-
-    private void setUpAlphaRect() {
-        if (!mShowAlphaPanel) {
-            return;
-        }
-
-        final RectF dRect = mDrawingRect;
-        float left = dRect.left + BORDER_WIDTH_PX;
-        float top = dRect.bottom - ALPHA_PANEL_HEIGHT + BORDER_WIDTH_PX;
-        float bottom = dRect.bottom - BORDER_WIDTH_PX;
-        float right = dRect.right - BORDER_WIDTH_PX;
-
-        mAlphaRect = new RectF(left, top, right, bottom);
-        mAlphaPattern = new AlphaPatternDrawable((int) (5 * mDensity));
-        mAlphaPattern.setBounds(Math.round(mAlphaRect.left), Math
-                .round(mAlphaRect.top), Math.round(mAlphaRect.right), Math
-                .round(mAlphaRect.bottom));
-    }
-
-    /**
-     * Set a OnColorChangedListener to get notified when the color selected by
-     * the user has changed.
-     *
-     * @param listener
-     */
-    public void setOnColorChangedListener(OnColorChangedListener listener) {
-        mListener = listener;
-    }
-
-    /**
-     * Set the color of the border surrounding all panels.
-     *
-     * @param color
-     */
-    public void setBorderColor(int color) {
-        mBorderColor = color;
-        invalidate();
-    }
-
-    /**
-     * Get the color of the border surrounding all panels.
-     */
-    public int getBorderColor() {
-        return mBorderColor;
-    }
-
-    /**
-     * Get the current color this view is showing.
-     *
-     * @return the current color.
-     */
-    public int getColor() {
-        return Color.HSVToColor(mAlpha, new float[] {
-                mHue, mSat, mVal
-        });
-    }
-
-    /**
-     * Set the color the view should show.
-     *
-     * @param color The color that should be selected.
-     */
-    public void setColor(int color) {
-        setColor(color, false);
-    }
-
-    /**
-     * Set the color this view should show.
-     *
-     * @param color The color that should be selected.
-     * @param callback If you want to get a callback to your
-     *            OnColorChangedListener.
-     */
-    public void setColor(int color, boolean callback) {
-        int alpha = Color.alpha(color);
-        int red = Color.red(color);
-        int blue = Color.blue(color);
-        int green = Color.green(color);
-        float[] hsv = new float[3];
-
-        Color.RGBToHSV(red, green, blue, hsv);
-        mAlpha = alpha;
-        mHue = hsv[0];
-        mSat = hsv[1];
-        mVal = hsv[2];
-
-        if (callback && mListener != null) {
-            mListener.onColorChanged(Color.HSVToColor(mAlpha, new float[] {
-                    mHue, mSat, mVal
-            }));
-        }
-        invalidate();
-    }
-
-    /**
-     * Get the drawing offset of the color picker view. The drawing offset is
-     * the distance from the side of a panel to the side of the view minus the
-     * padding. Useful if you want to have your own panel below showing the
-     * currently selected color and want to align it perfectly.
-     *
-     * @return The offset in pixels.
-     */
-    public float getDrawingOffset() {
-        return mDrawingOffset;
-    }
-
-    /**
-     * Set if the user is allowed to adjust the alpha panel. Default is false.
-     * If it is set to false no alpha will be set.
-     *
-     * @param visible
-     */
-    public void setAlphaSliderVisible(boolean visible) {
-        if (mShowAlphaPanel != visible) {
-            mShowAlphaPanel = visible;
-
-            /*
-             * Reset all shader to force a recreation. Otherwise they will not
-             * look right after the size of the view has changed.
-             */
-            mValShader = null;
-            mSatShader = null;
-            mHueShader = null;
-            mAlphaShader = null;
-            requestLayout();
-        }
-
-    }
-
-    public boolean isAlphaSliderVisible() {
-        return mShowAlphaPanel;
-    }
-
-    public void setSliderTrackerColor(int color) {
-        mSliderTrackerColor = color;
-        mHueTrackerPaint.setColor(mSliderTrackerColor);
-        invalidate();
-    }
-
-    public int getSliderTrackerColor() {
-        return mSliderTrackerColor;
-    }
-
-    /**
-     * Set the text that should be shown in the alpha slider. Set to null to
-     * disable text.
-     *
-     * @param res string resource id.
-     */
-    public void setAlphaSliderText(int res) {
-        String text = getContext().getString(res);
-        setAlphaSliderText(text);
-    }
-
-    /**
-     * Set the text that should be shown in the alpha slider. Set to null to
-     * disable text.
-     *
-     * @param text Text that should be shown.
-     */
-    public void setAlphaSliderText(String text) {
-        mAlphaSliderText = text;
-        invalidate();
-    }
-
-    /**
-     * Get the current value of the text that will be shown in the alpha slider.
-     *
-     * @return
-     */
-    public String getAlphaSliderText() {
-        return mAlphaSliderText;
-    }
-}
