diff --git a/Android.bp b/Android.bp
index 32fc739..f8874d3 100644
--- a/Android.bp
+++ b/Android.bp
@@ -9,6 +9,7 @@
     srcs: ["src/**/*.java"],
 
     static_libs: [
+        "androidx.cardview_cardview",
         "androidx.core_core",
         "androidx.preference_preference",
         "androidx.appcompat_appcompat",
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a03bde3..da8d9ae 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,10 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
      Copyright (C) 2015 The Android Open Source Project
+
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
+
           http://www.apache.org/licenses/LICENSE-2.0
+
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,4 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.bliss.support">
 
+    <uses-sdk
+        android:minSdkVersion="27" />
+
 </manifest>
diff --git a/res/drawable-hdpi/ic_action_set.png b/res/drawable-hdpi/ic_action_set.png
deleted file mode 100644
index 0dc6d83..0000000
--- a/res/drawable-hdpi/ic_action_set.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_action_set.png b/res/drawable-mdpi/ic_action_set.png
deleted file mode 100644
index ed93393..0000000
--- a/res/drawable-mdpi/ic_action_set.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_action_set.png b/res/drawable-xhdpi/ic_action_set.png
deleted file mode 100644
index 40af0ed..0000000
--- a/res/drawable-xhdpi/ic_action_set.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_action_set.png b/res/drawable-xxhdpi/ic_action_set.png
deleted file mode 100644
index 3645383..0000000
--- a/res/drawable-xxhdpi/ic_action_set.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_seekbar_minus.xml b/res/drawable/ic_arrow.xml
similarity index 61%
rename from res/drawable/ic_seekbar_minus.xml
rename to res/drawable/ic_arrow.xml
index b755ee2..d433898 100644
--- a/res/drawable/ic_seekbar_minus.xml
+++ b/res/drawable/ic_arrow.xml
@@ -1,12 +1,9 @@
 <!--
-    Copyright (C) 2016 AICP
-
-    Licensed under the Apache License, Version 2.0 (the "License");
+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.
@@ -14,11 +11,9 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24.0dp"
-    android:height="24.0dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-    <path
-        android:fillColor="?android:attr/colorControlNormal"
-        android:pathData="M19,13H5V11H19V13Z" />
+    android:width="30dp"
+    android:height="30dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+        <path android:fillColor="#000" android:pathData="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z" />
 </vector>
diff --git a/res/drawable/ic_custom_seekbar_minus.xml b/res/drawable/ic_custom_seekbar_minus.xml
deleted file mode 100644
index 6ad8063..0000000
--- a/res/drawable/ic_custom_seekbar_minus.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2018 crDroid Android Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0" >
-    <path
-        android:fillColor="?android:attr/colorControlNormal"
-        android:pathData="M14.102040767669678,13 H0.10204076766967773 V11 H14.102040767669678 V13 z" />
-</vector>
diff --git a/res/drawable/ic_custom_seekbar_plus.xml b/res/drawable/ic_custom_seekbar_plus.xml
deleted file mode 100644
index 26f3b54..0000000
--- a/res/drawable/ic_custom_seekbar_plus.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2018 crDroid Android Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0" >
-    <path
-        android:fillColor="?android:attr/colorControlNormal"
-        android:pathData="M38.0,26.0L26.0,26.0l0.0,12.0l-4.0,0.0L22.0,26.0L10.0,26.0l0.0,-4.0l12.0,0.0L22.0,10.0l4.0,0.0l0.0,12.0l12.0,0.0l0.0,4.0z" />
-</vector>
diff --git a/res/drawable/ic_custom_seekbar_reset.xml b/res/drawable/ic_custom_seekbar_reset.xml
deleted file mode 100644
index 8fc4946..0000000
--- a/res/drawable/ic_custom_seekbar_reset.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2019 Havoc-OS
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorControlNormal" >
-
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M14.123456746339798,12.042328000068665 c0,-0.7430335164070133 -0.6079365134239197,-1.3509700298309326 -1.3509700298309326,-1.3509700298309326 s-1.3509700298309326,0.6079365134239197 -1.3509700298309326,1.3509700298309326 s0.6079365134239197,1.3509700298309326 1.3509700298309326,1.3509700298309326 s1.3509700298309326,-0.6079365134239197 1.3509700298309326,-1.3509700298309326 zM12.772486716508865,5.962962865829468 c-3.3571605241298674,0 -6.079365134239197,2.7222046101093293 -6.079365134239197,6.079365134239197 L4.66666653752327,12.042328000068665 l2.7019400596618652,2.7019400596618652 l2.7019400596618652,-2.7019400596618652 L8.044091612100601,12.042328000068665 c0,-2.6141270077228547 2.1142680966854095,-4.728395104408264 4.728395104408264,-4.728395104408264 s4.728395104408264,2.1142680966854095 4.728395104408264,4.728395104408264 s-2.1142680966854095,4.728395104408264 -4.728395104408264,4.728395104408264 c-1.0199823725223542,0 -1.965661393404007,-0.3309876573085789 -2.742469160556793,-0.8781305193901066 l-0.9591887211799618,0.9726984214782719 C10.097566057443618,17.648853623867033 11.380987585783004,18.12169313430786 12.772486716508865,18.12169313430786 c3.3571605241298674,0 6.079365134239197,-2.7222046101093293 6.079365134239197,-6.079365134239197 s-2.7222046101093293,-6.079365134239197 -6.079365134239197,-6.079365134239197 z" />
-</vector>
diff --git a/res/drawable/ic_reset_color.xml b/res/drawable/ic_reset_color.xml
deleted file mode 100644
index e74e2b6..0000000
--- a/res/drawable/ic_reset_color.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-
-    <path
-        android:pathData="M0 0h24v24H0z" />
-    <path
-        android:fillColor="?android:attr/textColorSecondary"
-        android:pathData="M12.5 8c-2.65 0-5.05 .99 -6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88
-5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z" />
-</vector>
diff --git a/res/drawable/ic_seekbar_plus.xml b/res/drawable/ic_seekbar_plus.xml
deleted file mode 100644
index e4ced7d..0000000
--- a/res/drawable/ic_seekbar_plus.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-    Copyright (C) 2015 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-    <path
-        android:fillColor="?android:attr/colorControlNormal"
-        android:pathData="M38.0,26.0L26.0,26.0l0.0,12.0l-4.0,0.0L22.0,26.0L10.0,26.0l0.0,-4.0l12.0,0.0L22.0,10.0l4.0,0.0l0.0,12.0l12.0,0.0l0.0,4.0z"/>
-</vector>
diff --git a/res/drawable/ic_settings_backup_restore.xml b/res/drawable/ic_settings_backup_restore.xml
index 245b0fc..01f3d61 100644
--- a/res/drawable/ic_settings_backup_restore.xml
+++ b/res/drawable/ic_settings_backup_restore.xml
@@ -1,12 +1,9 @@
 <!--
     Copyright (C) 2017 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.
diff --git a/res/drawable/seekbar_popup_bg.xml b/res/drawable/seekbar_popup_bg.xml
deleted file mode 100644
index f1f6a11..0000000
--- a/res/drawable/seekbar_popup_bg.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* Copyright 2017, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-       android:shape="rectangle">
-    <solid android:color="?attr/value_popup_view_bg" />
-    <corners android:radius="22dp" />
-</shape>
-
diff --git a/res/layout-land/preference_color_picker.xml b/res/layout-land/dui_dialog_color_picker.xml
similarity index 100%
rename from res/layout-land/preference_color_picker.xml
rename to res/layout-land/dui_dialog_color_picker.xml
diff --git a/res/layout/app_list_item.xml b/res/layout/app_list_item.xml
deleted file mode 100644
index b1d78c9..0000000
--- a/res/layout/app_list_item.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2017, 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"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp"
-    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="8dp"
-        android:scaleType="centerInside"
-        android:contentDescription="@null" />
-
-    <TextView
-        android:id="@+id/app_name"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="fill_horizontal|center_vertical"
-        android:singleLine="true"
-        android:ellipsize="marquee"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textAlignment="viewStart"
-        tools:ignore="RtlCompat" />
-
-</LinearLayout>
diff --git a/res/layout/applist_preference_icon.xml b/res/layout/applist_preference_icon.xml
index 71a48fe..d1972f8 100644
--- a/res/layout/applist_preference_icon.xml
+++ b/res/layout/applist_preference_icon.xml
@@ -3,7 +3,8 @@
      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
+
+          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,
diff --git a/res/layout/custom_action_item.xml b/res/layout/custom_action_item.xml
new file mode 100644
index 0000000..f67cbad
--- /dev/null
+++ b/res/layout/custom_action_item.xml
@@ -0,0 +1,70 @@
+<?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="?android:attr/listPreferredItemHeightSmall"
+    android:gravity="center_vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/selectableItemBackground">
+
+    <ImageView
+        android:id="@+id/icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="12dip"
+        android:padding="2dp"
+        android:maxWidth="36dip"
+        android:maxHeight="36dip"
+        android:adjustViewBounds="true"
+        android:layout_gravity="center" />
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="2dip"
+        android:layout_marginEnd="6dip"
+        android:layout_marginTop="6dip"
+        android:layout_marginBottom="6dip"
+        android:layout_weight="1">
+
+        <TextView android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+            android:textColor="?android:attr/textColorPrimary"
+            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:style/TextAppearance.Material.Body1"
+            android:textColor="?android:attr/textColorSecondary"
+            android:maxLines="2" />
+
+    </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/dui_dialog_color_picker.xml b/res/layout/dui_dialog_color_picker.xml
index 149bcbc..1e25d7b 100644
--- a/res/layout/dui_dialog_color_picker.xml
+++ b/res/layout/dui_dialog_color_picker.xml
@@ -24,12 +24,6 @@
     android:padding="@dimen/alert_dialog_padding_material"
     android:orientation="vertical">
 
-    <com.bliss.support.colorpicker.ColorPickerView
-        android:id="@+id/color_picker_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:tag="portrait" />
-
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -62,6 +56,12 @@
 
     </LinearLayout>
 
+    <com.bliss.support.colorpicker.ColorPickerView
+        android:id="@+id/color_picker_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:tag="portrait" />
+
     <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/res/layout/edit_dialog.xml b/res/layout/edit_dialog.xml
new file mode 100644
index 0000000..bc8977e
--- /dev/null
+++ b/res/layout/edit_dialog.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2017 Paranoid Android
+
+     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:baselineAligned="false"
+    android:padding="16dp">
+    <EditText
+        android:id="@+id/editText"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="6dp"
+        android:layout_gravity="bottom"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:hint="@string/edit_hint"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textAlignment="viewStart" />
+</LinearLayout>
diff --git a/res/layout/headsup_preference_applist.xml b/res/layout/headsup_preference_applist.xml
new file mode 100644
index 0000000..f50428e
--- /dev/null
+++ b/res/layout/headsup_preference_applist.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2019 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:gravity="center_vertical"
+        android:orientation="horizontal"
+        android:background="?android:attr/selectableItemBackground"
+        android:paddingStart="@dimen/switchbar_subsettings_margin_start"
+        android:paddingEnd="@dimen/switchbar_subsettings_margin_end"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
+        android:dividerHeight="0dp"
+        android:clipToPadding="false">
+
+        <!-- Icon view for Heads-up BlackListing/StopListing app lists -->
+        <LinearLayout
+            android:id="@+id/icon_container"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="start|center_vertical"
+            android:dividerHeight="0dp"
+            android:orientation="horizontal">
+
+            <com.android.internal.widget.PreferenceImageView
+                android:id="@android:id/icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:scaleType="centerInside"
+                android:maxWidth="26dp"
+                android:maxHeight="26dp"/>
+
+        </LinearLayout>
+
+        <!-- Text view for Heads-up BlackListing/StopListing app lists -->
+        <RelativeLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:dividerHeight="0dp">
+
+            <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+                android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:paddingStart="14dp"
+                android:gravity="center_vertical"
+                android:textAppearance="?android:attr/textAppearanceListItem"
+                android:textColor="?android:attr/textColorSecondary"
+                android:textStyle="bold"
+                android:layout_marginBottom="8dip" />
+
+        </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/preference_cardview.xml b/res/layout/preference_cardview.xml
new file mode 100644
index 0000000..0fdeda1
--- /dev/null
+++ b/res/layout/preference_cardview.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 AospExtended ROM
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+          http://www.apache.org/licenses/LICENSE-2.0
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:card_view="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/prefCard"
+    android:layout_width="match_parent"
+    android:layout_height="74dp"
+    android:clickable="true"
+    android:focusable="true"
+    card_view:cardCornerRadius="@dimen/card_corner_radius"
+    card_view:cardElevation="@dimen/card_elevation"
+    android:layout_marginTop="@dimen/card_margin_top"
+    android:layout_marginBottom="@dimen/card_margin_bottom"
+    android:layout_marginRight="@dimen/card_margin_right"
+    android:layout_marginLeft="@dimen/card_margin_left"
+    card_view:cardBackgroundColor="@color/cardview_bg"
+    android:foreground="?android:attr/selectableItemBackground">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:id="@id/icon_frame"
+            android:layout_width="74dp"
+            android:layout_height="74dp">
+
+            <ImageView
+                android:id="@android:id/icon"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:scaleType="center" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="50dp"
+                android:textStyle="bold"
+                android:textSize="18sp"/>
+
+            <ImageView
+                android:id="@+id/arrow_icon"
+                android:src="@drawable/ic_arrow"
+                android:rotation="180"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginRight="60dp"
+                android:scaleType="center" />
+        </LinearLayout>
+    </LinearLayout>
+</androidx.cardview.widget.CardView>
diff --git a/res/layout/preference_custom_seekbar.xml b/res/layout/preference_custom_seekbar.xml
index 16940fb..a703f68 100644
--- a/res/layout/preference_custom_seekbar.xml
+++ b/res/layout/preference_custom_seekbar.xml
@@ -22,124 +22,70 @@
     android:gravity="center_vertical"
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/activatedBackgroundIndicator"
-    android:clipToPadding="false">
+    android:clickable="false"
+    android:orientation="horizontal">
 
     <LinearLayout
-        android:id="@android:id/icon_frame"
+        android:id="@+id/text_container"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginStart="-4dp"
-        android:minWidth="60dp"
-        android:gravity="start|center_vertical"
+        android:minWidth="44dp"
+        android:gravity="center"
         android:orientation="horizontal"
-        android:paddingEnd="12dp"
         android:paddingTop="4dp"
         android:paddingBottom="4dp">
-        <com.android.internal.widget.PreferenceImageView
-            android:id="@android:id/icon"
+        <TextView
+            android:id="@+id/seekBarPrefValue"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:maxWidth="48dp"
-            android:maxHeight="48dp" />
+            android:textAlignment="center"
+            android:singleLine="false"
+            android:ellipsize="end"
+            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textColor="?android:attr/textColorSecondary"/>
     </LinearLayout>
 
-    <RelativeLayout
-        android:layout_width="wrap_content"
+    <LinearLayout
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingTop="16dp"
-        android:paddingBottom="16dp">
+        android:orientation="vertical"
+        android:layout_marginTop="8dip"
+        android:layout_marginBottom="8dip">
 
-        <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
-            android:id="@+id/value_frame"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="2dp"
-            android:layout_below="@android:id/summary"
-            android:layout_alignStart="@android:id/title" >
-
-            <TextView
-                android:id="@+id/value"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_alignParentStart="true"
-                android:layout_centerVertical="true"
-                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-                android:textColor="?android:attr/textColorSecondary"
-                android:maxLines="1"
-                android:ellipsize="end" />
-
-            <ImageView
-                android:id="@+id/reset"
-                android:src="@drawable/ic_custom_seekbar_reset"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="4dp"
-                android:layout_toEndOf="@id/value"
-                android:layout_centerVertical="true" />
-
-        </RelativeLayout>
-
-        <RelativeLayout
-            android:id="@+id/seekbar_frame"
+        <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/value_frame"
-            android:layout_alignStart="@android:id/title" >
-
-            <ImageView
-                android:id="@+id/minus"
-                android:src="@drawable/ic_custom_seekbar_minus"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_alignParentStart="true"
-                android:layout_centerVertical="true" />
-
-            <ImageView
-                android:id="@+id/plus"
-                android:src="@drawable/ic_custom_seekbar_plus"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:layout_centerVertical="true" />
-
-            <LinearLayout
-                android:id="@+id/seekbar"
-                android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="0dp"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:layout_marginEnd="3dp"
-                android:layout_toEndOf="@id/minus"
-                android:layout_toStartOf="@id/plus"
-                android:layout_centerVertical="true" />
-        </RelativeLayout>
-    </RelativeLayout>
+                android:paddingStart="12dp"
+                android:singleLine="true"
+                android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                android:textColor="?android:attr/textColorPrimary"
+                android:ellipsize="marquee"
+                android:fadingEdge="horizontal"/>
+            <!-- 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="end|center_vertical"
+                android:paddingStart="16dp"
+                android:orientation="vertical"/>
+        </LinearLayout>
 
-    <!-- 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="end|center_vertical"
-        android:paddingStart="16dp"
-        android:orientation="vertical" />
+        <FrameLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="6dp">
+
+            <LinearLayout android:id="@+id/seekBarPrefBarContainer"
+                android:layout_gravity="center_vertical"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+        </FrameLayout>
+    </LinearLayout>
+
 </LinearLayout>
diff --git a/res/layout/seek_bar_preference.xml b/res/layout/seek_bar_preference.xml
deleted file mode 100644
index 02d1e21..0000000
--- a/res/layout/seek_bar_preference.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall"
-    android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/activatedBackgroundIndicator"
-    android:clipToPadding="false">
-
-    <LinearLayout
-        android:id="@android:id/icon_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="-4dp"
-        android:minWidth="60dp"
-        android:gravity="start|center_vertical"
-        android:orientation="horizontal"
-        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" />
-
-        <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
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/summary" >
-
-            <ImageView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:id="@+id/imageMinus"
-                android:src="@drawable/ic_seekbar_minus"
-                android:layout_alignParentLeft="true"
-                android:layout_centerInParent="true" />
-
-            <ImageView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:id="@+id/imagePlus"
-                android:src="@drawable/ic_seekbar_plus"
-                android:layout_alignParentRight="true"
-                android:layout_centerInParent="true" />
-
-            <TextView android:id="@+id/seekBarPrefUnitsRight"
-                android:layout_centerInParent="true"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-                android:textColor="?android:attr/textColorSecondary"
-                android:paddingStart="3dp"
-                android:layout_toLeftOf="@+id/imagePlus" />
-
-            <TextView android:id="@+id/seekBarPrefValue"
-                android:layout_centerInParent="true"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_toLeftOf="@id/seekBarPrefUnitsRight"
-                android:gravity="right"
-                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-                android:textColor="?android:attr/textColorSecondary" />
-
-            <SeekBar android:id="@+id/seekbar"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_centerInParent="true"
-                android:layout_toLeftOf="@+id/seekBarPrefValue"
-                android:layout_toRightOf="@+id/imageMinus" />
-
-            <TextView android:id="@+id/seekBarPrefUnitsLeft"
-                android:layout_centerInParent="true"
-                android:layout_toLeftOf="@id/seekBarPrefValue"
-                android:paddingEnd="3dp"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-                android:textColor="?android:attr/textColorSecondary" />
-
-        </RelativeLayout>
-
-    </RelativeLayout>
-
-    <LinearLayout android:id="@+id/widget_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:gravity="end|center_vertical"
-        android:paddingStart="16dp"
-        android:orientation="vertical" />
-
-</LinearLayout>
diff --git a/res/layout/seek_bar_value_popup.xml b/res/layout/seek_bar_value_popup.xml
deleted file mode 100644
index a5599c1..0000000
--- a/res/layout/seek_bar_value_popup.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:theme="@style/SeekBarPreferenceChamValueView" />
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
new file mode 100644
index 0000000..64ae017
--- /dev/null
+++ b/res/values-night/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright (C) 2014-2016 The Dirty Unicorns Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<resources>
+    <color name="cardview_bg">@*android:color/background_device_default_dark</color>
+</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 34f028c..3154c62 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Dirty Unicorns Project
+<!-- Copyright (C) 2014-2016 The Dirty Unicorns Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,35 +14,23 @@
      limitations under the License.
 -->
 <resources>
+    <attr name="preferenceBackgroundColor" format="color" />
 
     <!-- Base attributes available to CustomSeekBarPreference. -->
     <declare-styleable name="CustomSeekBarPreference">
-        <attr name="defaultValueText" format="string" />
         <attr name="interval" format="integer" />
-        <attr name="showSign" format="boolean" />
+        <attr name="min" format="integer" />
         <attr name="units" format="string|reference" />
-        <attr name="continuousUpdates" format="boolean" />
-    </declare-styleable>
-
-    <!-- Color Blend -->
-    <declare-styleable name="ColorBlendPreference">
-        <!-- Preference keys -->
-        <attr name="keyColorStart" format="string" />
-        <attr name="keyColorEnd" format="string" />
-        <attr name="keyBlendReverse" format="string" />
-        <!-- Default values -->
-        <attr name="defaultValueColorStart" format="color" />
-        <attr name="defaultValueColorEnd" format="color" />
-        <attr name="defaultValueBlendReverse" format="boolean" />
-        <!-- Preview strings -->
-        <attr name="previewStartText" format="string" />
-        <attr name="previewEndText" format="string" />
-        <attr name="previewBetweenText" format="string" />
+        <attr name="unitsLeft" format="string|reference" />
+        <attr name="unitsRight" format="string|reference" />
+        <attr name="defaultText" format="string|reference" />
+        <attr name="allowEditText" format="boolean" />
     </declare-styleable>
 
     <!-- Value to pass to callback when restore button is pressed -->
-    <declare-styleable name="ColorPreference">
+    <declare-styleable name="ColorPickerPreference">
         <attr name="defaultColorValue" format="integer" />
+        <attr name="ledPreview" format="boolean" />
+        <attr name="alphaSlider" format="boolean" />
     </declare-styleable>
-
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index cc2096c..c32f081 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -1,21 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 Havoc-OS
+<!--  Copyright (C) 2014-2016 The Dirty Unicorns Project
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
-          http://www.apache.org/licenses/LICENSE-2.0
+  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.
 
-     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.
--->
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
 
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <color name="disabled_text_color">#66000000</color>
-
+<resources>
+    <color name="cardview_bg">@*android:color/background_device_default_light</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 7046bfe..5ecc258 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -1,25 +1,57 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Dirty Unicorns Project
+<!--  Copyright (C) 2014-2016 The Dirty Unicorns Project
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
-          http://www.apache.org/licenses/LICENSE-2.0
+  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.
 
-     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.
--->
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
 
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+<resources>
 
-    <!-- Color Blend -->
-    <dimen name="color_blend_preview_size">36dp</dimen>
-    <dimen name="alert_dialog_padding_material">20dp</dimen>
+    <dimen name="header_icon_width">28dp</dimen>
+
+    <!-- Cardview Preference -->
+    <dimen name="card_elevation">2dp</dimen>
+    <dimen name="card_corner_radius">16dp</dimen>
+    <dimen name="card_margin_top">4dp</dimen>
+    <dimen name="card_margin_bottom">4dp</dimen>
+    <dimen name="card_margin_right">8dp</dimen>
+    <dimen name="card_margin_left">8dp</dimen>
+
+    <!-- ActionBar contentInsetStart -->
+    <dimen name="actionbar_contentInsetStart">16dp</dimen>
+
+    <!-- Dashboard padding in its container -->
+    <dimen name="dashboard_padding_start">0dp</dimen>
+    <dimen name="dashboard_padding_end">0dp</dimen>
+    <dimen name="dashboard_padding_top">0dp</dimen>
+    <dimen name="dashboard_padding_bottom">0dp</dimen>
+
+    <!-- Dashboard category panel elevation -->
+    <dimen name="dashboard_category_elevation">2dp</dimen>
+
+    <dimen name="settings_side_margin">0dip</dimen>
+
+    <dimen name="oval_notification_size">26dp</dimen>
 
     <dimen name="picker_circle_preview_size">26dp</dimen>
 
+    <dimen name="alert_dialog_padding_material">20dp</dimen>
+
+    <!-- Shortcut picker -->
+    <dimen name="shortcut_picker_left_padding">70dip</dimen>
+
+    <!-- SwitchBar sub settings margin start / end -->
+    <dimen name="switchbar_subsettings_margin_start">72dp</dimen>
+    <dimen name="switchbar_subsettings_margin_end">16dp</dimen>
+
 </resources>
diff --git a/res/values/seekbar_preference_attrs.xml b/res/values/seekbar_preference_attrs.xml
deleted file mode 100644
index d5647d6..0000000
--- a/res/values/seekbar_preference_attrs.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2014-2017 AICP
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-
-<resources>
-
-    <declare-styleable name="SeekBarPreference">
-        <!-- preference -->
-        <attr name="unitsLeft" format="string|reference" />
-        <attr name="unitsRight" format="string|reference" />
-        <attr name="interval" format="integer" />
-        <!-- style -->
-        <attr name="thumb_default_value_color" format="color" />
-        <attr name="value_popup_view_fg" format="color" />
-        <attr name="value_popup_view_bg" format="color" />
-    </declare-styleable>
-
-</resources>
diff --git a/res/values/seekbar_preference_dimens.xml b/res/values/seekbar_preference_dimens.xml
deleted file mode 100644
index 79efac6..0000000
--- a/res/values/seekbar_preference_dimens.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<resources>
-
-    <!-- SeekBarPreferenceCham: offset of the value popup -->
-    <dimen name="seek_bar_preference_cham_value_x_offset">0dp</dimen>
-    <dimen name="seek_bar_preference_cham_value_y_offset">-16dp</dimen>
-
-</resources>
diff --git a/res/values/seekbar_preference_strings.xml b/res/values/seekbar_preference_strings.xml
deleted file mode 100644
index f0c4530..0000000
--- a/res/values/seekbar_preference_strings.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <string name="seekbar_no_default_value">No default value set</string>
-    <string name="seekbar_default_value_set">Value set to default of <xliff:g id="number">%d</xliff:g></string>
-    <string name="seekbar_default_value_already_set">Default value is already set</string>
-    <string name="seekbar_default_string">Default</string>
-
-</resources>
diff --git a/res/values/seekbar_preference_styles.xml b/res/values/seekbar_preference_styles.xml
deleted file mode 100644
index 2a06f39..0000000
--- a/res/values/seekbar_preference_styles.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2018 AICP
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-
-<resources>
-
-    <style name="SeekBarPreferenceChamValueTextAppearance" parent="@*android:style/TextAppearance.Toast" />
-
-    <!-- SeekBarPreferenceCham value popup -->
-    <style name="SeekBarPreferenceChamValueView">
-        <item name="android:textColor">?attr/value_popup_view_fg</item>
-        <item name="android:textAppearance">@style/SeekBarPreferenceChamValueTextAppearance</item>
-        <item name="android:background">@drawable/seekbar_popup_bg</item>
-        <item name="android:paddingHorizontal">24dp</item>
-        <item name="android:paddingVertical">15dp</item>
-        <item name="android:fitsSystemWindows">false</item>
-    </style>
-
-</resources>
diff --git a/res/values/self_removing_preference_attrs.xml b/res/values/self_removing_preference_attrs.xml
deleted file mode 100644
index e12a0d9..0000000
--- a/res/values/self_removing_preference_attrs.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2018 The Android Ice Cold Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<resources>
-
-    <declare-styleable name="bliss_SelfRemovingPreference">
-        <attr name="replacesKey" format="string" />
-        <attr name="requiresOwner" format="boolean" />
-        <attr name="requiresPackageInstalled" format="string" />
-        <attr name="requiresPackageAvailable" format="string" />
-        <attr name="requiresPackageEnabled" format="string" />
-        <attr name="requiresAction" format="string" />
-        <attr name="requiresProperty" format="string" />
-        <attr name="requiresConfig" format="string" />
-        <attr name="requiresConfigMask" format="integer" />
-    </declare-styleable>
-
-</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 88a82eb..48eb415 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1,36 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The BlissRoms Project
+<!--  Copyright (C) 2014-2016 The Dirty Unicorns Project
 
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
 
-          http://www.apache.org/licenses/LICENSE-2.0
+  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.
 
-     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.
--->
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
 
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-
-    <!-- Custom seekbar -->
-    <string name="custom_seekbar_value">Value: <xliff:g id="v">%s</xliff:g></string>
-    <string name="custom_seekbar_default_value">Default</string>
-    <string name="custom_seekbar_default_value_to_set">Default value: <xliff:g id="v">%s</xliff:g>\nLong press to set</string>
-    <string name="custom_seekbar_default_value_is_set">Default value is set</string>
-
-    <!-- Color Blend -->
-    <string name="color_blend_ok">@android:string/ok</string>
-    <string name="color_blend_cancel">@android:string/cancel</string>
-    <string name="color_blend_reset">Reset</string>
-    <string name="color_blend_preview">Preview: %1$d%%</string>
-    <string name="color_preview_start">Start</string>
-    <string name="color_preview_end">End</string>
-    <string name="color_preview_between">Between</string>
+<resources>
 
     <!-- Color Picker -->
     <string name="dialog_color_picker">Color Picker</string>
@@ -41,7 +26,11 @@
     <string name="hex_hint">#ff000000</string>
     <string name="set">Set</string>
     <string name="color_default">Default</string>
+    <string name="edit_hint">Value</string>
+    <string name="seek_value_edit_label">Set value</string>
 
-    <string name="active_edge_app_select_title">Select app</string>
-    <string name="active_edge_activity_select_title">Select activity</string>
+    <string name="dlg_ok">OK</string>
+    <string name="reset">Reset</string>
+    <string name="cancel">Cancel</string>
+    <string name="default_text">Default</string>
 </resources>
diff --git a/src/com/bliss/support/colorpicker/AlphaPatternDrawable.java b/src/com/bliss/support/colorpicker/AlphaPatternDrawable.java
index 288c124..3649b5f 100644
--- a/src/com/bliss/support/colorpicker/AlphaPatternDrawable.java
+++ b/src/com/bliss/support/colorpicker/AlphaPatternDrawable.java
@@ -54,7 +54,9 @@
 
     @Override
     public void draw(Canvas canvas) {
-        canvas.drawBitmap(mBitmap, null, getBounds(), mPaint);
+        if (mBitmap != null) {
+            canvas.drawBitmap(mBitmap, null, getBounds(), mPaint);
+        }
     }
 
     @Override
diff --git a/src/com/bliss/support/colorpicker/ColorPickerDialog.java b/src/com/bliss/support/colorpicker/ColorPickerDialog.java
index 953a8ff..66a158f 100644
--- a/src/com/bliss/support/colorpicker/ColorPickerDialog.java
+++ b/src/com/bliss/support/colorpicker/ColorPickerDialog.java
@@ -18,10 +18,10 @@
 package com.bliss.support.colorpicker;
 
 import android.app.AlertDialog;
+import android.app.NotificationManager;
 import android.content.Context;
 import android.graphics.PixelFormat;
 import android.os.Bundle;
-import androidx.annotation.NonNull;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.Window;
@@ -29,6 +29,8 @@
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
+import androidx.annotation.NonNull;
+
 import com.bliss.support.R;
 
 public class ColorPickerDialog extends AlertDialog implements ColorPickerView.OnColorChangedListener, View.OnClickListener {
@@ -37,6 +39,11 @@
     private ColorPickerPanelView mOldColor;
     private ColorPickerPanelView mNewColor;
     private EditText mHex;
+    
+    private boolean mShowLedPreview;
+ 
+    private NotificationManager mNoMan;
+    private Context mContext;
 
     private OnColorChangedListener mListener;
 
@@ -44,8 +51,11 @@
         void onColorChanged(int color);
     }
 
-    ColorPickerDialog(Context context, int initialColor) {
+    ColorPickerDialog(Context context, int initialColor, boolean showLedPreview) {
         super(context);
+        
+        mContext = context;
+        mShowLedPreview = showLedPreview;
 
         init(initialColor);
     }
@@ -62,6 +72,8 @@
 
         LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
                 Context.LAYOUT_INFLATER_SERVICE);
+        mNoMan = (NotificationManager)
+                mContext.getSystemService(Context.NOTIFICATION_SERVICE);        
 
         assert inflater != null;
         View layout = inflater.inflate(R.layout.dui_dialog_color_picker, null);
@@ -81,6 +93,7 @@
         mColorPicker.setOnColorChangedListener(this);
         mOldColor.setColor(color);
         mColorPicker.setColor(color, true);
+        showLed(color);
 
         if (mHex != null) {
             mHex.setText(ColorPickerPreference.convertToARGB(color));
@@ -109,6 +122,19 @@
             }
         } catch (Exception ignored) {
         }
+        showLed(color);
+    }
+
+    private void showLed(int color) {
+        if (mShowLedPreview) {
+            mNoMan.forceShowLedLight(color);
+        }
+    }
+
+    private void switchOffLed() {
+        if (mShowLedPreview) {
+            mNoMan.forceShowLedLight(0);
+        }
     }
 
     void setAlphaSliderVisible(boolean visible) {
@@ -137,6 +163,12 @@
         }
         dismiss();
     }
+    
+    @Override
+    public void onStop() {
+        super.onStop();
+        switchOffLed();
+    }
 
     @NonNull
     @Override
@@ -145,6 +177,7 @@
         state.putInt("old_color", mOldColor.getColor());
         state.putInt("new_color", mNewColor.getColor());
         dismiss();
+        switchOffLed();
         return state;
     }
 
diff --git a/src/com/bliss/support/colorpicker/ColorPickerPanelView.java b/src/com/bliss/support/colorpicker/ColorPickerPanelView.java
index a6185d1..aa6311d 100644
--- a/src/com/bliss/support/colorpicker/ColorPickerPanelView.java
+++ b/src/com/bliss/support/colorpicker/ColorPickerPanelView.java
@@ -39,7 +39,7 @@
      */
     private final static float    BORDER_WIDTH_PX = 1;
 
-    private float mDensity = 1f;
+    private static float mDensity = 1f;
 
     private int         mBorderColor = 0xff6E6E6E;
     private int         mColor = 0xff000000;
diff --git a/src/com/bliss/support/colorpicker/ColorPickerPreference.java b/src/com/bliss/support/colorpicker/ColorPickerPreference.java
index a75f4a2..54bffc4 100644
--- a/src/com/bliss/support/colorpicker/ColorPickerPreference.java
+++ b/src/com/bliss/support/colorpicker/ColorPickerPreference.java
@@ -20,15 +20,12 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
 import android.graphics.Color;
 import android.graphics.drawable.ShapeDrawable;
 import android.graphics.drawable.shapes.OvalShape;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import androidx.preference.*;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
@@ -37,6 +34,8 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import androidx.preference.*;
+
 import com.bliss.support.R;
 
 /**
@@ -53,13 +52,14 @@
     private int mValue = Color.BLACK;
     private float mDensity = 0;
     private boolean mAlphaSliderEnabled = false;
-    private boolean mEnabled = true;
 
     // if we return -6, button is not enabled
     static final String SETTINGS_NS = "http://schemas.android.com/apk/res/com.android.settings";
     static final int DEF_VALUE_DEFAULT = -6;
     boolean mUsesDefaultButton = false;
     int mDefValue = -1;
+    
+    private boolean mShowLedPreview;
 
     private EditText mEditText;
 
@@ -98,6 +98,7 @@
                 mUsesDefaultButton =  true;
                 mDefValue = defVal;
             }
+            mShowLedPreview = attrs.getAttributeBooleanValue(null, "ledPreview", false);
         }
     }
 
@@ -210,22 +211,6 @@
                 (mValue - 0x101010) : mValue;
         iView.setImageDrawable(createOvalShape(size, 0xFF000000 + imageColor));
         iView.setTag("preview");
-        iView.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mEnabled) {
-                    showDialog(null);
-                }
-            }
-        });
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        super.setEnabled(enabled);
-        if (mEnabled != enabled) {
-            mEnabled = enabled;
-        }
     }
 
     @Override
@@ -251,7 +236,7 @@
     }
 
     protected void showDialog(Bundle state) {
-        mDialog = new ColorPickerDialog(getContext(), mValue);
+        mDialog = new ColorPickerDialog(getContext(), mValue, mShowLedPreview);
         mDialog.setOnColorChangedListener(this);
         if (mAlphaSliderEnabled) {
             mDialog.setAlphaSliderVisible(true);
diff --git a/src/com/bliss/support/preferences/AppPicker.java b/src/com/bliss/support/preferences/AppPicker.java
deleted file mode 100644
index ed57e8a..0000000
--- a/src/com/bliss/support/preferences/AppPicker.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright (C) 2019 The Dirty Unicorns Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.bliss.support.preferences;
-
-import android.app.ListActivity;
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import com.bliss.support.R;
-
-public class AppPicker extends ListActivity {
-
-    protected PackageManager packageManager = null;
-    protected List<ApplicationInfo> applist = null;
-    Adapter listadapter = null;
-
-    protected List<ActivityInfo> mActivitiesList = null;
-    protected boolean mIsActivitiesList = false;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(android.R.layout.list_content);
-        setTitle(R.string.active_edge_app_select_title);
-
-        packageManager = getPackageManager();
-        new LoadApplications().execute();
-    }
-
-    protected void onListItemClick(ListView l, View v, int position, long id) {
-        if (!mIsActivitiesList) {
-            // we are in the Apps list
-        } else if (mIsActivitiesList) {
-            // we are in the Activities list
-        }
-
-        mIsActivitiesList = false;
-
-        finish();
-    }
-
-    @Override
-    public void onBackPressed() {
-        if (mIsActivitiesList) {
-            // Reset the dialog again
-            setListAdapter(listadapter);
-            setTitle(R.string.active_edge_app_select_title);
-            mIsActivitiesList = false;
-        } else {
-            finish();
-        }
-    }
-
-    private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
-        ArrayList<ApplicationInfo> applist = new ArrayList<>();
-
-        // If we need to blacklist apps, this is where we list them
-        String[] blacklist_packages = {
-                "com.google.android.as", // Actions Services
-                "com.google.android.GoogleCamera", // Google camera
-                "com.google.android.imaging.easel.service", // Pixel Visual Core Service
-                "com.android.traceur" // System Tracing (Google spyware lol)
-        };
-
-        for (ApplicationInfo info : list) {
-            try {
-                /* Remove blacklisted apps from the list of apps we give to
-                   the user to select from. */
-                if ((!Arrays.asList(blacklist_packages).contains(info.packageName)
-                        && null != packageManager.getLaunchIntentForPackage(info.packageName))) {
-                    applist.add(info);
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-        // Lets alphabatize the list of installed user apps
-        Collections.sort(applist, new ApplicationInfo.DisplayNameComparator(packageManager));
-
-        return applist;
-    }
-
-    class LoadApplications extends AsyncTask<Void, Void, Void> {
-
-        @Override
-        protected Void doInBackground(Void... params) {
-            applist = checkForLaunchIntent(packageManager.getInstalledApplications(
-                    PackageManager.GET_META_DATA));
-            listadapter = new Adapter(AppPicker.this,
-                    R.layout.app_list_item, applist, packageManager);
-            return null;
-        }
-
-        @Override
-        protected void onPostExecute(Void result) {
-            super.onPostExecute(result);
-            setListAdapter(listadapter);
-
-            getListView().setLongClickable(true);
-            getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
-                @Override
-                public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
-                        int pos, long id) {
-                    onLongClick(pos);
-                    return true;
-                }
-            });
-        }
-
-        @Override
-        protected void onPreExecute() {
-            super.onPreExecute();
-        }
-    }
-
-    protected void onLongClick(int pos) {
-        /*if (mIsActivitiesList) return;
-        String packageName = applist.get(position).packageName;
-        showActivitiesDialog(packageName);*/
-    }
-
-    protected void showActivitiesDialog(String packageName) {
-        mIsActivitiesList = true;
-        ArrayList<ActivityInfo> list = null;
-        try {
-            PackageInfo pi = packageManager.getPackageInfo (
-                    packageName, PackageManager.GET_ACTIVITIES);
-
-            list = new ArrayList<>(Arrays.asList(pi.activities));
-
-        } catch (PackageManager.NameNotFoundException e) {
-        }
-
-        mActivitiesList = list;
-
-        if (list == null) {
-            // no activities to show, let's stay in the Apps list
-            mIsActivitiesList = false;
-            return;
-        }
-
-        setTitle(R.string.active_edge_activity_select_title);
-        // switch to a new adapter to show app activities
-        ActivitiesAdapter adapter = new ActivitiesAdapter(this, R.layout.app_list_item, list, packageManager);
-        setListAdapter(adapter);
-    }
-
-    class Adapter extends ArrayAdapter<ApplicationInfo> {
-
-        private List<ApplicationInfo> appList;
-        private Context context;
-        private PackageManager packageManager;
-
-        private Adapter(Context context, int resource, List<ApplicationInfo> objects, PackageManager pm) {
-            super(context, resource, objects);
-
-            this.context = context;
-            this.appList = objects;
-            packageManager = pm;
-        }
-
-        @Override
-        public int getCount() {
-            return ((null != appList) ? appList.size() : 0);
-        }
-
-        @Override
-        public ApplicationInfo getItem(int position) {
-            return ((null != appList) ? appList.get(position) : null);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            View view = convertView;
-
-            ApplicationInfo data = appList.get(position);
-
-            if (view == null) {
-                LayoutInflater layoutInflater = (LayoutInflater) context
-                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-                view = layoutInflater.inflate(R.layout.app_list_item, null);
-            }
-
-            if (data != null) {
-                TextView appName = view.findViewById(R.id.app_name);
-                ImageView iconView = view.findViewById(R.id.app_icon);
-
-                appName.setText(data.loadLabel(packageManager));
-                iconView.setImageDrawable(data.loadIcon(packageManager));
-            }
-            return view;
-        }
-    }
-
-    class ActivitiesAdapter extends ArrayAdapter<ActivityInfo> {
-
-        private List<ActivityInfo> appList;
-        private Context context;
-        private PackageManager packageManager;
-
-        private ActivitiesAdapter(Context context, int resource, List<ActivityInfo> objects, PackageManager pm) {
-            super(context, resource, objects);
-
-            this.context = context;
-            this.appList = objects;
-            this.packageManager = pm;
-        }
-
-        @Override
-        public int getCount() {
-            return ((null != appList) ? appList.size() : 0);
-        }
-
-        @Override
-        public ActivityInfo getItem(int position) {
-            return ((null != appList) ? appList.get(position) : null);
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            View view = convertView;
-
-            ActivityInfo data = appList.get(position);
-
-            if (view == null) {
-                LayoutInflater layoutInflater = (LayoutInflater) context
-                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-                view = layoutInflater.inflate(android.R.layout.simple_list_item_1, null);
-            }
-
-            if (data != null) {
-                TextView appName = view.findViewById(android.R.id.text1);
-
-                String name = /*data.loadLabel(packageManager).toString();
-                if (name == null) {
-                    name = */data.name;
-                //}
-                appName.setText(name);
-            }
-
-            return view;
-        }
-    }
-}
diff --git a/src/com/bliss/support/preferences/CardviewPreference.java b/src/com/bliss/support/preferences/CardviewPreference.java
new file mode 100644
index 0000000..773b720
--- /dev/null
+++ b/src/com/bliss/support/preferences/CardviewPreference.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.bliss.support.preferences;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.bliss.support.R;
+
+public class CardviewPreference extends Preference {
+
+    private final View.OnClickListener mClickListener = v -> performClick(v);
+
+    private boolean mAllowDividerAbove;
+    private boolean mAllowDividerBelow;
+
+    public CardviewPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Preference);
+
+        mAllowDividerAbove = TypedArrayUtils.getBoolean(a, R.styleable.Preference_allowDividerAbove,
+                R.styleable.Preference_allowDividerAbove, false);
+        mAllowDividerBelow = TypedArrayUtils.getBoolean(a, R.styleable.Preference_allowDividerBelow,
+                R.styleable.Preference_allowDividerBelow, false);
+        a.recycle();
+
+        setLayoutResource(R.layout.preference_cardview);
+    }
+
+    public CardviewPreference(Context context, View view) {
+        super(context);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        holder.itemView.setOnClickListener(mClickListener);
+
+        final boolean selectable = isSelectable();
+        holder.itemView.setFocusable(selectable);
+        holder.itemView.setClickable(selectable);
+        holder.setDividerAllowedAbove(mAllowDividerAbove);
+        holder.setDividerAllowedBelow(mAllowDividerBelow);
+    }
+}
diff --git a/src/com/bliss/support/preferences/ConstraintsHelper.java b/src/com/bliss/support/preferences/ConstraintsHelper.java
deleted file mode 100644
index e67686f..0000000
--- a/src/com/bliss/support/preferences/ConstraintsHelper.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright (C) 2016 The CyanogenMod Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.TypedArray;
-import android.os.SystemProperties;
-import android.os.UserHandle;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceViewHolder;
-import android.util.ArraySet;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-
-import java.util.Set;
-
-import com.bliss.support.R;
-import com.android.internal.util.bliss.BlissUtils;
-
-/**
- * Helpers for checking if a device supports various features.
- *
- * @hide
- */
-public class ConstraintsHelper {
-
-    private static final String TAG = "ConstraintsHelper";
-
-    private static final boolean DEBUG = Log.isLoggable(TAG, Log.VERBOSE);
-
-    private final Context mContext;
-
-    private final AttributeSet mAttrs;
-
-    private final Preference mPref;
-
-    private boolean mAvailable = true;
-
-    private String mReplacesKey = null;
-
-    public ConstraintsHelper(Context context, AttributeSet attrs, Preference pref) {
-        mContext = context;
-        mAttrs = attrs;
-        mPref = pref;
-
-        TypedArray a = context.getResources().obtainAttributes(attrs,
-                R.styleable.bliss_SelfRemovingPreference);
-        mReplacesKey = a.getString(R.styleable.bliss_SelfRemovingPreference_replacesKey);
-        Log.d(TAG, "construct key=" + mPref.getKey() + " available=" + mAvailable);
-        setAvailable(checkConstraints());
-    }
-
-    public void setAvailable(boolean available) {
-        mAvailable = available;
-        if (!available) {
-            Graveyard.get(mContext).addTombstone(mPref.getKey());
-        }
-    }
-
-    public boolean isAvailable() {
-        return mAvailable;
-    }
-
-    private PreferenceGroup getParent(Preference preference) {
-        return getParent(mPref.getPreferenceManager().getPreferenceScreen(), preference);
-    }
-
-    private PreferenceGroup getParent(PreferenceGroup root, Preference preference) {
-        for (int i = 0; i < root.getPreferenceCount(); i++) {
-            Preference p = root.getPreference(i);
-            if (p == preference)
-                return root;
-            if (PreferenceGroup.class.isInstance(p)) {
-                PreferenceGroup parent = getParent((PreferenceGroup) p, preference);
-                if (parent != null)
-                    return parent;
-            }
-        }
-        return null;
-    }
-
-    private void checkIntent() {
-        Intent i = mPref.getIntent();
-        if (i != null) {
-            if (!BlissUtils.resolveIntent(mContext, i)) {
-                Graveyard.get(mContext).addTombstone(mPref.getKey());
-                mAvailable = false;
-            }
-        }
-    }
-
-    private boolean isNegated(String key) {
-        return key != null && key.startsWith("!");
-    }
-
-    private boolean checkConstraints() {
-        if (mAttrs == null) {
-            return true;
-        }
-
-        TypedArray a = mContext.getResources().obtainAttributes(mAttrs,
-                R.styleable.bliss_SelfRemovingPreference);
-
-        try {
-
-            // Check if the current user is an owner
-            boolean rOwner = a.getBoolean(R.styleable.bliss_SelfRemovingPreference_requiresOwner, false);
-            if (rOwner && UserHandle.myUserId() != UserHandle.USER_OWNER) {
-                return false;
-            }
-
-            // Check if a specific package is installed
-            String rPackageInst = a.getString(R.styleable.bliss_SelfRemovingPreference_requiresPackageInstalled);
-            if (rPackageInst != null) {
-                boolean negated = isNegated(rPackageInst);
-                if (negated) {
-                    rPackageInst = rPackageInst.substring(1);
-                }
-                boolean available = BlissUtils.isPackageInstalled(mContext, rPackageInst);
-                if (available == negated) {
-                    return false;
-                }
-            }
-
-            // Check if a specific package is enabled
-            String rPackageEnb = a.getString(R.styleable.bliss_SelfRemovingPreference_requiresPackageEnabled);
-            if (rPackageEnb != null) {
-                boolean negated = isNegated(rPackageEnb);
-                if (negated) {
-                    rPackageEnb = rPackageEnb.substring(1);
-                }
-                boolean available = BlissUtils.isPackageEnabled(rPackageEnb, mContext);
-                if (available == negated) {
-                    return false;
-                }
-            }
-
-            // Check if a specific package is available
-            String rPackageAvl = a.getString(R.styleable.bliss_SelfRemovingPreference_requiresPackageAvailable);
-            if (rPackageAvl != null) {
-                boolean negated = isNegated(rPackageAvl);
-                if (negated) {
-                    rPackageAvl = rPackageAvl.substring(1);
-                }
-                boolean available = BlissUtils.isPackageAvailable(rPackageAvl, mContext);
-                if (available == negated) {
-                    return false;
-                }
-            }
-
-            // Check if an intent can be resolved to handle the given action
-            String rAction = a.getString(R.styleable.bliss_SelfRemovingPreference_requiresAction);
-            if (rAction != null) {
-                boolean negated = isNegated(rAction);
-                if (negated) {
-                    rAction = rAction.substring(1);
-                }
-                boolean available = BlissUtils.resolveIntent(mContext, rAction);
-                if (available == negated) {
-                    return false;
-                }
-            }
-
-            // Check a boolean system property
-            String rProperty = a.getString(R.styleable.bliss_SelfRemovingPreference_requiresProperty);
-            if (rProperty != null) {
-                boolean negated = isNegated(rProperty);
-                if (negated) {
-                    rProperty = rProperty.substring(1);
-                }
-                String value = SystemProperties.get(rProperty);
-                boolean available = value != null && Boolean.parseBoolean(value);
-                if (available == negated) {
-                    return false;
-                }
-            }
-
-            // Check a config resource. This can be a bool, string or integer.
-            // The preference is removed if any of the following are true:
-            // * A bool resource is false.
-            // * A string resource is null.
-            // * An integer resource is zero.
-            // * An integer is non-zero and when bitwise logically ANDed with
-            //   attribute requiresConfigMask, the result is zero.
-            TypedValue tv = a.peekValue(R.styleable.bliss_SelfRemovingPreference_requiresConfig);
-            if (tv != null && tv.resourceId != 0) {
-                if (tv.type == TypedValue.TYPE_STRING &&
-                        mContext.getResources().getString(tv.resourceId) == null) {
-                    return false;
-                } else if (tv.type == TypedValue.TYPE_INT_BOOLEAN && tv.data == 0) {
-                    return false;
-                } else if (tv.type == TypedValue.TYPE_INT_DEC) {
-                    int mask = a.getInt(
-                            R.styleable.bliss_SelfRemovingPreference_requiresConfigMask, -1);
-                    if (tv.data == 0 || (mask >= 0 && (tv.data & mask) == 0)) {
-                        return false;
-                    }
-                }
-            }
-        } finally {
-            a.recycle();
-        }
-
-        return true;
-    }
-
-    public static int getAttr(Context context, int attr, int fallbackAttr) {
-        TypedValue value = new TypedValue();
-        context.getTheme().resolveAttribute(attr, value, true);
-        if (value.resourceId != 0) {
-            return attr;
-        }
-        return fallbackAttr;
-    }
-
-    public void onAttached() {
-        checkIntent();
-
-        if (isAvailable() && mReplacesKey != null) {
-            Graveyard.get(mContext).addTombstone(mReplacesKey);
-        }
-
-        Graveyard.get(mContext).summonReaper(mPref.getPreferenceManager());
-    }
-
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        if (!isAvailable()) {
-            return;
-        }
-    }
-
-    /**
-     * If we want to keep this at the preference level vs the fragment level, we need to
-     * collate all the preferences that need to be removed when attached to the
-     * hierarchy, then purge them all when loading is complete. The Graveyard keeps track
-     * of this, and will reap the dead when onAttached is called.
-     */
-    private static class Graveyard {
-
-        private Set<String> mDeathRow = new ArraySet<>();
-
-        private static Graveyard sInstance;
-
-        private final Context mContext;
-
-        private Graveyard(Context context) {
-            mContext = context;
-        }
-
-        public synchronized static Graveyard get(Context context) {
-            if (sInstance == null) {
-                sInstance = new Graveyard(context);
-            }
-            return sInstance;
-        }
-
-        public void addTombstone(String pref) {
-            synchronized (mDeathRow) {
-                mDeathRow.add(pref);
-            }
-        }
-
-        private PreferenceGroup getParent(Preference p1, Preference p2) {
-            return getParent(p1.getPreferenceManager().getPreferenceScreen(), p2);
-        }
-
-        private PreferenceGroup getParent(PreferenceGroup root, Preference preference) {
-            for (int i = 0; i < root.getPreferenceCount(); i++) {
-                Preference p = root.getPreference(i);
-                if (p == preference)
-                    return root;
-                if (PreferenceGroup.class.isInstance(p)) {
-                    PreferenceGroup parent = getParent((PreferenceGroup) p, preference);
-                    if (parent != null)
-                        return parent;
-                }
-            }
-            return null;
-        }
-
-        private void hidePreference(PreferenceManager mgr, Preference pref) {
-            pref.setVisible(false);
-            // Hide the group if nothing is visible
-            final PreferenceGroup group = getParent(pref, pref);
-            boolean allHidden = true;
-            for (int i = 0; i < group.getPreferenceCount(); i++) {
-                if (group.getPreference(i).isVisible()) {
-                    allHidden = false;
-                    break;
-                }
-            }
-            if (allHidden) {
-                group.setVisible(false);
-            }
-        }
-
-        public void summonReaper(PreferenceManager mgr) {
-            synchronized (mDeathRow) {
-                Set<String> notReadyForReap = new ArraySet<>();
-                for (String dead : mDeathRow) {
-                    Preference deadPref = mgr.findPreference(dead);
-                    if (deadPref != null) {
-                        hidePreference(mgr, deadPref);
-                    } else {
-                        notReadyForReap.add(dead);
-                    }
-                }
-                mDeathRow = notReadyForReap;
-            }
-        }
-    }
-}
diff --git a/src/com/bliss/support/preferences/CustomDialogPref.java b/src/com/bliss/support/preferences/CustomDialogPref.java
deleted file mode 100644
index 58c7097..0000000
--- a/src/com/bliss/support/preferences/CustomDialogPref.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
-import androidx.preference.DialogPreference;
-import androidx.preference.PreferenceDialogFragmentCompat;
-
-public class CustomDialogPref<T extends DialogInterface> extends DialogPreference {
-
-    private CustomPreferenceDialogFragment mFragment;
-
-    public CustomDialogPref(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-    }
-
-    public CustomDialogPref(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    public CustomDialogPref(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public CustomDialogPref(Context context) {
-        super(context);
-    }
-
-    public boolean isDialogOpen() {
-        return getDialog() != null && getDialog() instanceof Dialog && ((Dialog)getDialog()).isShowing();
-    }
-
-    public T getDialog() {
-        return (T) (mFragment != null ? mFragment.getDialog() : null);
-    }
-
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
-            DialogInterface.OnClickListener listener) {
-    }
-
-    protected void onDialogClosed(boolean positiveResult) {
-    }
-
-    protected void onClick(T dialog, int which) {
-    }
-
-    protected void onBindDialogView(View view) {
-    }
-
-    protected void onStart() {
-    }
-
-    protected void onStop() {
-    }
-
-    protected void onPause() {
-    }
-
-    protected void onResume() {
-    }
-
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return null;
-    }
-
-    protected View onCreateDialogView(Context context) {
-        return null;
-    }
-
-    private void setFragment(CustomPreferenceDialogFragment fragment) {
-        mFragment = fragment;
-    }
-
-    protected boolean onDismissDialog(T dialog, int which) {
-        return true;
-    }
-
-    public static class CustomPreferenceDialogFragment extends PreferenceDialogFragmentCompat {
-
-        public static CustomPreferenceDialogFragment newInstance(String key) {
-            final CustomPreferenceDialogFragment fragment = new CustomPreferenceDialogFragment();
-            final Bundle b = new Bundle(1);
-            b.putString(ARG_KEY, key);
-            fragment.setArguments(b);
-            return fragment;
-        }
-
-        private CustomDialogPref getCustomizablePreference() {
-            return (CustomDialogPref) getPreference();
-        }
-
-        private class OnDismissListener implements View.OnClickListener {
-            private final int mWhich;
-            private final DialogInterface mDialog;
-
-            public OnDismissListener(DialogInterface dialog, int which) {
-                mWhich = which;
-                mDialog = dialog;
-            }
-
-            @Override
-            public void onClick(View view) {
-                CustomPreferenceDialogFragment.this.onClick(mDialog, mWhich);
-                if (getCustomizablePreference().onDismissDialog(mDialog, mWhich)) {
-                    mDialog.dismiss();
-                }
-            }
-        }
-
-        @Override
-        public void onStart() {
-            super.onStart();
-            if (getDialog() instanceof AlertDialog) {
-                AlertDialog a = (AlertDialog)getDialog();
-                if (a.getButton(Dialog.BUTTON_NEUTRAL) != null) {
-                    a.getButton(Dialog.BUTTON_NEUTRAL).setOnClickListener(
-                            new OnDismissListener(a, Dialog.BUTTON_NEUTRAL));
-                }
-                if (a.getButton(Dialog.BUTTON_POSITIVE) != null) {
-                    a.getButton(Dialog.BUTTON_POSITIVE).setOnClickListener(
-                            new OnDismissListener(a, Dialog.BUTTON_POSITIVE));
-                }
-                if (a.getButton(Dialog.BUTTON_NEGATIVE) != null) {
-                    a.getButton(Dialog.BUTTON_NEGATIVE).setOnClickListener(
-                            new OnDismissListener(a, Dialog.BUTTON_NEGATIVE));
-                }
-            }
-            getCustomizablePreference().onStart();
-        }
-
-        @Override
-        public void onStop() {
-            super.onStop();
-            getCustomizablePreference().onStop();
-        }
-
-        @Override
-        public void onPause() {
-            super.onPause();
-            getCustomizablePreference().onPause();
-        }
-
-        @Override
-        public void onResume() {
-            super.onResume();
-            getCustomizablePreference().onResume();
-        }
-
-        @Override
-        protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
-            super.onPrepareDialogBuilder(builder);
-            getCustomizablePreference().setFragment(this);
-            getCustomizablePreference().onPrepareDialogBuilder(builder, this);
-        }
-
-        @Override
-        public void onDialogClosed(boolean positiveResult) {
-            getCustomizablePreference().onDialogClosed(positiveResult);
-        }
-
-        @Override
-        protected void onBindDialogView(View view) {
-            super.onBindDialogView(view);
-            getCustomizablePreference().onBindDialogView(view);
-        }
-
-        @Override
-        public void onClick(DialogInterface dialog, int which) {
-            super.onClick(dialog, which);
-            getCustomizablePreference().onClick(dialog, which);
-        }
-
-        @NonNull
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            getCustomizablePreference().setFragment(this);
-            final Dialog sub = getCustomizablePreference().onCreateDialog(savedInstanceState);
-            if (sub == null) {
-                return super.onCreateDialog(savedInstanceState);
-            }
-            return sub;
-        }
-
-        @Override
-        protected View onCreateDialogView(Context context) {
-            final View v = getCustomizablePreference().onCreateDialogView(context);
-            if (v == null) {
-                return super.onCreateDialogView(context);
-            }
-            return v;
-        }
-    }
-}
diff --git a/src/com/bliss/support/preferences/CustomDialogPreference.java b/src/com/bliss/support/preferences/CustomDialogPreference.java
deleted file mode 100644
index 6bde92d..0000000
--- a/src/com/bliss/support/preferences/CustomDialogPreference.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.preference.DialogPreference;
-import androidx.preference.PreferenceDialogFragment;
-
-public class CustomDialogPreference<T extends DialogInterface> extends DialogPreference {
-
-    private CustomPreferenceDialogFragment mFragment;
-
-    public CustomDialogPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-    }
-
-    public CustomDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    public CustomDialogPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public CustomDialogPreference(Context context) {
-        super(context);
-    }
-
-    public boolean isDialogOpen() {
-        return getDialog() != null && getDialog() instanceof Dialog && ((Dialog)getDialog()).isShowing();
-    }
-
-    public T getDialog() {
-        return (T) (mFragment != null ? mFragment.getDialog() : null);
-    }
-
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
-            DialogInterface.OnClickListener listener) {
-    }
-
-    protected void onDialogClosed(boolean positiveResult) {
-    }
-
-    protected void onClick(T dialog, int which) {
-    }
-
-    protected void onBindDialogView(View view) {
-    }
-
-    protected void onStart() {
-    }
-
-    protected void onStop() {
-    }
-
-    protected void onPause() {
-    }
-
-    protected void onResume() {
-    }
-
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return null;
-    }
-
-    protected View onCreateDialogView(Context context) {
-        return null;
-    }
-
-    private void setFragment(CustomPreferenceDialogFragment fragment) {
-        mFragment = fragment;
-    }
-
-    protected boolean onDismissDialog(T dialog, int which) {
-        return true;
-    }
-
-    public static class CustomPreferenceDialogFragment extends PreferenceDialogFragment {
-
-        public static CustomPreferenceDialogFragment newInstance(String key) {
-            final CustomPreferenceDialogFragment fragment = new CustomPreferenceDialogFragment();
-            final Bundle b = new Bundle(1);
-            b.putString(ARG_KEY, key);
-            fragment.setArguments(b);
-            return fragment;
-        }
-
-        private CustomDialogPreference getCustomizablePreference() {
-            return (CustomDialogPreference) getPreference();
-        }
-
-        private class OnDismissListener implements View.OnClickListener {
-            private final int mWhich;
-            private final DialogInterface mDialog;
-
-            public OnDismissListener(DialogInterface dialog, int which) {
-                mWhich = which;
-                mDialog = dialog;
-            }
-
-            @Override
-            public void onClick(View view) {
-                CustomPreferenceDialogFragment.this.onClick(mDialog, mWhich);
-                if (getCustomizablePreference().onDismissDialog(mDialog, mWhich)) {
-                    mDialog.dismiss();
-                }
-            }
-        }
-
-        @Override
-        public void onStart() {
-            super.onStart();
-            if (getDialog() instanceof AlertDialog) {
-                AlertDialog a = (AlertDialog)getDialog();
-                if (a.getButton(Dialog.BUTTON_NEUTRAL) != null) {
-                    a.getButton(Dialog.BUTTON_NEUTRAL).setOnClickListener(
-                            new OnDismissListener(a, Dialog.BUTTON_NEUTRAL));
-                }
-                if (a.getButton(Dialog.BUTTON_POSITIVE) != null) {
-                    a.getButton(Dialog.BUTTON_POSITIVE).setOnClickListener(
-                            new OnDismissListener(a, Dialog.BUTTON_POSITIVE));
-                }
-                if (a.getButton(Dialog.BUTTON_NEGATIVE) != null) {
-                    a.getButton(Dialog.BUTTON_NEGATIVE).setOnClickListener(
-                            new OnDismissListener(a, Dialog.BUTTON_NEGATIVE));
-                }
-            }
-            getCustomizablePreference().onStart();
-        }
-
-        @Override
-        public void onStop() {
-            super.onStop();
-            getCustomizablePreference().onStop();
-        }
-
-        @Override
-        public void onPause() {
-            super.onPause();
-            getCustomizablePreference().onPause();
-        }
-
-        @Override
-        public void onResume() {
-            super.onResume();
-            getCustomizablePreference().onResume();
-        }
-
-        @Override
-        protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
-            super.onPrepareDialogBuilder(builder);
-            getCustomizablePreference().setFragment(this);
-            getCustomizablePreference().onPrepareDialogBuilder(builder, this);
-        }
-
-        @Override
-        public void onDialogClosed(boolean positiveResult) {
-            getCustomizablePreference().onDialogClosed(positiveResult);
-        }
-
-        @Override
-        protected void onBindDialogView(View view) {
-            super.onBindDialogView(view);
-            getCustomizablePreference().onBindDialogView(view);
-        }
-
-        @Override
-        public void onClick(DialogInterface dialog, int which) {
-            super.onClick(dialog, which);
-            getCustomizablePreference().onClick(dialog, which);
-        }
-
-        @NonNull
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            getCustomizablePreference().setFragment(this);
-            final Dialog sub = getCustomizablePreference().onCreateDialog(savedInstanceState);
-            if (sub == null) {
-                return super.onCreateDialog(savedInstanceState);
-            }
-            return sub;
-        }
-
-        @Override
-        protected View onCreateDialogView(Context context) {
-            final View v = getCustomizablePreference().onCreateDialogView(context);
-            if (v == null) {
-                return super.onCreateDialogView(context);
-            }
-            return v;
-        }
-    }
-}
-
diff --git a/src/com/bliss/support/preferences/CustomSecureSeekBarPreference.java b/src/com/bliss/support/preferences/CustomSecureSeekBarPreference.java
deleted file mode 100644
index 9a76151..0000000
--- a/src/com/bliss/support/preferences/CustomSecureSeekBarPreference.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-public class CustomSecureSeekBarPreference extends CustomSeekBarPreference {
-
-    public CustomSecureSeekBarPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setPreferenceDataStore(new SecureSettingsStore(context.getContentResolver()));
-    }
-
-    public CustomSecureSeekBarPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setPreferenceDataStore(new SecureSettingsStore(context.getContentResolver()));
-    }
-
-    public CustomSecureSeekBarPreference(Context context) {
-        super(context, null);
-        setPreferenceDataStore(new SecureSettingsStore(context.getContentResolver()));
-    }
-}
diff --git a/src/com/bliss/support/preferences/CustomSeekBarPreference.java b/src/com/bliss/support/preferences/CustomSeekBarPreference.java
index ed3f356..4f59702 100644
--- a/src/com/bliss/support/preferences/CustomSeekBarPreference.java
+++ b/src/com/bliss/support/preferences/CustomSeekBarPreference.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016-2017 The Dirty Unicorns Project
+ * Copyright (C) 2016 The Dirty Unicorns Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,69 +16,71 @@
 
 package com.bliss.support.preferences;
 
+import android.app.AlertDialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.res.TypedArray;
-import android.graphics.PorterDuff;
-import androidx.core.content.res.TypedArrayUtils;
-import androidx.preference.*;
+import android.text.InputType;
 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.ImageView;
+import android.widget.EditText;
 import android.widget.SeekBar;
 import android.widget.TextView;
-import android.widget.Toast;
+
+import androidx.preference.*;
 
 import com.bliss.support.R;
 
-public class CustomSeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener,
-        View.OnClickListener, View.OnLongClickListener {
-    protected final String TAG = getClass().getName();
+public class CustomSeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener {
+    private final String TAG = getClass().getName();
     private static final String SETTINGS_NS = "http://schemas.android.com/apk/res/com.android.settings";
-    protected static final String ANDROIDNS = "http://schemas.android.com/apk/res/android";
+    private static final String ANDROIDNS = "http://schemas.android.com/apk/res/android";
+    private static final int DEFAULT_VALUE = 50;
 
-    protected int mInterval = 1;
-    protected boolean mShowSign = false;
-    protected String mUnits = "";
-    protected boolean mContinuousUpdates = false;
+    private Context mContext;
+    private boolean mAllowEdit;
+    private View mTextContainer;
+    private int mMin = 0;
+    private int mInterval = 1;
+    private int mCurrentValue;
+    private int mDefaultValue = -1;
+    private int mMax = 100;
+    private String mUnits = "";
+    private String mDefaultText = "";
+    private SeekBar mSeekBar;
+    private TextView mTitle;
+    private TextView mStatusText;
+    private AlertDialog mEditValueDialog;
 
-    protected int mMinValue = 0;
-    protected int mMaxValue = 100;
-    protected boolean mDefaultValueExists = false;
-    protected int mDefaultValue;
-    protected boolean mDefaultValueTextExists = false;
-    protected String mDefaultValueText;
-
-    protected int mValue;
-
-    protected TextView mValueTextView;
-    protected ImageView mResetImageView;
-    protected ImageView mMinusImageView;
-    protected ImageView mPlusImageView;
-    protected SeekBar mSeekBar;
-
-    protected boolean mTrackingTouch = false;
-    protected int mTrackingValue;
-
-    public CustomSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public CustomSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomSeekBarPreference);
-        try {
-            mShowSign = a.getBoolean(R.styleable.CustomSeekBarPreference_showSign, mShowSign);
-            String units = a.getString(R.styleable.CustomSeekBarPreference_units);
-            if (units != null)
-                mUnits = " " + units;
-            mContinuousUpdates = a.getBoolean(R.styleable.CustomSeekBarPreference_continuousUpdates, mContinuousUpdates);
-            String defaultValueText = a.getString(R.styleable.CustomSeekBarPreference_defaultValueText);
-            mDefaultValueTextExists = defaultValueText != null && !defaultValueText.isEmpty();
-            if (mDefaultValueTextExists) {
-                mDefaultValueText = defaultValueText;
-            }
-        } finally {
-            a.recycle();
+        mContext = context;
+        final TypedArray a = context.obtainStyledAttributes(
+                attrs, R.styleable.CustomSeekBarPreference);
+
+        mAllowEdit = attrs.getAttributeBooleanValue(null, "allowEditText", false);
+        mMax = attrs.getAttributeIntValue(ANDROIDNS, "max", 100);
+        mMin = attrs.getAttributeIntValue(SETTINGS_NS, "min", 0);
+        mDefaultValue = attrs.getAttributeIntValue(ANDROIDNS, "defaultValue", -1);
+        if (mDefaultValue > mMax) {
+            mDefaultValue = mMax;
+        }
+        mUnits = getAttributeStringValue(attrs, SETTINGS_NS, "units", "");
+        mDefaultText = getAttributeStringValue(attrs, SETTINGS_NS, "defaultText",
+                            context.getResources().getString(R.string.default_text));
+        Integer id = a.getResourceId(R.styleable.CustomSeekBarPreference_units, 0);
+        if (id > 0) {
+            mUnits = context.getResources().getString(id);
+        }
+        id = a.getResourceId(R.styleable.CustomSeekBarPreference_defaultText, 0);
+        if (id > 0) {
+            mDefaultText = context.getResources().getString(id);
         }
 
         try {
@@ -88,20 +90,11 @@
         } catch (Exception e) {
             Log.e(TAG, "Invalid interval value", e);
         }
-        mMinValue = attrs.getAttributeIntValue(SETTINGS_NS, "min", mMinValue);
-        mMaxValue = attrs.getAttributeIntValue(ANDROIDNS, "max", mMaxValue);
-        if (mMaxValue < mMinValue)
-            mMaxValue = mMinValue;
-        String defaultValue = attrs.getAttributeValue(ANDROIDNS, "defaultValue");
-        mDefaultValueExists = defaultValue != null && !defaultValue.isEmpty();
-        if (mDefaultValueExists) {
-            mDefaultValue = getLimitedValue(Integer.parseInt(defaultValue));
-            mValue = mDefaultValue;
-        } else {
-            mValue = mMinValue;
-        }
 
+        a.recycle();
         mSeekBar = new SeekBar(context, attrs);
+        mSeekBar.setMax(mMax - mMin);
+        mSeekBar.setOnSeekBarChangeListener(this);
         setLayoutResource(R.layout.preference_custom_seekbar);
     }
 
@@ -110,23 +103,43 @@
     }
 
     public CustomSeekBarPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, TypedArrayUtils.getAttr(context,
-                androidx.preference.R.attr.preferenceStyle,
-                android.R.attr.preferenceStyle));
+        this(context, attrs, 0);
     }
 
     public CustomSeekBarPreference(Context context) {
         this(context, null);
     }
 
+    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 onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
+    public void onDependencyChanged(Preference dependency, boolean disableDependent) {
+        super.onDependencyChanged(dependency, disableDependent);
+        this.setShouldDisableView(true);
+        if (mTitle != null)
+            mTitle.setEnabled(!disableDependent);
+        if (mSeekBar != null)
+            mSeekBar.setEnabled(!disableDependent);
+        if (mStatusText != null)
+            mStatusText.setEnabled(!disableDependent);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
         try
         {
             // move our seekbar to the new view we've been given
             ViewParent oldContainer = mSeekBar.getParent();
-            ViewGroup newContainer = (ViewGroup) holder.findViewById(R.id.seekbar);
+            ViewGroup newContainer = (ViewGroup) view.findViewById(R.id.seekBarPrefBarContainer);
+
             if (oldContainer != newContainer) {
                 // remove the seekbar from the old view
                 if (oldContainer != null) {
@@ -140,226 +153,165 @@
         } catch (Exception ex) {
             Log.e(TAG, "Error binding view: " + ex.toString());
         }
+        mTextContainer = (View) view.findViewById(R.id.text_container);
+        mStatusText = (TextView) view.findViewById(R.id.seekBarPrefValue);
+        if (mCurrentValue == mDefaultValue) {
+            mStatusText.setText(mDefaultText);
+        } else {
+            mStatusText.setText(String.valueOf(mCurrentValue) + mUnits);
+        }
 
-        mSeekBar.setMax(getSeekValue(mMaxValue));
-        mSeekBar.setProgress(getSeekValue(mValue));
+        if (mAllowEdit) {
+            mTextContainer.setOnLongClickListener(new View.OnLongClickListener() {
+                @Override
+                public boolean onLongClick(View v) {
+                    showEditDialog();
+                    return true;
+                }
+            });
+        }
+
+        mSeekBar.setProgress(mCurrentValue - mMin);
+        mTitle = (TextView) view.findViewById(android.R.id.title);
+
+        view.setDividerAllowedAbove(false);
+        //view.setDividerAllowedBelow(false);
+
         mSeekBar.setEnabled(isEnabled());
-
-        mValueTextView = (TextView) holder.findViewById(R.id.value);
-        mResetImageView = (ImageView) holder.findViewById(R.id.reset);
-        mMinusImageView = (ImageView) holder.findViewById(R.id.minus);
-        mPlusImageView = (ImageView) holder.findViewById(R.id.plus);
-
-        updateValueViews();
-
-        mSeekBar.setOnSeekBarChangeListener(this);
-        mResetImageView.setOnClickListener(this);
-        mMinusImageView.setOnClickListener(this);
-        mPlusImageView.setOnClickListener(this);
-        mResetImageView.setOnLongClickListener(this);
-        mMinusImageView.setOnLongClickListener(this);
-        mPlusImageView.setOnLongClickListener(this);
     }
 
-    protected int getLimitedValue(int v) {
-        return v < mMinValue ? mMinValue : (v > mMaxValue ? mMaxValue : v);
+    private void showEditDialog() {
+        LayoutInflater inflater = LayoutInflater.from(mContext);
+        View editDialogView = inflater.inflate(R.layout.edit_dialog, null);
+        EditText editText = editDialogView.findViewById(R.id.editText);
+        editText.setText(mStatusText.getText());
+        editText.setSelection(editText.getText().length());
+        editText.setInputType(InputType.TYPE_CLASS_NUMBER);
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(mContext)
+                .setView(editDialogView)
+                .setTitle(mContext.getString(R.string.seek_value_edit_label))
+                .setPositiveButton(R.string.dlg_ok,
+                    new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            // check user value against min and max value
+                            final int userValue = Math.max(Integer.parseInt(editText.getText().toString()), mMin);
+                            final int valueToSet = Math.min(userValue, mMax);
+                            mEditValueDialog.dismiss();
+                            refresh(valueToSet);
+                        }
+                });
+                builder.setNeutralButton(R.string.cancel,
+                    new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            mEditValueDialog.dismiss();
+                        }
+                });
+        mEditValueDialog = builder.create();
+        mEditValueDialog.show();
     }
 
-    protected int getSeekValue(int v) {
-        return 0 - Math.floorDiv(mMinValue - v, mInterval);
+    public void setMax(int max) {
+        mMax = max;
+        mSeekBar.setMax(mMax - mMin);
     }
 
-    protected String getTextValue(int v) {
-        if (mDefaultValueTextExists && mDefaultValueExists && v == mDefaultValue) {
-            return mDefaultValueText;
-        }
-        return (mShowSign && v > 0 ? "+" : "") + String.valueOf(v) + mUnits;
+    public void setMin(int min) {
+        mMin = min;
+        mSeekBar.setMax(mMax - mMin);
     }
 
-    protected void updateValueViews() {
-        if (mValueTextView != null) {
-            if (!mTrackingTouch || mContinuousUpdates) {
-                if (mDefaultValueTextExists && mDefaultValueExists && mValue == mDefaultValue) {
-                    mValueTextView.setText(mDefaultValueText + " (" +
-                        getContext().getString(R.string.custom_seekbar_default_value) + ")");
-                } else {
-                    mValueTextView.setText(getContext().getString(R.string.custom_seekbar_value, getTextValue(mValue)) +
-                        (mDefaultValueExists && mValue == mDefaultValue ? " (" +
-                        getContext().getString(R.string.custom_seekbar_default_value) + ")" : ""));
-                }
-            } else {
-                if (mDefaultValueTextExists && mDefaultValueExists && mTrackingValue == mDefaultValue) {
-                    mValueTextView.setText("[" + mDefaultValueText + "]");
-                } else {
-                    mValueTextView.setText(getContext().getString(R.string.custom_seekbar_value, "[" + getTextValue(mTrackingValue) + "]"));
-                }
-            }
-        }
-        if (mResetImageView != null) {
-            if (!mDefaultValueExists || mValue == mDefaultValue || mTrackingTouch)
-                mResetImageView.setVisibility(View.INVISIBLE);
-            else
-                mResetImageView.setVisibility(View.VISIBLE);
-        }
-        if (mMinusImageView != null) {
-            if (mValue == mMinValue || mTrackingTouch) {
-                mMinusImageView.setClickable(false);
-                mMinusImageView.setColorFilter(getContext().getColor(R.color.disabled_text_color),
-                    PorterDuff.Mode.MULTIPLY);
-            } else {
-                mMinusImageView.setClickable(true);
-                mMinusImageView.clearColorFilter();
-            }
-        }
-        if (mPlusImageView != null) {
-            if (mValue == mMaxValue || mTrackingTouch) {
-                mPlusImageView.setClickable(false);
-                mPlusImageView.setColorFilter(getContext().getColor(R.color.disabled_text_color), PorterDuff.Mode.MULTIPLY);
-            } else {
-                mPlusImageView.setClickable(true);
-                mPlusImageView.clearColorFilter();
-            }
-        }
+    public void setIntervalValue(int value) {
+        mInterval = value;
     }
 
-    protected void changeValue(int newValue) {
-        // for subclasses
+    public void setValue(int value) {
+        mCurrentValue = value;
     }
 
     @Override
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-        int newValue = getLimitedValue(mMinValue + (progress * mInterval));
-        if (mTrackingTouch && !mContinuousUpdates) {
-            mTrackingValue = newValue;
-            updateValueViews();
-        } else if (mValue != newValue) {
-            // change rejected, revert to the previous value
-            if (!callChangeListener(newValue)) {
-                mSeekBar.setProgress(getSeekValue(mValue));
-                return;
-            }
-            // change accepted, store it
-            changeValue(newValue);
-            persistInt(newValue);
+        int newValue = progress + mMin;
+        if (newValue > mMax)
+            newValue = mMax;
+        else if (newValue < mMin)
+            newValue = mMin;
+        else if (mInterval != 1 && newValue % mInterval != 0)
+            newValue = Math.round(((float) newValue) / mInterval) * mInterval;
 
-            mValue = newValue;
-            updateValueViews();
+        // change rejected, revert to the previous value
+        if (!callChangeListener(newValue)) {
+            seekBar.setProgress(mCurrentValue - mMin);
+            return;
         }
+        // change accepted, store it
+        mCurrentValue = newValue;
+        if (mStatusText != null) {
+            if (newValue == mDefaultValue) {
+                mStatusText.setText(mDefaultText);
+            } else {
+                mStatusText.setText(String.valueOf(newValue) + mUnits);
+            }
+        }
+        persistInt(newValue);
+    }
+
+    public void refresh(int newValue) {
+        // this will trigger onProgressChanged and refresh everything
+        mSeekBar.setProgress(newValue - mMin);
     }
 
     @Override
     public void onStartTrackingTouch(SeekBar seekBar) {
-        mTrackingValue = mValue;
-        mTrackingTouch = true;
     }
 
     @Override
     public void onStopTrackingTouch(SeekBar seekBar) {
-        mTrackingTouch = false;
-        if (!mContinuousUpdates)
-            onProgressChanged(mSeekBar, getSeekValue(mTrackingValue), false);
         notifyChanged();
     }
 
     @Override
-    public void onClick(View v) {
-        int id = v.getId();
-        if (id == R.id.reset) {
-            Toast.makeText(getContext(), getContext().getString(R.string.custom_seekbar_default_value_to_set, getTextValue(mDefaultValue)),
-                    Toast.LENGTH_LONG).show();
-        } else if (id == R.id.minus) {
-            setValue(mValue - mInterval, true);
-        } else if (id == R.id.plus) {
-            setValue(mValue + mInterval, true);
-        }
+    protected Object onGetDefaultValue(TypedArray ta, int index) {
+        int defaultValue = ta.getInt(index, DEFAULT_VALUE);
+        return defaultValue;
     }
 
     @Override
-    public boolean onLongClick(View v) {
-        int id = v.getId();
-        if (id == R.id.reset) {
-            setValue(mDefaultValue, true);
-            //Toast.makeText(getContext(), getContext().getString(R.string.custom_seekbar_default_value_is_set),
-            //        Toast.LENGTH_LONG).show();
-        } else if (id == R.id.minus) {
-            setValue(mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue < mValue * 2 ? Math.floorDiv(mMaxValue + mMinValue, 2) : mMinValue, true);
-        } else if (id == R.id.plus) {
-                setValue(mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue > mValue * 2 ? -1 * Math.floorDiv(-1 * (mMaxValue + mMinValue), 2) : mMaxValue, true);
-        }
-        return true;
-    }
-
-    // dont need too much shit about initial and default values
-    // its all done in constructor already
-
-    @Override
     protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        if (restoreValue)
-            mValue = getPersistedInt(mValue);
+        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 setDefaultValue(int value) {
+        mDefaultValue = value;
+        if (mDefaultValue > mMax) {
+            mDefaultValue = mMax;
+        }
+        if (mCurrentValue == mDefaultValue && mStatusText != null) {
+            mStatusText.setText(mDefaultText);
+        }
     }
 
     @Override
-    public void setDefaultValue(Object defaultValue) {
-        if (defaultValue instanceof Integer)
-            setDefaultValue((Integer) defaultValue, mSeekBar != null);
-        else
-            setDefaultValue(defaultValue == null ? (String) null : defaultValue.toString(), mSeekBar != null);
-    }
-
-    public void setDefaultValue(int newValue, boolean update) {
-        newValue = getLimitedValue(newValue);
-        if (!mDefaultValueExists || mDefaultValue != newValue) {
-            mDefaultValueExists = true;
-            mDefaultValue = newValue;
-            if (update)
-                updateValueViews();
+    public void setEnabled(boolean enabled) {
+        if (mSeekBar != null && mStatusText != null && mTitle != null) {
+            mSeekBar.setEnabled(enabled);
+            mStatusText.setEnabled(enabled);
+            mTitle.setEnabled(enabled);
         }
-    }
-
-    public void setDefaultValue(String newValue, boolean update) {
-        if (mDefaultValueExists && (newValue == null || newValue.isEmpty())) {
-            mDefaultValueExists = false;
-            if (update)
-                updateValueViews();
-        } else if (newValue != null && !newValue.isEmpty()) {
-            setDefaultValue(Integer.parseInt(newValue), update);
-        }
-    }
-
-    public void setMax(int max) {
-        mMaxValue = max;
-        mSeekBar.setMax(mMaxValue - mMinValue);
-    }
-
-    public void setMin(int min) {
-        mMinValue = min;
-        mSeekBar.setMax(mMaxValue - mMinValue);
-    }
-
-    public void setValue(int newValue) {
-        mValue = getLimitedValue(newValue);
-        if (mSeekBar != null) mSeekBar.setProgress(getSeekValue(mValue));
-    }
-
-    public void setValue(int newValue, boolean update) {
-        newValue = getLimitedValue(newValue);
-        if (mValue != newValue) {
-            if (update)
-                mSeekBar.setProgress(getSeekValue(newValue));
-            else
-                mValue = newValue;
-        }
-    }
-
-    public int getValue() {
-        return mValue;
-    }
-
-    // need some methods here to set/get other attrs at runtime,
-    // but who really need this ...
-
-    public void refresh(int newValue) {
-        // this will ...
-        setValue(newValue, mSeekBar != null);
+        super.setEnabled(enabled);
     }
 }
diff --git a/src/com/bliss/support/preferences/CustomSystemSeekBarPreference.java b/src/com/bliss/support/preferences/CustomSystemSeekBarPreference.java
deleted file mode 100644
index f31b915..0000000
--- a/src/com/bliss/support/preferences/CustomSystemSeekBarPreference.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-public class CustomSystemSeekBarPreference extends CustomSeekBarPreference {
-
-    public CustomSystemSeekBarPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
-    }
-
-    public CustomSystemSeekBarPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
-    }
-
-    public CustomSystemSeekBarPreference(Context context) {
-        super(context, null);
-        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
-    }
-}
diff --git a/src/com/bliss/support/preferences/GlobalCheckBoxPreference.java b/src/com/bliss/support/preferences/GlobalCheckBoxPreference.java
new file mode 100644
index 0000000..dd8acd6
--- /dev/null
+++ b/src/com/bliss/support/preferences/GlobalCheckBoxPreference.java
@@ -0,0 +1,69 @@
+/*
+ * 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 com.bliss.support.preferences;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.util.AttributeSet;
+
+import androidx.preference.CheckBoxPreference;
+
+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.System.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
+                : (Boolean) defaultValue);
+    }
+
+}
+
diff --git a/src/com/bliss/support/preferences/GlobalSettingListPreference.java b/src/com/bliss/support/preferences/GlobalSettingListPreference.java
deleted file mode 100644
index 2d16e88..0000000
--- a/src/com/bliss/support/preferences/GlobalSettingListPreference.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2016-2018 crDroid Android Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import androidx.preference.ListPreference;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.provider.Settings;
-
-public class GlobalSettingListPreference extends ListPreference {
-
-    private boolean mAutoSummary = false;
-
-    public GlobalSettingListPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setPreferenceDataStore(new GlobalSettingsStore(context.getContentResolver()));
-    }
-
-    public GlobalSettingListPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setPreferenceDataStore(new GlobalSettingsStore(context.getContentResolver()));
-    }
-
-    public GlobalSettingListPreference(Context context) {
-        super(context);
-        setPreferenceDataStore(new GlobalSettingsStore(context.getContentResolver()));
-    }
-
-    @Override
-    public void setValue(String value) {
-        super.setValue(value);
-        if (mAutoSummary || TextUtils.isEmpty(getSummary())) {
-            setSummary(getEntry(), true);
-        }
-    }
-
-    @Override
-    public void setSummary(CharSequence summary) {
-        setSummary(summary, false);
-    }
-
-    private void setSummary(CharSequence summary, boolean autoSummary) {
-        mAutoSummary = autoSummary;
-        super.setSummary(summary);
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        // This is what default ListPreference implementation is doing without respecting
-        // real default value:
-        //setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
-        // Instead, we better do
-        setValue(restoreValue ? getPersistedString((String) defaultValue) : (String) defaultValue);
-    }
-
-    public int getIntValue(int defValue) {
-        return getValue() == null ? defValue : Integer.valueOf(getValue());
-    }
-}
diff --git a/src/com/bliss/support/preferences/GlobalSettingMasterSwitchPreference.java b/src/com/bliss/support/preferences/GlobalSettingMasterSwitchPreference.java
deleted file mode 100644
index aaa064b..0000000
--- a/src/com/bliss/support/preferences/GlobalSettingMasterSwitchPreference.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import com.bliss.support.preferences.GlobalSettingsStore;
-
-public class GlobalSettingMasterSwitchPreference extends MasterSwitchPreference {
-
-    public GlobalSettingMasterSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setPreferenceDataStore(new GlobalSettingsStore(context.getContentResolver()));
-    }
-
-    public GlobalSettingMasterSwitchPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setPreferenceDataStore(new GlobalSettingsStore(context.getContentResolver()));
-    }
-
-    public GlobalSettingMasterSwitchPreference(Context context) {
-        super(context);
-        setPreferenceDataStore(new GlobalSettingsStore(context.getContentResolver()));
-    }
-
-}
diff --git a/src/com/bliss/support/preferences/GlobalSettingSeekBarPreference.java b/src/com/bliss/support/preferences/GlobalSettingSeekBarPreference.java
index 545b1f4..674bdc0 100644
--- a/src/com/bliss/support/preferences/GlobalSettingSeekBarPreference.java
+++ b/src/com/bliss/support/preferences/GlobalSettingSeekBarPreference.java
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.bliss.support.preferences;
 
 import android.content.Context;
@@ -34,4 +35,12 @@
         super(context, null);
         setPreferenceDataStore(new GlobalSettingsStore(context.getContentResolver()));
     }
+
+    @Override
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        if (defaultValue == null) {
+            defaultValue = 0;
+        }
+        setValue(restoreValue ? getPersistedInt((Integer) defaultValue) : (Integer) defaultValue);
+    }
 }
diff --git a/src/com/bliss/support/preferences/GlobalSettingSwitchPreference.java b/src/com/bliss/support/preferences/GlobalSettingSwitchPreference.java
index 34f6666..5ade69b 100644
--- a/src/com/bliss/support/preferences/GlobalSettingSwitchPreference.java
+++ b/src/com/bliss/support/preferences/GlobalSettingSwitchPreference.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016-2019 crDroid Android Project
+ * 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.
@@ -13,17 +13,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.bliss.support.preferences;
 
 import android.content.Context;
 import android.provider.Settings;
-import android.os.UserHandle;
 import android.util.AttributeSet;
 
-import com.bliss.support.preferences.SelfRemovingSwitchPreference;
+import androidx.preference.SwitchPreference;
 
-public class GlobalSettingSwitchPreference extends SelfRemovingSwitchPreference {
-
+public class GlobalSettingSwitchPreference extends SwitchPreference {
     public GlobalSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
     }
@@ -33,22 +32,34 @@
     }
 
     public GlobalSettingSwitchPreference(Context context) {
-        super(context);
+        super(context, null);
     }
 
     @Override
-    protected boolean isPersisted() {
-        return Settings.Global.getString(getContext().getContentResolver(), getKey()) != null;
+    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 void putBoolean(String key, boolean value) {
-        Settings.Global.putInt(getContext().getContentResolver(), key, value ? 1 : 0);
-    }
-
-    @Override
-    protected boolean getBoolean(String key, boolean defaultValue) {
+    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
+        if (!shouldPersist()) {
+            return defaultReturnValue;
+        }
         return Settings.Global.getInt(getContext().getContentResolver(),
-                key, defaultValue ? 1 : 0) != 0;
+                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/com/bliss/support/preferences/LongClickablePreference.java b/src/com/bliss/support/preferences/LongClickablePreference.java
deleted file mode 100644
index ce25726..0000000
--- a/src/com/bliss/support/preferences/LongClickablePreference.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-public class LongClickablePreference extends Preference {
-
-    private Handler mHandler = new Handler();
-    private boolean mAllowNormalClick;
-    private boolean mAllowBurst;
-
-    private int mClickableViewId = 0;
-    private int mLongClickDurationMillis;
-    private int mLongClickBurstMillis = 0;
-    private PreferenceViewHolder mViewHolder;
-    private Preference.OnPreferenceClickListener mClickListener;
-    private Preference.OnPreferenceClickListener mLongClickListener;
-
-    public LongClickablePreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public LongClickablePreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public LongClickablePreference(Context context) {
-        super(context);
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        mViewHolder = holder;
-
-        setupClickListeners();
-    }
-
-    @Override
-    public void setOnPreferenceClickListener(
-            Preference.OnPreferenceClickListener onPreferenceClickListener) {
-        mClickListener = onPreferenceClickListener;
-
-        setupClickListeners();
-    }
-
-    public void setOnLongClickListener(int viewId, int longClickDurationMillis,
-            Preference.OnPreferenceClickListener onPreferenceClickListener) {
-        mClickableViewId = viewId;
-        mLongClickDurationMillis = longClickDurationMillis;
-        mLongClickListener = onPreferenceClickListener;
-
-        setupClickListeners();
-    }
-
-    private Runnable mLongClickRunnable = new Runnable() {
-            @Override
-            public void run() {
-                mAllowNormalClick = false;
-                mLongClickListener.onPreferenceClick(LongClickablePreference.this);
-                if (mAllowBurst && mLongClickBurstMillis > 0) {
-                    mHandler.postDelayed(this, mLongClickBurstMillis);
-                }
-            }
-    };
-
-    public void setLongClickBurst(int intervalMillis) {
-        mLongClickBurstMillis = intervalMillis;
-    }
-
-    private void setupClickListeners() {
-        // We can't put long click listener on our view without sacrificing default
-        // preference click functionality, so detect long clicks manually with touch listener
-        if (mClickableViewId != 0 && mViewHolder != null) {
-            View view = mViewHolder.findViewById(mClickableViewId);
-            if (view != null) {
-                view.setOnTouchListener(new View.OnTouchListener() {
-                        @Override
-                        public boolean onTouch(View v, MotionEvent event) {
-                            switch (event.getActionMasked()) {
-                                case MotionEvent.ACTION_DOWN:
-                                    mAllowNormalClick = true;
-                                    mAllowBurst = true;
-                                    mHandler.postDelayed(mLongClickRunnable,
-                                            mLongClickDurationMillis);
-                                    break;
-                                case MotionEvent.ACTION_UP:
-                                    mHandler.removeCallbacks(mLongClickRunnable);
-                                    mAllowBurst = false;
-                                    break;
-                            }
-                            return false;
-                        }
-                });
-            }
-        }
-        // Use our own preference click listener to handle both normal and long clicks
-        if (getOnPreferenceClickListener() == null) {
-            super.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                    @Override
-                    public boolean onPreferenceClick(Preference preference) {
-                        mAllowBurst = false;
-                        mHandler.removeCallbacks(mLongClickRunnable);
-                        if (mAllowNormalClick) {
-                            return mClickListener != null &&
-                                    mClickListener.onPreferenceClick(preference);
-                        } else {
-                            // Long press done
-                            return true;
-                        }
-                    }
-
-            });
-        }
-    }
-}
diff --git a/src/com/bliss/support/preferences/MasterSwitchPreference.java b/src/com/bliss/support/preferences/MasterSwitchPreference.java
index 7e55768..1bd1f35 100644
--- a/src/com/bliss/support/preferences/MasterSwitchPreference.java
+++ b/src/com/bliss/support/preferences/MasterSwitchPreference.java
@@ -19,7 +19,6 @@
 import android.content.Context;
 import android.content.res.TypedArray;
 import androidx.preference.PreferenceViewHolder;
-import android.provider.Settings;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.Switch;
@@ -88,7 +87,7 @@
     }
 
     public boolean isChecked() {
-        return mChecked;
+        return mSwitch != null && mSwitch.isEnabled() && mChecked;
     }
 
     public void setChecked(boolean checked) {
@@ -115,32 +114,15 @@
     }
 
     @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;
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        setChecked(restoreValue ? getPersistedBoolean((Boolean) defaultValue)
+                : (Boolean) defaultValue);
     }
 
-    @Override
-    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-
-        return Settings.System.getInt(getContext().getContentResolver(),
-                getKey(), defaultReturnValue ? 1 : 0) != 0;
-    }
-
-    protected boolean isPersisted() {
-        // Using getString instead of getInt so we can simply check for null
-        // instead of catching an exception. (All values are stored as strings.)
-        return Settings.System.getString(getContext().getContentResolver(), getKey()) != null;
+    /**
+     * Call from outside when value might have changed.
+     */
+    public void reloadValue() {
+        setChecked(getPersistedBoolean(mChecked));
     }
 }
diff --git a/src/com/bliss/support/preferences/PackageListAdapter.java b/src/com/bliss/support/preferences/PackageListAdapter.java
index e057e20..d6d944b 100644
--- a/src/com/bliss/support/preferences/PackageListAdapter.java
+++ b/src/com/bliss/support/preferences/PackageListAdapter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 The Android Open Source Project
+ * Copyright (C) 2012-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.
@@ -32,17 +32,24 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.bliss.support.R;
+
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.TreeSet;
 
-import com.bliss.support.R;
-
 public class PackageListAdapter extends BaseAdapter implements Runnable {
     private PackageManager mPm;
     private LayoutInflater mInflater;
-    private final List<PackageItem> mInstalledPackages = new LinkedList<PackageItem>();
+    private List<PackageItem> mInstalledPackages = new LinkedList<PackageItem>();
+
+    // Packages which don't have launcher icons, but which we want to show nevertheless
+    private static final String[] PACKAGE_WHITELIST = new String[] {
+        "android",                          /* system server */
+        "com.android.systemui",             /* system UI */
+        "com.android.providers.downloads"   /* download provider */
+    };
 
     private final Handler mHandler = new Handler() {
         @Override
@@ -51,6 +58,8 @@
             int index = Collections.binarySearch(mInstalledPackages, item);
             if (index < 0) {
                 mInstalledPackages.add(-index - 1, item);
+            } else {
+                mInstalledPackages.get(index).activityTitles.addAll(item.activityTitles);
             }
             notifyDataSetChanged();
         }
@@ -59,6 +68,7 @@
     public static class PackageItem implements Comparable<PackageItem> {
         public final String packageName;
         public final CharSequence title;
+        private final TreeSet<CharSequence> activityTitles = new TreeSet<CharSequence>();
         public final Drawable icon;
 
         PackageItem(String packageName, CharSequence title, Drawable icon) {
@@ -112,6 +122,7 @@
             holder = new ViewHolder();
             convertView.setTag(holder);
             holder.title = (TextView) convertView.findViewById(com.android.internal.R.id.title);
+            holder.summary = (TextView) convertView.findViewById(com.android.internal.R.id.summary);
             holder.icon = (ImageView) convertView.findViewById(R.id.icon);
         }
 
@@ -119,6 +130,20 @@
         holder.title.setText(applicationInfo.title);
         holder.icon.setImageDrawable(applicationInfo.icon);
 
+        boolean needSummary = applicationInfo.activityTitles.size() > 0;
+        if (applicationInfo.activityTitles.size() == 1) {
+            if (TextUtils.equals(applicationInfo.title, applicationInfo.activityTitles.first())) {
+                needSummary = false;
+            }
+        }
+
+        if (needSummary) {
+            holder.summary.setText(TextUtils.join(", ", applicationInfo.activityTitles));
+            holder.summary.setVisibility(View.VISIBLE);
+        } else {
+            holder.summary.setVisibility(View.GONE);
+        }
+
         return convertView;
     }
 
@@ -129,18 +154,33 @@
 
     @Override
     public void run() {
-        List<ApplicationInfo> installedAppsInfo = mPm.getInstalledApplications(PackageManager.GET_META_DATA);
-        for (ApplicationInfo appInfo : installedAppsInfo) {
-            if (appInfo.icon != 0) {
+        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) {
+            ApplicationInfo appInfo = info.activityInfo.applicationInfo;
+            final PackageItem item = new PackageItem(appInfo.packageName,
+                    appInfo.loadLabel(mPm), appInfo.loadIcon(mPm));
+            item.activityTitles.add(info.loadLabel(mPm));
+            mHandler.obtainMessage(0, item).sendToTarget();
+        }
+
+        for (String packageName : PACKAGE_WHITELIST) {
+            try {
+                ApplicationInfo appInfo = mPm.getApplicationInfo(packageName, 0);
                 final PackageItem item = new PackageItem(appInfo.packageName,
                         appInfo.loadLabel(mPm), appInfo.loadIcon(mPm));
                 mHandler.obtainMessage(0, item).sendToTarget();
+            } catch (PackageManager.NameNotFoundException ignored) {
+                // package not present, so nothing to add -> ignore it
             }
         }
     }
 
     private static class ViewHolder {
         TextView title;
+        TextView summary;
         ImageView icon;
     }
 }
diff --git a/src/com/bliss/support/preferences/SecureCheckBoxPreference.java b/src/com/bliss/support/preferences/SecureCheckBoxPreference.java
new file mode 100644
index 0000000..85f955e
--- /dev/null
+++ b/src/com/bliss/support/preferences/SecureCheckBoxPreference.java
@@ -0,0 +1,68 @@
+/*
+ * 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 com.bliss.support.preferences;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.util.AttributeSet;
+
+import androidx.preference.CheckBoxPreference;
+
+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.System.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
+                : (Boolean) defaultValue);
+    }
+}
+
diff --git a/src/com/bliss/support/preferences/SecureSettingMasterSwitchPreference.java b/src/com/bliss/support/preferences/SecureSettingMasterSwitchPreference.java
deleted file mode 100644
index f8454a8..0000000
--- a/src/com/bliss/support/preferences/SecureSettingMasterSwitchPreference.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import com.bliss.support.preferences.SecureSettingsStore;
-
-public class SecureSettingMasterSwitchPreference extends MasterSwitchPreference {
-
-    public SecureSettingMasterSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setPreferenceDataStore(new SecureSettingsStore(context.getContentResolver()));
-    }
-
-    public SecureSettingMasterSwitchPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setPreferenceDataStore(new SecureSettingsStore(context.getContentResolver()));
-    }
-
-    public SecureSettingMasterSwitchPreference(Context context) {
-        super(context);
-        setPreferenceDataStore(new SecureSettingsStore(context.getContentResolver()));
-    }
-
-}
diff --git a/src/com/bliss/support/preferences/SecureSettingSeekBarPreference.java b/src/com/bliss/support/preferences/SecureSettingSeekBarPreference.java
index 1caa012..4a86122 100644
--- a/src/com/bliss/support/preferences/SecureSettingSeekBarPreference.java
+++ b/src/com/bliss/support/preferences/SecureSettingSeekBarPreference.java
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.bliss.support.preferences;
 
 import android.content.Context;
@@ -34,4 +35,12 @@
         super(context, null);
         setPreferenceDataStore(new SecureSettingsStore(context.getContentResolver()));
     }
+
+    @Override
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        if (defaultValue == null) {
+            defaultValue = 0;
+        }
+        setValue(restoreValue ? getPersistedInt((Integer) defaultValue) : (Integer) defaultValue);
+    }
 }
diff --git a/src/com/bliss/support/preferences/SecureSettingSwitchPreference.java b/src/com/bliss/support/preferences/SecureSettingSwitchPreference.java
index a0af4ed..77b750a 100644
--- a/src/com/bliss/support/preferences/SecureSettingSwitchPreference.java
+++ b/src/com/bliss/support/preferences/SecureSettingSwitchPreference.java
@@ -18,14 +18,11 @@
 
 import android.content.Context;
 import android.provider.Settings;
-import androidx.preference.SwitchPreference;
-import android.os.UserHandle;
 import android.util.AttributeSet;
 
-import com.bliss.support.preferences.SelfRemovingSwitchPreference;
+import androidx.preference.SwitchPreference;
 
-public class SecureSettingSwitchPreference extends SelfRemovingSwitchPreference {
-
+public class SecureSettingSwitchPreference extends SwitchPreference {
     public SecureSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
     }
@@ -35,22 +32,34 @@
     }
 
     public SecureSettingSwitchPreference(Context context) {
-        super(context);
+        super(context, null);
     }
 
     @Override
-    protected boolean isPersisted() {
-        return Settings.Secure.getString(getContext().getContentResolver(), getKey()) != null;
+    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 void putBoolean(String key, boolean value) {
-        Settings.Secure.putIntForUser(getContext().getContentResolver(), key, value ? 1 : 0, UserHandle.USER_CURRENT);
+    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
+        if (!shouldPersist()) {
+            return defaultReturnValue;
+        }
+        return Settings.Secure.getInt(getContext().getContentResolver(),
+                getKey(), defaultReturnValue ? 1 : 0) != 0;
     }
 
     @Override
-    protected boolean getBoolean(String key, boolean defaultValue) {
-        return Settings.Secure.getIntForUser(getContext().getContentResolver(),
-                key, defaultValue ? 1 : 0, UserHandle.USER_CURRENT) != 0;
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        setChecked(Settings.Secure.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
+                : (Boolean) defaultValue);
     }
 }
diff --git a/src/com/bliss/support/preferences/SecureSettingsStore.java b/src/com/bliss/support/preferences/SecureSettingsStore.java
index d44bcf0..14b9d17 100644
--- a/src/com/bliss/support/preferences/SecureSettingsStore.java
+++ b/src/com/bliss/support/preferences/SecureSettingsStore.java
@@ -18,7 +18,6 @@
 package com.bliss.support.preferences;
 
 import android.content.ContentResolver;
-import android.os.UserHandle;
 import android.preference.PreferenceDataStore;
 import android.provider.Settings;
 
@@ -32,7 +31,7 @@
     }
 
     public boolean getBoolean(String key, boolean defValue) {
-        return Settings.Secure.getIntForUser(mContentResolver, key, defValue ? 1 : 0, UserHandle.USER_CURRENT) != 0;
+        return getInt(key, defValue ? 1 : 0) != 0;
     }
 
     public float getFloat(String key, float defValue) {
diff --git a/src/com/bliss/support/preferences/SeekBarPreferenceCham.java b/src/com/bliss/support/preferences/SeekBarPreferenceCham.java
deleted file mode 100644
index 7c01e98..0000000
--- a/src/com/bliss/support/preferences/SeekBarPreferenceCham.java
+++ /dev/null
@@ -1,389 +0,0 @@
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
-import android.view.WindowManager;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.SeekBar;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.bliss.support.R;
-
-public class SeekBarPreferenceCham extends Preference implements SeekBar.OnSeekBarChangeListener {
-
-    private final String TAG = getClass().getName();
-
-    private static final String ANDROIDNS = "http://schemas.android.com/apk/res/android";
-    private static final String PDXNS = "http://schemas.android.com/apk/res-auto";
-    private static final int DEFAULT_VALUE = 50;
-
-    private int mMaxValue      = 100;
-    private int mMinValue      = 0;
-    private int mInterval      = 1;
-    private int mDefaultValue  = -1;
-    private int mCurrentValue;
-    private String mUnitsLeft  = "";
-    private String mUnitsRight = "";
-    private SeekBar mSeekBar;
-    //private TextView mTitle;
-    private TextView mUnitsLeftText;
-    private TextView mUnitsRightText;
-    private ImageView mImagePlus;
-    private ImageView mImageMinus;
-    private Drawable mProgressThumb;
-    private int mThumbDefaultValueColor;
-
-    private TextView mStatusText;
-    private TextView mPopupValue;
-    private boolean mTrackingTouch = false;
-    private boolean mPopupAdded = false;
-    private int mPopupWidth = 0;
-    private boolean initialised = false;
-
-    public SeekBarPreferenceCham(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setLayoutResource(R.layout.seek_bar_preference);
-        setValuesFromXml(attrs, context);
-    }
-
-    public SeekBarPreferenceCham(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setLayoutResource(R.layout.seek_bar_preference);
-        setValuesFromXml(attrs, context);
-    }
-
-    private void setValuesFromXml(AttributeSet attrs, Context context) {
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, R.styleable.SeekBarPreference);
-
-        mMaxValue = attrs.getAttributeIntValue(ANDROIDNS, "max", 100);
-        mMinValue = attrs.getAttributeIntValue(ANDROIDNS, "min", 0);
-        mDefaultValue = attrs.getAttributeIntValue(ANDROIDNS, "defaultValue", -1);
-        if (mDefaultValue != attrs.getAttributeIntValue(ANDROIDNS, "defaultValue", -2)) {
-            mDefaultValue = (mMinValue + mMaxValue) / 2;
-            Log.w(TAG, "Preference with key \"" + getKey() +
-                    "\" does not have a default value set in xml, assuming " + mDefaultValue +
-                    " until further changes");
-        }
-        if (mDefaultValue < mMinValue || mDefaultValue > mMaxValue) {
-            throw new IllegalArgumentException("Default value is out of range!");
-        }
-        mUnitsLeft = getAttributeStringValue(attrs, PDXNS, "unitsLeft", "");
-        mUnitsRight = getAttributeStringValue(attrs, PDXNS, "unitsRight", "");
-        Integer idR = a.getResourceId(R.styleable.SeekBarPreference_unitsRight, 0);
-        if (idR > 0) {
-            mUnitsRight = context.getResources().getString(idR);
-        }
-        Integer idL = a.getResourceId(R.styleable.SeekBarPreference_unitsLeft, 0);
-        if (idL > 0) {
-            mUnitsLeft = context.getResources().getString(idL);
-        }
-        try {
-            String newInterval = attrs.getAttributeValue(PDXNS, "interval");
-            if(newInterval != null)
-                mInterval = Integer.parseInt(newInterval);
-        }
-        catch(Exception e) {
-            Log.e(TAG, "Invalid interval value", e);
-        }
-
-        mThumbDefaultValueColor = a.getColor(
-                R.styleable.SeekBarPreference_thumb_default_value_color, 0xff000000);
-        a.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 (mTitle != null)
-        //    mTitle.setEnabled(!disableDependent);
-        if (mSeekBar != null)
-            mSeekBar.setEnabled(!disableDependent);
-        if (mImagePlus != null)
-            mImagePlus.setEnabled(!disableDependent);
-        if (mImageMinus != null)
-            mImageMinus.setEnabled(!disableDependent);
-    }
-
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        mSeekBar = (SeekBar) holder.findViewById(R.id.seekbar);
-        // Remove possible previously attached change listener to prevent setting wrong values
-        mSeekBar.setOnSeekBarChangeListener(null);
-        mSeekBar.setMax(mMaxValue - mMinValue);
-        //mTitle = (TextView) holder.findViewById(android.R.id.title);
-        mUnitsLeftText = (TextView) holder.findViewById(R.id.seekBarPrefUnitsLeft);
-        mUnitsRightText = (TextView) holder.findViewById(R.id.seekBarPrefUnitsRight);
-        mImagePlus = (ImageView) holder.findViewById(R.id.imagePlus);
-        mImagePlus.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                mSeekBar.setProgress((mCurrentValue + mInterval) - mMinValue);
-            }
-        });
-        mImagePlus.setOnLongClickListener(new View.OnLongClickListener() {
-            @Override
-            public boolean onLongClick(View view) {
-                mSeekBar.setProgress((mCurrentValue + (mMaxValue-mMinValue)/10) - mMinValue);
-                return true;
-            }
-        });
-        mImageMinus = (ImageView) holder.findViewById(R.id.imageMinus);
-        mImageMinus.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                mSeekBar.setProgress((mCurrentValue - mInterval) - mMinValue);
-            }
-        });
-        mImageMinus.setOnLongClickListener(new View.OnLongClickListener() {
-            @Override
-            public boolean onLongClick(View view) {
-                mSeekBar.setProgress((mCurrentValue - (mMaxValue-mMinValue)/10) - mMinValue);
-                return true;
-            }
-        });
-        mProgressThumb = mSeekBar.getThumb();
-        mStatusText = (TextView) holder.findViewById(R.id.seekBarPrefValue);
-        mStatusText.setMinimumWidth(30);
-        mStatusText.setOnLongClickListener(new View.OnLongClickListener() {
-            @Override
-            public boolean onLongClick(View view) {
-                final String defaultValue = getContext().getString(R.string.seekbar_default_value_set,
-                        mDefaultValue);
-                if (mDefaultValue != -1) {
-                    if (mDefaultValue != mCurrentValue) {
-                        mCurrentValue = mDefaultValue;
-                        updateView();
-                        Toast.makeText(getContext(), defaultValue, Toast.LENGTH_LONG).show();
-                    } else {
-                        Toast.makeText(getContext(), R.string.seekbar_default_value_already_set,
-                                Toast.LENGTH_LONG).show();
-                    }
-                } else {
-                    Toast.makeText(getContext(), R.string.seekbar_no_default_value,
-                            Toast.LENGTH_LONG).show();
-                }
-                return true;
-            }
-        });
-
-        LayoutInflater mInflater = (LayoutInflater) getContext()
-                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        mPopupValue = (TextView) mInflater.inflate(R.layout.seek_bar_value_popup, null, false);
-        mPopupValue.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
-                @Override
-                public void onGlobalLayout() {
-                    int width = mPopupValue.getWidth();
-                    if (width != mPopupWidth) {
-                        mPopupWidth = mPopupValue.getWidth();
-                        startUpdateViewValue();
-                    }
-                }
-        });
-
-        initialised = true;
-        updateView();
-        mSeekBar.setOnSeekBarChangeListener(this);
-    }
-
-    /**
-     * Update a SeekBarPreferenceCham view with our current state
-     * @param view
-     */
-    protected void updateView() {
-        if (!initialised) {
-            return;
-        }
-        try {
-            mStatusText.setText(String.valueOf(mCurrentValue));
-            mSeekBar.setProgress(mCurrentValue - mMinValue);
-
-            mUnitsRightText.setText(mUnitsRight);
-            mUnitsLeftText.setText(mUnitsLeft);
-
-            updateCurrentValueText();
-        }
-        catch(Exception e) {
-            Log.e(TAG, "Error updating seek bar preference", e);
-        }
-    }
-
-    @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;
-        updateCurrentValueText();
-
-        if (fromUser) {
-            startUpdateViewValue();
-        } else {
-            stopUpdateViewValue();
-        }
-
-        persistInt(newValue);
-    }
-
-    private void updateCurrentValueText() {
-        if (mCurrentValue == mDefaultValue && mDefaultValue != -1) {
-            mStatusText.setText(R.string.seekbar_default_string);
-            mProgressThumb.setColorFilter(mThumbDefaultValueColor, PorterDuff.Mode.SRC_IN);
-            mUnitsLeftText.setVisibility(View.GONE);
-            mUnitsRightText.setVisibility(View.GONE);
-        } else {
-            mStatusText.setText(String.valueOf(mCurrentValue));
-            mProgressThumb.clearColorFilter();
-            mUnitsLeftText.setVisibility(View.VISIBLE);
-            mUnitsRightText.setVisibility(View.VISIBLE);
-        }
-    }
-
-    @Override
-    public void onStartTrackingTouch(SeekBar seekBar) {
-        startUpdateViewValue();
-        mTrackingTouch = true;
-    }
-
-    @Override
-    public void onStopTrackingTouch(SeekBar seekBar) {
-        notifyChanged();
-        stopUpdateViewValue();
-        mTrackingTouch = false;
-    }
-
-    @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) {
-        int defaultVal;
-        if (defaultValue instanceof Integer) {
-            defaultVal = (Integer) defaultValue;
-        } else {
-            defaultVal = mDefaultValue;
-        }
-        setValue(restoreValue ? getPersistedInt(defaultVal) : defaultVal);
-    }
-
-    public void setValue(int value) {
-        mCurrentValue = value;
-        updateView();
-    }
-
-    private Drawable getSeekBarThumb() {
-        return mProgressThumb;
-    }
-
-    private void startUpdateViewValue() {
-        if (!mTrackingTouch) return;
-        Rect thumbRect = getSeekBarThumb().getBounds();
-        int[] seekbarPos = new int[2];
-        int[] offsetPos = new int[2];
-        mSeekBar.getLocationInWindow(seekbarPos);
-        View mainContentView = /*mSeekBar.getRootView().findViewById(R.id.content_main);
-        if (mainContentView == null) {
-            mainContentView =*/ mSeekBar.getRootView().findViewById(android.R.id.content);
-        //}
-        if (mainContentView == null) {
-            Log.w(TAG, "Could not find main content view to calculate value view offset");
-            offsetPos[0] = 0;
-            offsetPos[1] = 0;
-        } else {
-            mainContentView.getLocationInWindow(offsetPos);
-        }
-        mPopupValue.setText(mUnitsLeft + mCurrentValue + mUnitsRight);
-        WindowManager.LayoutParams wp = new WindowManager.LayoutParams(
-                WindowManager.LayoutParams.WRAP_CONTENT,
-                WindowManager.LayoutParams.WRAP_CONTENT,
-                WindowManager.LayoutParams.TYPE_APPLICATION,
-                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
-                PixelFormat.TRANSLUCENT);
-        wp.gravity = Gravity.LEFT | Gravity.TOP;
-        wp.x = thumbRect.centerX() + seekbarPos[0] - offsetPos[0] - (mPopupWidth-thumbRect.width()) / 2 +
-                (int) getContext().getResources()
-                        .getDimension(R.dimen.seek_bar_preference_cham_value_x_offset);
-        wp.y = seekbarPos[1] - offsetPos[1] +
-                (int) getContext().getResources()
-                        .getDimension(R.dimen.seek_bar_preference_cham_value_y_offset);
-        mPopupValue.setLayoutParams(wp);
-        if (mPopupAdded) {
-            wp = (WindowManager.LayoutParams) mPopupValue.getLayoutParams();
-            ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
-                    .updateViewLayout(mPopupValue, wp);
-        } else {
-            ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
-                    .addView(mPopupValue, wp);
-            mPopupAdded = true;
-        }
-        mPopupValue.setVisibility(View.VISIBLE);
-    }
-
-    private void stopUpdateViewValue() {
-        if (!mPopupAdded) return;
-        ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).removeView(mPopupValue);
-        mPopupAdded = false;
-    }
-
-    public void setMax(int max) {
-        mMaxValue = max;
-        updateView();
-    }
-
-    public void setMin(int min) {
-        mMinValue = min;
-        updateView();
-    }
-
-    @Override
-    public void setDefaultValue(Object defaultValue) {
-        super.setDefaultValue(defaultValue);
-        if (defaultValue instanceof Integer) {
-            mDefaultValue = (Integer) defaultValue;
-            updateView();
-        }
-    }
-
-}
diff --git a/src/com/bliss/support/preferences/SelfRemovingDropDownPreference.java b/src/com/bliss/support/preferences/SelfRemovingDropDownPreference.java
deleted file mode 100644
index 99c31cb..0000000
--- a/src/com/bliss/support/preferences/SelfRemovingDropDownPreference.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2016 The CyanogenMod Project
- * Copyright (C) 2018 The LineageOS Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import androidx.preference.DropDownPreference;
-import androidx.preference.PreferenceDataStore;
-import androidx.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-
-/**
- * A Preference which can automatically remove itself from the hierarchy
- * based on constraints set in XML.
- */
-public abstract class SelfRemovingDropDownPreference extends DropDownPreference {
-
-    private final ConstraintsHelper mConstraints;
-
-    public SelfRemovingDropDownPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        mConstraints = new ConstraintsHelper(context, attrs, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    public SelfRemovingDropDownPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mConstraints = new ConstraintsHelper(context, attrs, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    public SelfRemovingDropDownPreference(Context context) {
-        super(context);
-        mConstraints = new ConstraintsHelper(context, null, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    @Override
-    public void onAttached() {
-        super.onAttached();
-        mConstraints.onAttached();
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        mConstraints.onBindViewHolder(holder);
-    }
-
-    public void setAvailable(boolean available) {
-        mConstraints.setAvailable(available);
-    }
-
-    public boolean isAvailable() {
-        return mConstraints.isAvailable();
-    }
-
-    protected abstract boolean isPersisted();
-    protected abstract void putString(String key, String value);
-    protected abstract String getString(String key, String defaultValue);
-
-    @Override
-    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
-        final String value;
-        if (!restorePersistedValue || !isPersisted()) {
-            if (defaultValue == null) {
-                return;
-            }
-            value = (String) defaultValue;
-            if (shouldPersist()) {
-                persistString(value);
-            }
-        } else {
-            // Note: the default is not used because to have got here
-            // isPersisted() must be true.
-            value = getString(getKey(), null /* not used */);
-        }
-        setValue(value);
-    }
-
-    private class DataStore extends PreferenceDataStore {
-        @Override
-        public void putString(String key, String value) {
-            SelfRemovingDropDownPreference.this.putString(key, value);
-        }
-
-        @Override
-        public String getString(String key, String defaultValue) {
-            return SelfRemovingDropDownPreference.this.getString(key, defaultValue);
-        }
-    }
-}
diff --git a/src/com/bliss/support/preferences/SelfRemovingListPreference.java b/src/com/bliss/support/preferences/SelfRemovingListPreference.java
deleted file mode 100644
index f119ac1..0000000
--- a/src/com/bliss/support/preferences/SelfRemovingListPreference.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2016 The CyanogenMod Project
- * Copyright (C) 2018 The LineageOS Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceDataStore;
-import androidx.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-
-/**
- * A Preference which can automatically remove itself from the hierarchy
- * based on constraints set in XML.
- */
-public abstract class SelfRemovingListPreference extends ListPreference {
-
-    private final ConstraintsHelper mConstraints;
-
-    public SelfRemovingListPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        mConstraints = new ConstraintsHelper(context, attrs, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    public SelfRemovingListPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mConstraints = new ConstraintsHelper(context, attrs, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    public SelfRemovingListPreference(Context context) {
-        super(context);
-        mConstraints = new ConstraintsHelper(context, null, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    @Override
-    public void onAttached() {
-        super.onAttached();
-        mConstraints.onAttached();
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        mConstraints.onBindViewHolder(holder);
-    }
-
-    public void setAvailable(boolean available) {
-        mConstraints.setAvailable(available);
-    }
-
-    public boolean isAvailable() {
-        return mConstraints.isAvailable();
-    }
-
-    protected abstract boolean isPersisted();
-    protected abstract void putString(String key, String value);
-    protected abstract String getString(String key, String defaultValue);
-
-    @Override
-    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
-        final String value;
-        if (!restorePersistedValue || !isPersisted()) {
-            if (defaultValue == null) {
-                return;
-            }
-            value = (String) defaultValue;
-            if (shouldPersist()) {
-                persistString(value);
-            }
-        } else {
-            // Note: the default is not used because to have got here
-            // isPersisted() must be true.
-            value = getString(getKey(), null /* not used */);
-        }
-        setValue(value);
-    }
-
-    private class DataStore extends PreferenceDataStore {
-        @Override
-        public void putString(String key, String value) {
-            SelfRemovingListPreference.this.putString(key, value);
-        }
-
-        @Override
-        public String getString(String key, String defaultValue) {
-            return SelfRemovingListPreference.this.getString(key, defaultValue);
-        }
-    }
-}
diff --git a/src/com/bliss/support/preferences/SelfRemovingPreference.java b/src/com/bliss/support/preferences/SelfRemovingPreference.java
deleted file mode 100644
index 295c6fb..0000000
--- a/src/com/bliss/support/preferences/SelfRemovingPreference.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2016 The CyanogenMod Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-import androidx.preference.R;
-import android.util.AttributeSet;
-
-/**
- * A Preference which can automatically remove itself from the hierarchy
- * based on constraints set in XML.
- */
-public class SelfRemovingPreference extends Preference {
-
-    private final ConstraintsHelper mConstraints;
-
-    public SelfRemovingPreference(Context context, AttributeSet attrs,
-                                  int defStyle, int defStyleRes) {
-        super(context, attrs, defStyle, defStyleRes);
-        mConstraints = new ConstraintsHelper(context, attrs, this);
-    }
-
-    public SelfRemovingPreference(Context context, AttributeSet attrs, int defStyle) {
-        this(context, attrs, defStyle, 0);
-    }
-
-    public SelfRemovingPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, ConstraintsHelper.getAttr(
-                context, R.attr.preferenceStyle, android.R.attr.preferenceStyle));
-    }
-
-    public SelfRemovingPreference(Context context) {
-        this(context, null);
-    }
-
-    @Override
-    public void onAttached() {
-        super.onAttached();
-        mConstraints.onAttached();
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        mConstraints.onBindViewHolder(holder);
-    }
-
-    public void setAvailable(boolean available) {
-        mConstraints.setAvailable(available);
-    }
-
-    public boolean isAvailable() {
-        return mConstraints.isAvailable();
-    }
-}
diff --git a/src/com/bliss/support/preferences/SelfRemovingSwitchPreference.java b/src/com/bliss/support/preferences/SelfRemovingSwitchPreference.java
deleted file mode 100644
index bf4d105..0000000
--- a/src/com/bliss/support/preferences/SelfRemovingSwitchPreference.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2016 The CyanogenMod Project
- * Copyright (C) 2018 The LineageOS Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import androidx.preference.SwitchPreference;
-import androidx.preference.PreferenceDataStore;
-import androidx.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-
-/**
- * A SwitchPreference which can automatically remove itself from the hierarchy
- * based on constraints set in XML.
- */
-public abstract class SelfRemovingSwitchPreference extends SwitchPreference {
-
-    private final ConstraintsHelper mConstraints;
-
-    public SelfRemovingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        mConstraints = new ConstraintsHelper(context, attrs, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    public SelfRemovingSwitchPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mConstraints = new ConstraintsHelper(context, attrs, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    public SelfRemovingSwitchPreference(Context context) {
-        super(context);
-        mConstraints = new ConstraintsHelper(context, null, this);
-        setPreferenceDataStore(new DataStore());
-    }
-
-    @Override
-    public void onAttached() {
-        super.onAttached();
-        mConstraints.onAttached();
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
-        super.onBindViewHolder(holder);
-        mConstraints.onBindViewHolder(holder);
-    }
-
-    public void setAvailable(boolean available) {
-        mConstraints.setAvailable(available);
-    }
-
-    public boolean isAvailable() {
-        return mConstraints.isAvailable();
-    }
-
-    protected abstract boolean isPersisted();
-    protected abstract void putBoolean(String key, boolean value);
-    protected abstract boolean getBoolean(String key, boolean defaultValue);
-
-    @Override
-    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
-        final boolean checked;
-        if (!restorePersistedValue || !isPersisted()) {
-            if (defaultValue == null) {
-                return;
-            }
-            checked = (boolean) defaultValue;
-            if (shouldPersist()) {
-                persistBoolean(checked);
-            }
-        } else {
-            // Note: the default is not used because to have got here
-            // isPersisted() must be true.
-            checked = getBoolean(getKey(), false /* not used */);
-        }
-        setChecked(checked);
-    }
-
-    private class DataStore extends PreferenceDataStore {
-        @Override
-        public void putBoolean(String key, boolean value) {
-            SelfRemovingSwitchPreference.this.putBoolean(key, value);
-        }
-
-        @Override
-        public boolean getBoolean(String key, boolean defaultValue) {
-            return SelfRemovingSwitchPreference.this.getBoolean(key, defaultValue);
-        }
-    }
-}
diff --git a/src/com/bliss/support/preferences/SystemCheckBoxPreference.java b/src/com/bliss/support/preferences/SystemCheckBoxPreference.java
new file mode 100644
index 0000000..564ad5e
--- /dev/null
+++ b/src/com/bliss/support/preferences/SystemCheckBoxPreference.java
@@ -0,0 +1,68 @@
+/*
+ * 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 com.bliss.support.preferences;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.util.AttributeSet;
+
+import androidx.preference.CheckBoxPreference;
+
+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/com/bliss/support/preferences/SystemSettingEditTextPreference.java b/src/com/bliss/support/preferences/SystemSettingEditTextPreference.java
deleted file mode 100644
index 91b0564..0000000
--- a/src/com/bliss/support/preferences/SystemSettingEditTextPreference.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-
-import androidx.preference.EditTextPreference;
-
-public class SystemSettingEditTextPreference extends EditTextPreference {
-    private boolean mAutoSummary = false;
-
-    public SystemSettingEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
-    }
-
-    public SystemSettingEditTextPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
-    }
-
-    public SystemSettingEditTextPreference(Context context) {
-        super(context);
-        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        // This is what default ListPreference implementation is doing without respecting
-        // real default value:
-        //setText(restoreValue ? getPersistedString(mText) : (String) defaultValue);
-        // Instead, we better do
-        setText(restoreValue ? getPersistedString((String) defaultValue) : (String) defaultValue);
-    }
-
-    @Override
-    public void setText(String text) {
-        super.setText(text);
-        if (mAutoSummary || TextUtils.isEmpty(getSummary())) {
-            setSummary(text, true);
-        }
-    }
-
-    @Override
-    public void setSummary(CharSequence summary) {
-        setSummary(summary, false);
-    }
-
-    private void setSummary(CharSequence summary, boolean autoSummary) {
-        mAutoSummary = autoSummary;
-        super.setSummary(summary);
-    }
-}
diff --git a/src/com/bliss/support/preferences/SystemSettingIntListPreference.java b/src/com/bliss/support/preferences/SystemSettingIntListPreference.java
deleted file mode 100644
index daa1d46..0000000
--- a/src/com/bliss/support/preferences/SystemSettingIntListPreference.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2017 AICP
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.bliss.support.preferences;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-public class SystemSettingIntListPreference extends SystemSettingListPreference {
-
-    public SystemSettingIntListPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public SystemSettingIntListPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public SystemSettingIntListPreference(Context context) {
-        super(context);
-    }
-
-    @Override
-    protected boolean persistString(String value) {
-        return persistInt(Integer.parseInt(value));
-    }
-
-    @Override
-    protected String getPersistedString(String defaultReturnValue) {
-        return String.valueOf(getPersistedInt(Integer.parseInt(defaultReturnValue)));
-    }
-
-}
diff --git a/src/com/bliss/support/preferences/SystemSettingListPreference.java b/src/com/bliss/support/preferences/SystemSettingListPreference.java
index 358bb99..c6926fe 100644
--- a/src/com/bliss/support/preferences/SystemSettingListPreference.java
+++ b/src/com/bliss/support/preferences/SystemSettingListPreference.java
@@ -17,7 +17,6 @@
 package com.bliss.support.preferences;
 
 import android.content.Context;
-import android.text.TextUtils;
 import android.util.AttributeSet;
 
 public class SystemSettingListPreference extends ListPreference {
diff --git a/src/com/bliss/support/preferences/SystemSettingSeekBarPreference.java b/src/com/bliss/support/preferences/SystemSettingSeekBarPreference.java
index 0ed3b42..ced081f 100644
--- a/src/com/bliss/support/preferences/SystemSettingSeekBarPreference.java
+++ b/src/com/bliss/support/preferences/SystemSettingSeekBarPreference.java
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.bliss.support.preferences;
 
 import android.content.Context;
@@ -34,4 +35,12 @@
         super(context, null);
         setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
     }
+
+    @Override
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        if (defaultValue == null) {
+            defaultValue = 0;
+        }
+        setValue(restoreValue ? getPersistedInt((Integer) defaultValue) : (Integer) defaultValue);
+    }
 }
diff --git a/src/com/bliss/support/preferences/SystemSettingSwitchPreference.java b/src/com/bliss/support/preferences/SystemSettingSwitchPreference.java
index 3a082f6..0d1dea9 100644
--- a/src/com/bliss/support/preferences/SystemSettingSwitchPreference.java
+++ b/src/com/bliss/support/preferences/SystemSettingSwitchPreference.java
@@ -18,14 +18,11 @@
 
 import android.content.Context;
 import android.provider.Settings;
-import androidx.preference.SwitchPreference;
-import android.os.UserHandle;
 import android.util.AttributeSet;
 
-import com.bliss.support.preferences.SelfRemovingSwitchPreference;
+import androidx.preference.SwitchPreference;
 
-public class SystemSettingSwitchPreference extends SelfRemovingSwitchPreference {
-
+public class SystemSettingSwitchPreference extends SwitchPreference {
     public SystemSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
     }
@@ -35,22 +32,34 @@
     }
 
     public SystemSettingSwitchPreference(Context context) {
-        super(context);
+        super(context, null);
     }
 
     @Override
-    protected boolean isPersisted() {
-        return Settings.System.getString(getContext().getContentResolver(), getKey()) != null;
+    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 void putBoolean(String key, boolean value) {
-        Settings.System.putIntForUser(getContext().getContentResolver(), key, value ? 1 : 0, UserHandle.USER_CURRENT);
+    protected boolean getPersistedBoolean(boolean defaultReturnValue) {
+        if (!shouldPersist()) {
+            return defaultReturnValue;
+        }
+        return Settings.System.getInt(getContext().getContentResolver(),
+                getKey(), defaultReturnValue ? 1 : 0) != 0;
     }
 
     @Override
-    protected boolean getBoolean(String key, boolean defaultValue) {
-        return Settings.System.getIntForUser(getContext().getContentResolver(),
-                key, defaultValue ? 1 : 0, UserHandle.USER_CURRENT) != 0;
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        setChecked(Settings.System.getString(getContext().getContentResolver(), getKey()) != null ? getPersistedBoolean(isChecked())
+                : (Boolean) defaultValue);
     }
 }
diff --git a/src/com/bliss/support/preferences/SystemSettingsStore.java b/src/com/bliss/support/preferences/SystemSettingsStore.java
index 47cc97e..cae4dbf 100644
--- a/src/com/bliss/support/preferences/SystemSettingsStore.java
+++ b/src/com/bliss/support/preferences/SystemSettingsStore.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016-2018 crDroid Android Project
+ * Copyright (C) 2017 AICP
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,11 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.bliss.support.preferences;
 
 import android.content.ContentResolver;
 import android.preference.PreferenceDataStore;
-import android.os.UserHandle;
 import android.provider.Settings;
 
 public class SystemSettingsStore extends androidx.preference.PreferenceDataStore
@@ -30,19 +30,19 @@
     }
 
     public boolean getBoolean(String key, boolean defValue) {
-        return Settings.System.getIntForUser(mContentResolver, key, defValue ? 1 : 0, UserHandle.USER_CURRENT) != 0;
+        return getInt(key, defValue ? 1 : 0) != 0;
     }
 
     public float getFloat(String key, float defValue) {
-        return Settings.System.getFloatForUser(mContentResolver, key, defValue, UserHandle.USER_CURRENT);
+        return Settings.System.getFloat(mContentResolver, key, defValue);
     }
 
     public int getInt(String key, int defValue) {
-        return Settings.System.getIntForUser(mContentResolver, key, defValue, UserHandle.USER_CURRENT);
+        return Settings.System.getInt(mContentResolver, key, defValue);
     }
 
     public long getLong(String key, long defValue) {
-        return Settings.System.getLongForUser(mContentResolver, key, defValue, UserHandle.USER_CURRENT);
+        return Settings.System.getLong(mContentResolver, key, defValue);
     }
 
     public String getString(String key, String defValue) {
@@ -55,18 +55,19 @@
     }
 
     public void putFloat(String key, float value) {
-        Settings.System.putFloatForUser(mContentResolver, key, value, UserHandle.USER_CURRENT);
+        Settings.System.putFloat(mContentResolver, key, value);
     }
 
     public void putInt(String key, int value) {
-        Settings.System.putIntForUser(mContentResolver, key, value, UserHandle.USER_CURRENT);
+        Settings.System.putInt(mContentResolver, key, value);
     }
 
     public void putLong(String key, long value) {
-        Settings.System.putLongForUser(mContentResolver, key, value, UserHandle.USER_CURRENT);
+        Settings.System.putLong(mContentResolver, key, value);
     }
 
     public void putString(String key, String value) {
         Settings.System.putString(mContentResolver, key, value);
     }
+
 }
