From 07f09f7af3666bbad3602b1fb497623a04425f5f Mon Sep 17 00:00:00 2001
From: maxwen <max.weninger@gmail.com>
Date: Thu, 21 Jan 2016 22:59:43 +0100
Subject: [PATCH] OmniSwitch: bugfix update 01/2016

-use condensed font for app labels
-fix button position config since I broke this without
even noticing it :)
-correct ListView update when thumb size has changed
-some memory tweaks (no need to store thumbs in LRUCache)
-add drag handle width config
-cleanup unneeded images and code
-list view separator
-add drag handle touch feedback
-disable bar overdraw cause it breaks correct popup menu position
-use condensed font for popup menu
-correct reset of overlay after quick switcher was used

Change-Id: Id55d6c83e70e254802cd864e33b8362a2a0128f2
---

diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b6e6f17..7e478b3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -28,7 +28,7 @@
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
         android:persistent="true"
-        android:theme="@android:style/Theme.Material.Light" >
+        android:theme="@style/AppTheme" >
         <service
             android:name="org.omnirom.omniswitch.SwitchService"
             android:configChanges="orientation|screenSize" />
diff --git a/res/drawable-hdpi/ic_default.png b/res/drawable-hdpi/ic_default.png
deleted file mode 100644
index 288b665..0000000
--- a/res/drawable-hdpi/ic_default.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_default.png b/res/drawable-mdpi/ic_default.png
deleted file mode 100644
index 6ae570b..0000000
--- a/res/drawable-mdpi/ic_default.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_default.png b/res/drawable-xhdpi/ic_default.png
deleted file mode 100644
index d4fb7cd..0000000
--- a/res/drawable-xhdpi/ic_default.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_default.png b/res/drawable-xxhdpi/ic_default.png
deleted file mode 100644
index 85a6081..0000000
--- a/res/drawable-xxhdpi/ic_default.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/list_divider_material.xml b/res/drawable/list_divider_material.xml
new file mode 100644
index 0000000..66bfa3b
--- /dev/null
+++ b/res/drawable/list_divider_material.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:tint="?android:attr/colorForeground">
+    <solid android:color="#1f000000" />
+    <size
+        android:height="1dp"
+        android:width="1dp" />
+</shape>
diff --git a/res/layout/checkbox_list.xml b/res/layout/checkbox_list.xml
index ea5715d..c4ce1db 100644
--- a/res/layout/checkbox_list.xml
+++ b/res/layout/checkbox_list.xml
@@ -23,5 +23,7 @@
     <org.omnirom.omniswitch.dslv.DragSortListView
         android:id="@+id/item_list"
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent"
+        android:dividerHeight="1dp"
+        android:divider="@drawable/list_divider_material" />
 </RelativeLayout>
diff --git a/res/layout/favorite_app_item.xml b/res/layout/favorite_app_item.xml
index 2685b9d..3c2a9e3 100644
--- a/res/layout/favorite_app_item.xml
+++ b/res/layout/favorite_app_item.xml
@@ -46,5 +46,6 @@
         android:focusable="false"
         android:singleLine="true"
         android:textAlignment="viewStart"
-        android:textAppearance="?android:attr/textAppearanceListItem" />
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:fontFamily="sans-serif-condensed" />
 </GridLayout>
diff --git a/res/layout/favorite_dialog.xml b/res/layout/favorite_dialog.xml
index 572144f..f3bb87e 100644
--- a/res/layout/favorite_dialog.xml
+++ b/res/layout/favorite_dialog.xml
@@ -23,5 +23,7 @@
     <org.omnirom.omniswitch.dslv.DragSortListView
         android:id="@+id/favorite_apps"
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent"
+        android:dividerHeight="1dp"
+        android:divider="@drawable/list_divider_material" />
 </RelativeLayout>
diff --git a/res/layout/installed_app_item.xml b/res/layout/installed_app_item.xml
index 03c6245..1ce3748 100644
--- a/res/layout/installed_app_item.xml
+++ b/res/layout/installed_app_item.xml
@@ -38,7 +38,8 @@
         android:focusable="false"
         android:singleLine="true"
         android:textAlignment="viewStart"
-        android:textAppearance="?android:attr/textAppearanceListItem" />
+        android:textAppearance="?android:attr/textAppearanceListItem"
+        android:fontFamily="sans-serif-condensed" />
     <CheckBox
         android:id="@+id/app_check"
         android:layout_gravity="center_vertical"
diff --git a/res/layout/installed_apps_dialog.xml b/res/layout/installed_apps_dialog.xml
index a0add10..66175cf 100644
--- a/res/layout/installed_apps_dialog.xml
+++ b/res/layout/installed_apps_dialog.xml
@@ -24,5 +24,6 @@
         android:id="@+id/installed_apps"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:clipToPadding="false" />
+        android:dividerHeight="1dp"
+        android:divider="@drawable/list_divider_material" />
 </RelativeLayout>
diff --git a/res/layout/package_item.xml b/res/layout/package_item.xml
index 316da16..8a0bf43 100644
--- a/res/layout/package_item.xml
+++ b/res/layout/package_item.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright (C) 2013 The OmniROM Project
+  Copyright (C) 2013-2016 The OmniROM Project
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -16,7 +16,6 @@
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -->
 <org.omnirom.omniswitch.ui.PackageTextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/favorite_item"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@android:color/transparent"
@@ -24,8 +23,4 @@
     android:ellipsize="end"
     android:focusable="false"
     android:gravity="center_horizontal"
-    android:lines="2"
-    android:scaleType="centerInside"
-    android:textAppearance="?android:attr/textAppearanceSmall"
-    android:textColor="@android:color/white"
-    android:textStyle="bold" />
+    android:scaleType="centerInside" />
diff --git a/res/layout/recents_list_horizontal.xml b/res/layout/recents_list_horizontal.xml
index 86e739b..fbb6387 100644
--- a/res/layout/recents_list_horizontal.xml
+++ b/res/layout/recents_list_horizontal.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright (C) 2013 The OmniROM Project
+  Copyright (C) 2013-2016 The OmniROM Project
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -54,7 +54,7 @@
 			android:layout_width="match_parent"
 			android:layout_height="wrap_content"
 			android:orientation="vertical"
-			android:paddingBottom="8dip" >
+			android:paddingBottom="4dip" >
 
 			<org.omnirom.omniswitch.ui.HorizontalListView
 				android:id="@+id/recent_list_horizontal"
@@ -104,20 +104,6 @@
 		android:elevation="@dimen/button_elevation"
 		android:orientation="vertical"
 		android:visibility="gone" >
-
-		<HorizontalScrollView
-			android:id="@+id/button_list_bottom"
-			android:layout_width="wrap_content"
-			android:layout_height="wrap_content"
-			android:layout_gravity="center_horizontal" >
-
-			<LinearLayout
-				android:id="@+id/button_list_items_bottom"
-				android:layout_width="wrap_content"
-				android:layout_height="wrap_content"
-				android:orientation="horizontal" >
-			</LinearLayout>
-		</HorizontalScrollView>
 	</LinearLayout>
 
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/res/layout/recents_list_vertical.xml b/res/layout/recents_list_vertical.xml
index e2bb9ac..10146fe 100644
--- a/res/layout/recents_list_vertical.xml
+++ b/res/layout/recents_list_vertical.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright (C) 2013 The OmniROM Project
+  Copyright (C) 2013-2016 The OmniROM Project
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -91,20 +91,6 @@
 		android:layout_height="match_parent"
 		android:elevation="@dimen/button_elevation"
 		android:visibility="gone" >
-
-		<ScrollView
-			android:id="@+id/button_list_bottom"
-			android:layout_width="wrap_content"
-			android:layout_height="wrap_content"
-			android:layout_gravity="bottom"
-		    android:layout_marginStart="3dp" >
-			<LinearLayout
-				android:id="@+id/button_list_items_bottom"
-				android:layout_width="wrap_content"
-				android:layout_height="wrap_content"
-				android:orientation="vertical" >
-			</LinearLayout>
-		</ScrollView>
 	</LinearLayout>
 
 </LinearLayout>
diff --git a/res/layout/settings_gesture_view.xml b/res/layout/settings_gesture_view.xml
index 2069f2d..f6f97c9 100644
--- a/res/layout/settings_gesture_view.xml
+++ b/res/layout/settings_gesture_view.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright (C) 2013 The OmniROM Project
+  Copyright (C) 2013-2016 The OmniROM Project
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -56,11 +56,29 @@
                 android:layout_height="wrap_content"
                 android:text="@string/adjust_handle_help"
                 android:paddingBottom="12dp"/>
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/adjust_handle_width"/>
+            <SeekBar
+                android:id="@+id/drag_handle_width"
+                android:layout_width="fill_parent"
+                android:layout_height="32dp"
+                android:max="100"
+                android:progress="50" />
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/adjust_handle_position"
+                android:paddingBottom="8dp"/>
             <Button
                 android:id="@+id/location_button"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/location_left"/>
+            <Space
+                android:layout_width="match_parent"
+                android:layout_height="12dp"/>
             <Button
                 android:id="@+id/reset_button"
                 android:layout_width="match_parent"
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index d0ea62a..fce2f12 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -18,8 +18,8 @@
 <resources>
 
 	<dimen name="drag_handle_height">25dp</dimen>
-	<dimen name="color_button_width">16dp</dimen>
-	<dimen name="color_button_height">16dp</dimen>
+	<dimen name="color_button_width">18dp</dimen>
+	<dimen name="color_button_height">18dp</dimen>
 	<dimen name="drag_grip_ridge_size">6dp</dimen>
 	<dimen name="drag_grip_ridge_gap">4dp</dimen>
 	<dimen name="thumbnail_width">140dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b8c590d..efa4b6b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -28,11 +28,7 @@
 	<string name="animate_title">Animate</string>
 	<string name="animate_title_summary">Animate show and hide of overlay view</string>
 	<string name="adjust_handle_title">Position and size</string>
-	<string name="adjust_handle_help">Move and resize drag handle.\nPress button to switch between left and right side of the display.</string>
-	<string name="sc_drag_handle_title">Drag handle</string>
-	<string name="sc_drag_handle_body">\nSwipe horizontally to open\n\nPress button or outside to close\n\nLong press to open quick switcher</string>
-	<string name="sc_favorite_title">Favorite apps</string>
-	<string name="sc_favorite_body">\nOpen favorite apps view.</string>
+	<string name="adjust_handle_help">Move and resize drag handle</string>
 	<string name="icon_size_normal">Normal</string>
 	<string name="icon_size_small">Small</string>
 	<string name="icon_size_large">Large</string>
@@ -103,9 +99,6 @@
 	<string name="speed_switch_button_summary">Configure action buttons in quick switcher view</string>
 	<string name="speed_switch_items_summary">Maximum number of level items</string>
 	<string name="speed_switch_item">Level item limit</string>
-	<string name="sc_quick_switcher_title">Quick switcher</string>
-	<string name="sc_quick_switcher_body">\nMoving up and down to switch between levels.\n\nMoving left and right to switch between level items.</string>
-	<string name="sc_quick_switcher_empty_body">\nNo recent apps or favorites.\n\nMoving up and down to switch between levels.\n\nMoving left and right to switch between level items.</string>
 	<string name="immersive_mode">Immersive mode</string>
 	<string name="immersive_mode_help">Toggle immersive mode</string>
 	<string name="package_add_favorite_title">Add to favorites</string>
@@ -146,4 +139,6 @@
 	<string name="menu">Menu</string>
 	<string name="menu_help">Menu</string>
 	<string name="enable_title">Enable</string>
+	<string name="adjust_handle_width">Width</string>
+	<string name="adjust_handle_position">Position</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 84e05ff..326f47b 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -16,12 +16,21 @@
  -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
     <style name="PopupMenuLight" parent="@android:style/Theme.Material.Light">
+        <item name="android:textAppearanceLargePopupMenu">@style/TextAppearancePopupMenuCondensed</item>
+        <item name="android:textAppearanceSmallPopupMenu">@style/TextAppearancePopupMenuCondensed</item>
     </style>
     <style name="PopupMenuDark" parent="@android:style/Theme.Material">
+        <item name="android:textAppearanceLargePopupMenu">@style/TextAppearancePopupMenuCondensed</item>
+        <item name="android:textAppearanceSmallPopupMenu">@style/TextAppearancePopupMenuCondensed</item>
     </style>
     <style name="SettingsTheme" parent="@android:style/Theme.Material.Settings">
         <item name="android:colorAccent">@color/colorAccent</item>
         <item name="android:colorPrimary">@color/colorPrimary</item>
         <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
     </style>
+    <style name="AppTheme" parent="@android:style/Theme.Material.DayNight">
+    </style>
+    <style name="TextAppearancePopupMenuCondensed" parent="@android:style/TextAppearance.Material.Menu" >
+        <item name="android:fontFamily">sans-serif-condensed</item>
+    </style>
 </resources>
diff --git a/src/org/omnirom/omniswitch/PackageManager.java b/src/org/omnirom/omniswitch/PackageManager.java
index d0ddfca..bb0e4c1 100644
--- a/src/org/omnirom/omniswitch/PackageManager.java
+++ b/src/org/omnirom/omniswitch/PackageManager.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2014 The OmniROM Project
+ *  Copyright (C) 2014-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -79,6 +79,11 @@
             return result != 0 ? result : packageName
                     .compareTo(another.packageName);
         }
+
+        @Override
+        public String toString() {
+            return getTitle().toString();
+        }
     }
 
     public static PackageManager getInstance(Context context) {
diff --git a/src/org/omnirom/omniswitch/RecentTasksLoader.java b/src/org/omnirom/omniswitch/RecentTasksLoader.java
index 015cd9e..73edd42 100644
--- a/src/org/omnirom/omniswitch/RecentTasksLoader.java
+++ b/src/org/omnirom/omniswitch/RecentTasksLoader.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 The OmniROM Project
+ *  Copyright (C) 2013-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,6 +46,7 @@
 public class RecentTasksLoader {
     private static final String TAG = "RecentTasksLoader";
     private static final boolean DEBUG = false;
+    private static final int MAX_TASKS = 50;
 
     private Context mContext;
     private AsyncTask<Void, List<TaskDescription>, Void> mTaskLoader;
@@ -257,7 +258,7 @@
                                 pm, 0);
                 boolean isFirstValidTask = true;
 
-                for (int i = 0; i < numTasks; ++i) {
+                for (int i = 0; i < numTasks && i < MAX_TASKS; ++i) {
                     if (isCancelled()) {
                         break;
                     }
diff --git a/src/org/omnirom/omniswitch/SettingsActivity.java b/src/org/omnirom/omniswitch/SettingsActivity.java
index 0d7afff..d0469df 100644
--- a/src/org/omnirom/omniswitch/SettingsActivity.java
+++ b/src/org/omnirom/omniswitch/SettingsActivity.java
@@ -89,6 +89,7 @@
     public static final String PREF_APP_FILTER_TIME = "app_filter_time";
     public static final String PREF_THUMB_SIZE = "thumb_size";
     public static final String PREF_APP_FILTER_RUNNING = "app_filter_running";
+    public static final String PREF_HANDLE_WIDTH = "handle_width";
 
     public static int BUTTON_KILL_ALL = 0;
     public static int BUTTON_KILL_OTHER = 1;
diff --git a/src/org/omnirom/omniswitch/SwitchConfiguration.java b/src/org/omnirom/omniswitch/SwitchConfiguration.java
index c1b4a00..7b3c8c5 100644
--- a/src/org/omnirom/omniswitch/SwitchConfiguration.java
+++ b/src/org/omnirom/omniswitch/SwitchConfiguration.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 The OmniROM Project
+ *  Copyright (C) 2013-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@
     public int mLocation = 0; // 0 = right 1 = left
     public boolean mAnimate = true;
     public int mIconSize = 60; // in dip
-    public int mIconSizeSettings = 48; // in dip
+    public int mIconSizeSettings = 52; // in dip
     public int mQSActionSize = 60; // in dp
     public int mActionSizePx = 48; // in px
     public int mOverlayIconSizeDp = 30;
@@ -47,6 +47,7 @@
     public int mStartYRelative;
     public int mDragHandleHeight;
     public int mDragHandleWidth;
+    public int mDefaultDragHandleWidth;
     public boolean mShowLabels = true;
     public int mDragHandleColor;
     public int mDefaultColor;
@@ -166,10 +167,10 @@
         mIconSize = Integer.valueOf(iconSize);
         if (mIconSize == 60) {
             mIconSizeDesc = IconSize.NORMAL;
-            mIconSize = 55;
+            mIconSize = 52;
         } else if (mIconSize == 80) {
             mIconSizeDesc = IconSize.LARGE;
-            mIconSize = 75;
+            mIconSize = 70;
         } else {
             mIconSizeDesc = IconSize.SMALL;
         }
@@ -186,7 +187,7 @@
 
         mMaxWidth = Math.round((mIconSize + mIconBorder) * mDensity);
         mMaxHeight = Math.round((mIconSize + mIconBorder) * mDensity);
-        mLabelFontSize = 15f;
+        mLabelFontSize = 14f;
         // add a small gap
         mLabelFontSizePx = Math.round((mLabelFontSize + mIconBorder) * mDensity);
 
@@ -199,7 +200,9 @@
         mDimBehind = prefs.getBoolean(SettingsActivity.PREF_DIM_BEHIND, true);
         String gravity = prefs.getString(SettingsActivity.PREF_GRAVITY, "0");
         mGravity = Integer.valueOf(gravity);
-        mDragHandleWidth = Math.round(20 * mDensity);
+        mDefaultDragHandleWidth = Math.round(20 * mDensity);
+        mDragHandleWidth = prefs.getInt(
+                    SettingsActivity.PREF_HANDLE_WIDTH, mDefaultDragHandleWidth);
         mButtons = Utils.buttonStringToMap(prefs.getString(SettingsActivity.PREF_BUTTONS_NEW,
                 SettingsActivity.PREF_BUTTON_DEFAULT_NEW), SettingsActivity.PREF_BUTTON_DEFAULT_NEW);
         mLevelBackgroundColor = prefs.getBoolean(SettingsActivity.PREF_SPEED_SWITCHER_COLOR, true);
diff --git a/src/org/omnirom/omniswitch/ui/AbstractSwitchLayout.java b/src/org/omnirom/omniswitch/ui/AbstractSwitchLayout.java
index c33567e..ee65e44 100644
--- a/src/org/omnirom/omniswitch/ui/AbstractSwitchLayout.java
+++ b/src/org/omnirom/omniswitch/ui/AbstractSwitchLayout.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2015 The OmniROM Project
+ *  Copyright (C) 2015-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,6 +40,7 @@
 import android.content.SharedPreferences;
 import android.graphics.Color;
 import android.graphics.Point;
+import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.preference.PreferenceManager;
@@ -136,6 +137,8 @@
     protected TextView mNoRecentApps;
     protected LinearLayout mButtonListItems;
     protected LinearLayout mButtonListContainer;
+    protected LinearLayout mButtonListContainerTop;
+    protected LinearLayout mButtonListContainerBottom;
     protected LinearLayout mRecents;
     protected ImageView mOpenFavorite;
     protected AnimatorSet mShowFavAnim;
@@ -675,6 +678,8 @@
         item.setGravity(Gravity.CENTER);
         item.setLayoutParams(getListItemParams());
         item.setMaxLines(1);
+        Typeface font = Typeface.create("sans-serif-condensed", Typeface.NORMAL);
+        item.setTypeface(font);
         item.setBackgroundResource(mConfiguration.mBgStyle == SwitchConfiguration.BgStyle.SOLID_LIGHT ? R.drawable.ripple_dark
                 : R.drawable.ripple_light);
         return item;
@@ -1304,9 +1309,37 @@
         if (key.equals(SettingsActivity.PREF_BG_STYLE) ||
                 key.equals(SettingsActivity.PREF_SHOW_LABELS) ||
                 key.equals(SettingsActivity.PREF_ICON_SIZE) ||
-                key.equals(SettingsActivity.PREF_ICONPACK)) {
+                key.equals(SettingsActivity.PREF_ICONPACK) ||
+                key.equals(SettingsActivity.PREF_THUMB_SIZE)) {
             return true;
         }
         return false;
     }
+
+    protected abstract View getButtonList();
+
+    protected void selectButtonContainer() {
+        if (mConfiguration.mButtonPos == 0) {
+            mButtonListContainerTop.removeAllViews();
+            mButtonListContainerBottom.removeAllViews();
+            mButtonListContainerBottom.setVisibility(View.GONE);
+            mButtonListContainerTop.addView(getButtonList());
+            mButtonListContainerTop.setVisibility(View.VISIBLE);
+            mButtonListContainer = mButtonListContainerTop;
+       } else {
+            mButtonListContainerTop.removeAllViews();
+            mButtonListContainerBottom.removeAllViews();
+            mButtonListContainerTop.setVisibility(View.GONE);
+            mButtonListContainerBottom.addView(getButtonList());
+            mButtonListContainerBottom.setVisibility(View.VISIBLE);
+            mButtonListContainer = mButtonListContainerBottom;
+        }
+    }
+
+    /* if quick switcher was triggerd update() will be called
+    but the values never reset since hideDone() is not called */
+    public void resetRecentsState() {
+        mTaskLoadDone = false;
+        mUpdateNoRecentsTasksDone = false;
+    }
 }
diff --git a/src/org/omnirom/omniswitch/ui/BitmapCache.java b/src/org/omnirom/omniswitch/ui/BitmapCache.java
index 55c1f6f..f5df7b0 100644
--- a/src/org/omnirom/omniswitch/ui/BitmapCache.java
+++ b/src/org/omnirom/omniswitch/ui/BitmapCache.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2014 The OmniROM Project
+ *  Copyright (C) 2014-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,12 +26,16 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.util.LruCache;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Map;
 
 public class BitmapCache {
     private static BitmapCache sInstance;
     private Context mContext;
     private LruCache<String, Drawable> mMemoryCache;
-    private LruCache<String, Drawable> mThumbnailCache;
+    private HashMap<String, Drawable> mThumbnailMap;
 
     public static BitmapCache getInstance(Context context) {
         if (sInstance == null){
@@ -45,8 +49,8 @@
         final long maxMemory = Runtime.getRuntime().maxMemory();
 
         // Use 1/3rd of the available memory for this memory cache.
-        final long cacheSize = maxMemory / 3;
-        //Log.d("CACHE", "cacheSize = " + cacheSize);
+        long cacheSize = maxMemory / 4;
+        //Log.d("BitmapCache", "maxMemory = " + maxMemory +" cacheSize = " + cacheSize);
 
         mMemoryCache = new LruCache<String, Drawable>((int)cacheSize) {
             @Override
@@ -60,19 +64,7 @@
                 }
             }
         };
-
-        mThumbnailCache = new LruCache<String, Drawable>((int)cacheSize) {
-            @Override
-            protected int sizeOf(String key, Drawable bitmap) {
-                // The cache size will be measured in kilobytes rather than
-                // number of items.
-                if (bitmap instanceof BitmapDrawable){
-                    return ((BitmapDrawable)bitmap).getBitmap().getAllocationByteCount();
-                } else {
-                    return 1;
-                }
-            }
-        };
+        mThumbnailMap = new HashMap<String, Drawable>(25);
     }
 
     private void setContext(Context context) {
@@ -84,7 +76,7 @@
     }
 
     public void clearThumbs() {
-        mThumbnailCache.evictAll();
+        mThumbnailMap.clear();
     }
 
     private String bitmapHash(String intent, int iconSize) {
@@ -103,43 +95,26 @@
         String key = bitmapHash(packageItem.getIntent(), iconSize);
         Drawable d = getBitmapFromMemCache(key);
         if (d == null){
-            Drawable icon = PackageManager.getInstance(mContext).getPackageIcon(packageItem);
-            if (getIconPackHelper().isIconPackLoaded() && (getIconPackHelper()
-                    .getResourceIdForActivityIcon(packageItem.getActivityInfo()) == 0)) {
-                icon = BitmapUtils.compose(resources,
-                        icon, mContext, getIconPackHelper().getIconBackFor(packageItem.getTitle()),
-                        getIconPackHelper().getIconMask(), getIconPackHelper().getIconUpon(),
-                        getIconPackHelper().getIconScale(), iconSize, configuration.mDensity);
-            }
-            d = BitmapUtils.resize(resources,
-                    icon,
-                    iconSize,
-                    configuration.mIconBorder,
-                    configuration.mDensity);
+            d = getResizedUncached(resources, packageItem, configuration, iconSize);
             addBitmapToMemoryCache(key, d);
         }
         return d;
     }
 
-    public Drawable getPackageIcon(Resources resources, PackageManager.PackageItem packageItem, SwitchConfiguration configuration, int iconSize) {
-        String key = bitmapHash(packageItem.getIntent(), iconSize);
-        Drawable d = getBitmapFromMemCache(key);
-        if (d == null){
-            Drawable icon = PackageManager.getInstance(mContext).getPackageIcon(packageItem);
-            if (getIconPackHelper().isIconPackLoaded() && (getIconPackHelper()
-                    .getResourceIdForActivityIcon(packageItem.getActivityInfo()) == 0)) {
-                icon = BitmapUtils.compose(resources,
-                        icon, mContext, getIconPackHelper().getIconBackFor(packageItem.getTitle()),
-                        getIconPackHelper().getIconMask(), getIconPackHelper().getIconUpon(),
-                        getIconPackHelper().getIconScale(), iconSize, configuration.mDensity);
-            }
-            d = BitmapUtils.resize(resources,
-                    icon,
-                    iconSize,
-                    configuration.mIconBorder,
-                    configuration.mDensity);
-            addBitmapToMemoryCache(key, d);
+    public Drawable getResizedUncached(Resources resources, PackageManager.PackageItem packageItem, SwitchConfiguration configuration, int iconSize) {
+        Drawable icon = PackageManager.getInstance(mContext).getPackageIcon(packageItem);
+        if (getIconPackHelper().isIconPackLoaded() && (getIconPackHelper()
+                .getResourceIdForActivityIcon(packageItem.getActivityInfo()) == 0)) {
+            icon = BitmapUtils.compose(resources,
+                    icon, mContext, getIconPackHelper().getIconBackFor(packageItem.getTitle()),
+                    getIconPackHelper().getIconMask(), getIconPackHelper().getIconUpon(),
+                    getIconPackHelper().getIconScale(), iconSize, configuration.mDensity);
         }
+        Drawable d = BitmapUtils.resize(resources,
+                icon,
+                iconSize,
+                configuration.mIconBorder,
+                configuration.mDensity);
         return d;
     }
 
@@ -176,11 +151,11 @@
 
     public Drawable getSharedThumbnail(TaskDescription ad) {
         String key = String.valueOf(ad.getPersistentTaskId());
-        return mThumbnailCache.get(key);
+        return mThumbnailMap.get(key);
     }
 
     public void putSharedThumbnail(Resources resources, TaskDescription ad, Drawable thumb) {
         String key = String.valueOf(ad.getPersistentTaskId());
-        mThumbnailCache.put(key, thumb);
+        mThumbnailMap.put(key, thumb);
     }
 }
diff --git a/src/org/omnirom/omniswitch/ui/BitmapUtils.java b/src/org/omnirom/omniswitch/ui/BitmapUtils.java
index ee1a74b..fb4f95f 100644
--- a/src/org/omnirom/omniswitch/ui/BitmapUtils.java
+++ b/src/org/omnirom/omniswitch/ui/BitmapUtils.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 The OmniROM Project
+ *  Copyright (C) 2013-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,23 +39,6 @@
 import android.text.TextUtils;
 
 public class BitmapUtils {
-    public static Drawable rotate(Resources resources, Drawable image, int deg) {
-        if (!(image instanceof BitmapDrawable)) {
-            return image;
-        }
-        final Canvas canvas = new Canvas();
-        canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.ANTI_ALIAS_FLAG,
-                Paint.FILTER_BITMAP_FLAG));
-
-        Bitmap b = ((BitmapDrawable) image).getBitmap();
-        Bitmap bmResult = Bitmap.createBitmap(b.getWidth(), b.getHeight(),
-                Bitmap.Config.ARGB_8888);
-        canvas.setBitmap(bmResult);
-        canvas.rotate(deg, b.getWidth() / 2, b.getHeight() / 2);
-        canvas.drawBitmap(b, 0, 0, null);
-        return new BitmapDrawable(resources, bmResult);
-    }
-
     public static Drawable resize(Resources resources, Drawable image,
             int iconSize, int borderSize, float density) {
         int size = Math.round(iconSize * density);
@@ -171,7 +154,7 @@
     }
 
     public static Drawable getDefaultActivityIcon(Context context) {
-        return context.getResources().getDrawable(R.drawable.ic_default);
+        return context.getResources().getDrawable(android.R.drawable.sym_def_app_icon);
     }
 
     public static Drawable compose(Resources resources, Drawable icon, Context context, Drawable iconBack,
@@ -248,7 +231,7 @@
         final Drawable iconResized = resize(resources, icon,  iconSize, density);
 
         final TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
-        Typeface font = Typeface.create("sans-serif", Typeface.NORMAL);
+        Typeface font = Typeface.create("sans-serif-condensed", Typeface.NORMAL);
         textPaint.setTypeface(font);
         textPaint.setColor(Color.WHITE);
         textPaint.setShadowLayer(5.0f, 0.0f, 0.0f, Color.BLACK);
diff --git a/src/org/omnirom/omniswitch/ui/CheckboxListDialog.java b/src/org/omnirom/omniswitch/ui/CheckboxListDialog.java
index 9e1921d..cef8104 100644
--- a/src/org/omnirom/omniswitch/ui/CheckboxListDialog.java
+++ b/src/org/omnirom/omniswitch/ui/CheckboxListDialog.java
@@ -65,8 +65,8 @@
     };
     private class CheckboxListAdapter extends ArrayAdapter<String> {
 
-        public CheckboxListAdapter(Context context, int resource, List<String> values) {
-            super(context, R.layout.checkbox_item, resource, values);
+        public CheckboxListAdapter(Context context, List<String> values) {
+            super(context, R.layout.checkbox_item, values);
         }
 
         @Override
@@ -199,8 +199,7 @@
 
         mCheckboxListView = (DragSortListView) view.findViewById(R.id.item_list);
 
-        mListAdapter = new CheckboxListAdapter(getContext(),
-                android.R.layout.simple_list_item_multiple_choice, Arrays.asList(mListItems));
+        mListAdapter = new CheckboxListAdapter(getContext(), Arrays.asList(mListItems));
         mCheckboxListView.setAdapter(mListAdapter);
         mCheckboxListView.setOnItemClickListener(new OnItemClickListener() {
             @Override
diff --git a/src/org/omnirom/omniswitch/ui/ColorDrawableWithDimensions.java b/src/org/omnirom/omniswitch/ui/ColorDrawableWithDimensions.java
deleted file mode 100644
index f864e16..0000000
--- a/src/org/omnirom/omniswitch/ui/ColorDrawableWithDimensions.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.omnirom.omniswitch.ui;
-
-import android.graphics.drawable.ColorDrawable;
-
-public class ColorDrawableWithDimensions extends ColorDrawable {
-    private int mWidth;
-    private int mHeight;
-
-    public ColorDrawableWithDimensions(int color, int width, int height) {
-        super(color);
-        mWidth = width;
-        mHeight = height;
-    }
-
-    @Override
-    public int getIntrinsicWidth() {
-        return mWidth;
-    }
-
-    @Override
-    public int getIntrinsicHeight() {
-        return mHeight;
-    }
-}
diff --git a/src/org/omnirom/omniswitch/ui/FavoriteDialog.java b/src/org/omnirom/omniswitch/ui/FavoriteDialog.java
index 1e7f693..c05956f 100644
--- a/src/org/omnirom/omniswitch/ui/FavoriteDialog.java
+++ b/src/org/omnirom/omniswitch/ui/FavoriteDialog.java
@@ -73,9 +73,8 @@
 
     public class FavoriteListAdapter extends ArrayAdapter<String> {
 
-        public FavoriteListAdapter(Context context, int resource,
-                List<String> values) {
-            super(context, R.layout.favorite_app_item, resource, values);
+        public FavoriteListAdapter(Context context, List<String> values) {
+            super(context, R.layout.favorite_app_item, values);
         }
 
         @Override
@@ -98,7 +97,7 @@
             PackageManager.PackageItem packageItem = PackageManager.getInstance(mContext).getPackageItem(intent);
             holder.item.setText(packageItem.getTitle());
             holder.image.setImageDrawable(BitmapCache.getInstance(mContext)
-                        .getPackageIcon(mContext.getResources(), packageItem,
+                        .getResized(mContext.getResources(), packageItem,
                         mConfiguration, mIconSize));
             return convertView;
         }
@@ -166,8 +165,7 @@
         mIconSize = mConfiguration.mIconSizeSettings;
         mFavoriteConfigList = (DragSortListView) view
                 .findViewById(R.id.favorite_apps);
-        mFavoriteAdapter = new FavoriteListAdapter(mContext,
-                android.R.layout.simple_list_item_single_choice, mFavoriteList);
+        mFavoriteAdapter = new FavoriteListAdapter(mContext, mFavoriteList);
         mFavoriteConfigList.setAdapter(mFavoriteAdapter);
 
         final DragSortController dragSortController = new FavoriteDragSortController();
@@ -309,7 +307,7 @@
                 PackageItem applicationInfo = getItem(position);
                 holder.item.setText(applicationInfo.getTitle());
                 holder.image.setImageDrawable(BitmapCache.getInstance(mContext)
-                        .getPackageIcon(mContext.getResources(), applicationInfo,
+                        .getResized(mContext.getResources(), applicationInfo,
                         mConfiguration, mIconSize));
                 holder.check.setChecked(mChangedFavoriteListSet
                         .contains(applicationInfo.getIntent()));
diff --git a/src/org/omnirom/omniswitch/ui/ISwitchLayout.java b/src/org/omnirom/omniswitch/ui/ISwitchLayout.java
index 2835c05..fdbd8c4 100644
--- a/src/org/omnirom/omniswitch/ui/ISwitchLayout.java
+++ b/src/org/omnirom/omniswitch/ui/ISwitchLayout.java
@@ -52,4 +52,6 @@
     void canceSlideLayout();
 
     void shutdownService();
+
+    void resetRecentsState();
 }
\ No newline at end of file
diff --git a/src/org/omnirom/omniswitch/ui/SettingsGestureView.java b/src/org/omnirom/omniswitch/ui/SettingsGestureView.java
index 3cd5afc..ed2c255 100644
--- a/src/org/omnirom/omniswitch/ui/SettingsGestureView.java
+++ b/src/org/omnirom/omniswitch/ui/SettingsGestureView.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 The OmniROM Project
+ *  Copyright (C) 2013-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -41,13 +41,13 @@
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.SeekBar;
 
 public class SettingsGestureView {
     private WindowManager mWindowManager;
     private ImageView mDragButton;
     private ImageView mDragButtonStart;
     private ImageView mDragButtonEnd;
-
     private Button mOkButton;
     private Button mCancelButton;
     private Button mLocationButton;
@@ -56,7 +56,6 @@
     private LinearLayout mDragHandleViewLeft;
     private LinearLayout mDragHandleViewRight;
     private Context mContext;
-
     private int mLocation = 0; // 0 = right 1 = left
     private boolean mShowing;
     private float mDensity;
@@ -75,6 +74,8 @@
     private int mDragHandleMinHeight;
     private int mDragHandleLimiterHeight;
     private SwitchConfiguration mConfiguration;
+    private SeekBar mDragHandleWidthBar;
+    private int mDragHandleWidth;
 
     public SettingsGestureView(Context context) {
         mContext = context;
@@ -89,6 +90,7 @@
 
         mDragHandleLimiterHeight = Math.round(20 * mDensity);
         mDragHandleMinHeight = Math.round(60 * mDensity);
+        mDragHandleWidth = mConfiguration.mDefaultDragHandleWidth;
 
         mDragHandle = mContext.getResources().getDrawable(
                 R.drawable.drag_handle);
@@ -225,6 +227,33 @@
             }
         });
 
+        mDragHandleWidthBar = (SeekBar) mView.findViewById(R.id.drag_handle_width);
+        double min = mConfiguration.mDefaultDragHandleWidth * 0.5f;
+        double max = mConfiguration.mDefaultDragHandleWidth * 1.5f;
+        double value = mConfiguration.mDragHandleWidth;
+        double progressValue = scaleValue(value, min, max, 1f, 100f);
+        mDragHandleWidthBar.setProgress((int) progressValue);
+        mDragHandleWidthBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+            @Override
+            public void onStopTrackingTouch(SeekBar seekBar) {
+                double progressValue = seekBar.getProgress();
+                // 50 = mConfiguration.mDefaultDragHandleWidth
+                // max = 1.5 * mConfiguration.mDefaultDragHandleWidth
+                // min = mConfiguration.mDefaultDragHandleWidth / 2
+                // 1-100 -> 0.5-1.5
+                double scaleFactor= scaleValue(progressValue, 1f, 100f, 0.5f, 1.5f);
+                mDragHandleWidth = (int) (mConfiguration.mDefaultDragHandleWidth * scaleFactor);
+                updateDragHandleLayoutParams();
+            }
+            @Override
+            public void onStartTrackingTouch(SeekBar seekBar) {
+            }
+            @Override
+            public void onProgressChanged(SeekBar seekBar, int progress,
+                    boolean fromUser) {
+            }
+        });
+
         mOkButton.setOnClickListener(new View.OnClickListener() {
             public void onClick(View v) {
                 Editor edit = mPrefs.edit();
@@ -232,6 +261,7 @@
                 int relHeight = (int)(mStartY / (mConfiguration.getCurrentDisplayHeight() /100));
                 edit.putInt(SettingsActivity.PREF_HANDLE_POS_START_RELATIVE, relHeight);
                 edit.putInt(SettingsActivity.PREF_HANDLE_HEIGHT, mEndY - mStartY);
+                edit.putInt(SettingsActivity.PREF_HANDLE_WIDTH, mDragHandleWidth);
                 edit.commit();
                 hide();
             }
@@ -308,7 +338,8 @@
     }
     private void updateDragHandleLayoutParams() {
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
-                (int) (20 * mDensity + 0.5), (int) (mEndY - mStartY));
+                mDragHandleWidth,
+                (int) (mEndY - mStartY));
         params.gravity = mLocation == 1 ? Gravity.LEFT : Gravity.RIGHT;
         mDragButton.setLayoutParams(params);
 
@@ -348,20 +379,19 @@
         mDragButtonEnd.setRotation(mLocation == 1 ? 180 : 0);
     }
 
-    // cannot use SwitchConfiguration since service must not
-    // be running at this point
     private void updateFromPrefs() {
-        mStartY = SwitchConfiguration.getInstance(mContext).getCurrentOffsetStart();
-        mEndY = SwitchConfiguration.getInstance(mContext).getCurrentOffsetEnd();
+        mStartY = mConfiguration.getCurrentOffsetStart();
+        mEndY = mConfiguration.getCurrentOffsetEnd();
+        mDragHandleWidth = mConfiguration.mDragHandleWidth;
 
-        mLocation = SwitchConfiguration.getInstance(mContext).mLocation;
+        mLocation = mConfiguration.mLocation;
         if (mLocation == 1){
             mLocationButton.setText(mContext.getResources().getString(R.string.location_right));
         } else {
             mLocationButton.setText(mContext.getResources().getString(R.string.location_left));
         }
         // discard alpha
-        mColor = SwitchConfiguration.getInstance(mContext).mDragHandleColor | 0xFF000000;
+        mColor = mConfiguration.mDragHandleColor | 0xFF000000;
     }
 
     public void show() {
@@ -393,8 +423,10 @@
     }
 
     public void resetPosition() {
-        mStartY = SwitchConfiguration.getInstance(mContext).getDefaultOffsetStart();
-        mEndY = SwitchConfiguration.getInstance(mContext).getDefaultOffsetEnd();
+        mStartY = mConfiguration.getDefaultOffsetStart();
+        mEndY = mConfiguration.getDefaultOffsetEnd();
+        mDragHandleWidth = mConfiguration.mDefaultDragHandleWidth;
+        mDragHandleWidthBar.setProgress(50);
         updateLayout();
     }
 
@@ -403,8 +435,8 @@
     }
 
     public void handleRotation(){
-        mStartY = SwitchConfiguration.getInstance(mContext).getCustomOffsetStart(mStartYRelative);
-        mEndY = SwitchConfiguration.getInstance(mContext).getCustomOffsetEnd(mStartYRelative, mHandleHeight);
+        mStartY = mConfiguration.getCustomOffsetStart(mStartYRelative);
+        mEndY = mConfiguration.getCustomOffsetEnd(mStartYRelative, mHandleHeight);
         updateLayout();
     }
 
@@ -415,4 +447,8 @@
     private int getUpperHandleLimit() {
         return mConfiguration.mLevelHeight / 2;
     }
+
+    private double scaleValue(double value, double oldMin, double oldMax, double newMin, double newMax) {
+        return ( (value - oldMin) / (oldMax - oldMin) ) * (newMax - newMin) + newMin;
+    }
 }
diff --git a/src/org/omnirom/omniswitch/ui/SwitchGestureView.java b/src/org/omnirom/omniswitch/ui/SwitchGestureView.java
index 3c08044..43035c7 100644
--- a/src/org/omnirom/omniswitch/ui/SwitchGestureView.java
+++ b/src/org/omnirom/omniswitch/ui/SwitchGestureView.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 The OmniROM Project
+ *  Copyright (C) 2013-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,6 +36,7 @@
 import android.animation.TimeInterpolator;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.ColorStateList;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.Point;
@@ -43,6 +44,7 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.RippleDrawable;
 import android.os.Handler;
 import android.preference.PreferenceManager;
 import android.text.TextUtils;
@@ -76,9 +78,8 @@
     private float[] mInitDownPoint = new float[2];
     private boolean mShowing;
     private boolean mEnabled = true;
-    private Drawable mDragHandleImage;
-    private Drawable mDragHandleHiddenImage;
-    private Drawable mCurrentDragHandleImage;
+    private RippleDrawable mDragHandleImage;
+    private Drawable mDragHandleHiddenImage; // transparent image to detect touches for auto hide trigger
     private SharedPreferences mPrefs;
     private SwitchConfiguration mConfiguration;
     private boolean mHidden = true;
@@ -202,8 +203,10 @@
         list.addView(listLayout);
         mAllLists[2] = list;
 
-        mDragHandleImage = mContext.getResources().getDrawable(
-                R.drawable.drag_handle);
+        ColorStateList rippleColor =
+                ColorStateList.valueOf(mContext.getResources().getColor(android.R.color.white));
+        mDragHandleImage = new RippleDrawable(rippleColor, mContext.getResources().getDrawable(
+                R.drawable.drag_handle), null);
         mDragHandleHiddenImage = mContext.getResources().getDrawable(
                 R.drawable.drag_handle_overlay);
 
@@ -310,6 +313,7 @@
                 }
                 switch (action) {
                 case MotionEvent.ACTION_DOWN:
+                    v.setPressed(true);
                     mShowingSpeedSwitcher = false;
                     mHandleRecentsUpdate = false;
                     mLongPress = false;
@@ -330,6 +334,7 @@
                     }
                     break;
                 case MotionEvent.ACTION_CANCEL:
+                    v.setPressed(false);
                     mHandler.removeCallbacks(mLongPressRunnable);
                     mEnabled = true;
                     mFlingEnable = false;
@@ -338,6 +343,7 @@
                     if (mHidden) {
                         return true;
                     }
+                    v.setPressed(false);
                     mFlingEnable = false;
                     if (Math.abs(distanceX) > mSlop) {
                         mRecentsManager.showHidden();
@@ -358,6 +364,7 @@
                     mLastX = xRaw;
                     break;
                 case MotionEvent.ACTION_UP:
+                    v.setPressed(false);
                     mFlingEnable = false;
                     mHandler.removeCallbacks(mLongPressRunnable);
                     if(mHidden && mConfiguration.mAutoHide){
@@ -455,6 +462,13 @@
         }
     }
 
+    private void colorizeDragHandleImage() {
+        Drawable inner = ((RippleDrawable) mDragHandleImage).getDrawable(0);
+        inner=BitmapUtils.colorize(mContext.getResources(), mConfiguration.mDragHandleColor & 0x00FFFFFF, inner);
+        inner.setAlpha((mConfiguration.mDragHandleColor >> 24) & 0x000000FF);
+        ((RippleDrawable) mDragHandleImage).setDrawable(0, inner);
+    }
+
     private void updateDragHandleImage(boolean shown){
         if ((mHidden && !shown) || (!mHidden && shown)) {
             return;
@@ -462,37 +476,37 @@
         if (DEBUG) {
             Log.d(TAG, "updateDragHandleImage " + shown);
         }
-        mCurrentDragHandleImage = mDragHandleImage;
+
+        Drawable current = mDragHandleImage;
 
         mHidden = !shown;
 
         if(mConfiguration.mAutoHide){
             if(mHidden){
-                mCurrentDragHandleImage = mDragHandleHiddenImage;
+                current = mDragHandleHiddenImage;
             }
         } else {
             if(!shown){
-                mCurrentDragHandleImage = mDragHandleHiddenImage;
+                current = mDragHandleHiddenImage;
             }
         }
-
-        if (mConfiguration.mLocation == 1) {
-            mCurrentDragHandleImage = BitmapUtils.rotate(mContext.getResources(), mCurrentDragHandleImage, 180);
-        }
-        mCurrentDragHandleImage=BitmapUtils.colorize(mContext.getResources(), mConfiguration.mDragHandleColor & 0x00FFFFFF, mCurrentDragHandleImage);
-        mCurrentDragHandleImage.setAlpha((mConfiguration.mDragHandleColor >> 24) & 0x000000FF);
-
-        toggleDragHandle(shown);
+        toggleDragHandle(shown, current);
     }
 
     public void updatePrefs(SharedPreferences prefs, String key) {
         if(DEBUG){
             Log.d(TAG, "updatePrefs");
         }
-        updateButton(true);
 
-        buildFavoriteItems(mConfiguration.mFavoriteList);
-        buildActionList();
+        if (mConfiguration.mDragHandleShow) {
+            colorizeDragHandleImage();
+            updateButton(true);
+        }
+
+        if (mConfiguration.mSpeedSwitcher) {
+            buildFavoriteItems(mConfiguration.mFavoriteList);
+            buildActionList();
+        }
 
         if(key == null || key.equals(SettingsActivity.PREF_DRAG_HANDLE_ENABLE)){
             if(mConfiguration.mDragHandleShow){
@@ -571,27 +585,28 @@
         return a;
     }
 
-    private void toggleDragHandle(final boolean show) {
+    private void toggleDragHandle(final boolean show, final Drawable current) {
         if (mToggleDragHandleAnim != null){
             mToggleDragHandleAnim.cancel();
         }
 
-        if (mConfiguration.mLocation == 0) {
-            mDragButton.setPivotX(mConfiguration.mDragHandleWidth);
-        } else {
-            mDragButton.setPivotX(0f);
-        }
+        mDragButton.setRotation(mConfiguration.mLocation == 0 ? 0f : 180f);
 
         if (show){
-            mDragButton.setScaleX(0f);
-            mDragButton.setImageDrawable(mCurrentDragHandleImage);
+            mDragButton.setTranslationX(mConfiguration.mLocation == 0 ? mConfiguration.mDragHandleWidth : -mConfiguration.mDragHandleWidth);
+            mDragButton.setImageDrawable(current);
             mToggleDragHandleAnim = start(interpolator(mLinearInterpolator,
-                            ObjectAnimator.ofFloat(mDragButton, View.SCALE_X, 0f, 1f))
+                            ObjectAnimator.ofFloat(mDragButton, View.TRANSLATION_X,
+                            mConfiguration.mLocation == 0 ? mConfiguration.mDragHandleWidth :
+                                    -mConfiguration.mDragHandleWidth,
+                            0f))
                             .setDuration(FLIP_DURATION_DEFAULT));
         } else {
-            mDragButton.setScaleX(1f);
+            mDragButton.setTranslationX(0f);
             mToggleDragHandleAnim = start(interpolator(mLinearInterpolator,
-                            ObjectAnimator.ofFloat(mDragButton, View.SCALE_X, 1f, 0f))
+                            ObjectAnimator.ofFloat(mDragButton, View.TRANSLATION_X, 1f,
+                            mConfiguration.mLocation == 0 ? mConfiguration.mDragHandleWidth :
+                                    -mConfiguration.mDragHandleWidth))
                             .setDuration(FLIP_DURATION_DEFAULT));
         }
 
@@ -599,8 +614,8 @@
             @Override
             public void onAnimationEnd(Animator animation) {
                 if (!show){
-                    mDragButton.setImageDrawable(mCurrentDragHandleImage);
-                    mDragButton.setScaleX(1f);
+                    mDragButton.setImageDrawable(current);
+                    mDragButton.setTranslationX(0f);
                 }
             }
             @Override
@@ -627,16 +642,14 @@
             resetEnvItems();
             clearViewBackground();
 
-            mDragButton.setScaleX(0f);
+            mDragButton.setImageDrawable(mDragHandleHiddenImage);
             mView.addView(mDragButton, getDragHandleLayoutParamsSmall());
             mWindowManager.addView(mView, getParamsSmall());
-            updateDragHandleImage(true);
 
-            // restart hide delay
-            if(mConfiguration.mAutoHide){
-                mHandler.postDelayed(mAutoHideRunnable, SwitchConfiguration.AUTO_HIDE_DEFAULT);
+            if(!mConfiguration.mAutoHide){
+                updateDragHandleImage(true);
             }
-
+            mRecentsManager.getLayout().resetRecentsState();
             // run back trigger if required
             if(mVirtualBackKey && !mConfiguration.mRestrictedMode){
                 Utils.triggerVirtualKeypress(mHandler, KeyEvent.KEYCODE_BACK);
@@ -776,7 +789,8 @@
             }
             item.setIntent(packageItem.getIntent());
             item.setLabel(packageItem.getTitle());
-            Drawable d = BitmapCache.getInstance(mContext).getResized(mContext.getResources(), packageItem, mConfiguration, 100);
+            Drawable d = BitmapCache.getInstance(mContext).getResizedUncached(mContext.getResources(),
+                    packageItem, mConfiguration, 100);
             item.setOriginalImage(d);
             item.setCompoundDrawablesWithIntrinsicBounds(null, item.getOriginalImage(), null, null);
             if (mConfiguration.mShowLabels) {
diff --git a/src/org/omnirom/omniswitch/ui/SwitchLayout.java b/src/org/omnirom/omniswitch/ui/SwitchLayout.java
index 65692e1..76c9382 100644
--- a/src/org/omnirom/omniswitch/ui/SwitchLayout.java
+++ b/src/org/omnirom/omniswitch/ui/SwitchLayout.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2013 The OmniROM Project
+ *  Copyright (C) 2013-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -304,15 +304,16 @@
         mPopupView.setOnKeyListener(new PopupKeyListener());
 
         mButtonList = (HorizontalScrollView) mView
-                .findViewById(mConfiguration.mButtonPos == 0 ? R.id.button_list_top
-                        : R.id.button_list_bottom);
+                .findViewById(R.id.button_list_top);
         mButtonList.setHorizontalScrollBarEnabled(false);
         mButtonListItems = (LinearLayout) mView
-                .findViewById(mConfiguration.mButtonPos == 0 ? R.id.button_list_items_top
-                        : R.id.button_list_items_bottom);
-        mButtonListContainer = (LinearLayout) mView
-                .findViewById(mConfiguration.mButtonPos == 0 ? R.id.button_list_container_top
-                        : R.id.button_list_container_bottom);
+                .findViewById(R.id.button_list_items_top);
+
+        mButtonListContainerTop = (LinearLayout) mView
+                .findViewById(R.id.button_list_container_top);
+        mButtonListContainerBottom = (LinearLayout) mView
+                .findViewById(R.id.button_list_container_bottom);
+        selectButtonContainer();
         updateStyle();
     }
 
@@ -489,6 +490,9 @@
         }
         buildButtonList();
         if (mView != null) {
+            if (key.equals(SettingsActivity.PREF_BUTTON_POS)) {
+                selectButtonContainer();
+            }
             updateStyle();
         }
     }
@@ -567,7 +571,7 @@
                     mFavoriteListHorizontal, View.GONE);
             Animator rotateAnimator = interpolator(
                     mLinearInterpolator,
-                    ObjectAnimator.ofFloat(mOpenFavorite, View.ROTATION, ROTATE_180_DEGREE, ROTATE_360_DEGREE));
+                    ObjectAnimator.ofFloat(mOpenFavorite, View.ROTATION, ROTATE_180_DEGREE, ROTATE_0_DEGREE));
             mShowFavAnim = new AnimatorSet();
             mShowFavAnim.playTogether(collapseAnimator, rotateAnimator);
             mShowFavAnim.setDuration(FAVORITE_DURATION);
@@ -687,4 +691,9 @@
     private float getExpandRotation() {
         return mShowFavorites ? ROTATE_180_DEGREE : ROTATE_0_DEGREE;
     }
+
+    @Override
+    protected View getButtonList() {
+        return mButtonList;
+    }
 }
diff --git a/src/org/omnirom/omniswitch/ui/SwitchLayoutVertical.java b/src/org/omnirom/omniswitch/ui/SwitchLayoutVertical.java
index 34d5f69..4a4bf32 100644
--- a/src/org/omnirom/omniswitch/ui/SwitchLayoutVertical.java
+++ b/src/org/omnirom/omniswitch/ui/SwitchLayoutVertical.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2015 The OmniROM Project
+ *  Copyright (C) 2015-2016 The OmniROM Project
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -259,16 +259,16 @@
         mPopupView.setOnKeyListener(new PopupKeyListener());
 
         mButtonList = (ScrollView) mView
-                .findViewById(mConfiguration.mButtonPos == 0 ? R.id.button_list_top
-                        : R.id.button_list_bottom);
-        mButtonList.setVerticalScrollBarEnabled(false);
+                .findViewById(R.id.button_list_top);
+        mButtonList.setHorizontalScrollBarEnabled(false);
         mButtonListItems = (LinearLayout) mView
-                .findViewById(mConfiguration.mButtonPos == 0 ? R.id.button_list_items_top
-                        : R.id.button_list_items_bottom);
-        mButtonListContainer = (LinearLayout) mView
-                .findViewById(mConfiguration.mButtonPos == 0 ? R.id.button_list_container_top
-                        : R.id.button_list_container_bottom);
+                .findViewById(R.id.button_list_items_top);
 
+        mButtonListContainerTop = (LinearLayout) mView
+                .findViewById(R.id.button_list_container_top);
+        mButtonListContainerBottom = (LinearLayout) mView
+                .findViewById(R.id.button_list_container_bottom);
+        selectButtonContainer();
         updateStyle();
     }
 
@@ -382,10 +382,8 @@
                 WindowManager.LayoutParams.WRAP_CONTENT,
                 WindowManager.LayoutParams.MATCH_PARENT,
                 WindowManager.LayoutParams.TYPE_PHONE,
-                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
-                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                | (mConfiguration.mDimBehind ? WindowManager.LayoutParams.FLAG_DIM_BEHIND
-                        : 0), PixelFormat.TRANSLUCENT);
+                mConfiguration.mDimBehind ? WindowManager.LayoutParams.FLAG_DIM_BEHIND
+                        : 0, PixelFormat.TRANSLUCENT);
 
         // Turn on hardware acceleration for high end gfx devices.
         if (ActivityManager.isHighEndGfx()) {
@@ -438,6 +436,9 @@
         }
         addOpenFavoriteButton();
         if (mView != null) {
+            if (key.equals(SettingsActivity.PREF_BUTTON_POS)) {
+                selectButtonContainer();
+            }
             updateStyle();
         }
     }
@@ -511,7 +512,7 @@
                     mLinearInterpolator,
                     ObjectAnimator.ofFloat(mOpenFavorite, View.ROTATION,
                     mConfiguration.mLocation != 0 ? ROTATE_270_DEGREE : ROTATE_90_DEGREE,
-                    mConfiguration.mLocation != 0 ? ROTATE_270_DEGREE + ROTATE_180_DEGREE : ROTATE_270_DEGREE));
+                    mConfiguration.mLocation != 0 ? ROTATE_90_DEGREE : ROTATE_270_DEGREE));
             mShowFavAnim = new AnimatorSet();
             mShowFavAnim.playTogether(expandAnimator, rotateAnimator);
             mShowFavAnim.setDuration(FAVORITE_DURATION);
@@ -527,7 +528,7 @@
                     mLinearInterpolator,
                     ObjectAnimator.ofFloat(mOpenFavorite, View.ROTATION,
                     mConfiguration.mLocation != 0 ? ROTATE_90_DEGREE : ROTATE_270_DEGREE,
-                    mConfiguration.mLocation != 0 ? ROTATE_270_DEGREE : ROTATE_270_DEGREE + ROTATE_180_DEGREE));
+                    mConfiguration.mLocation != 0 ? ROTATE_270_DEGREE : ROTATE_90_DEGREE));
             mShowFavAnim = new AnimatorSet();
             mShowFavAnim.playTogether(collapseAnimator, rotateAnimator);
             mShowFavAnim.setDuration(FAVORITE_DURATION);
@@ -669,4 +670,9 @@
             mHandler.post(mUpdateRamBarTask);
         }
     }
+
+    @Override
+    protected View getButtonList() {
+        return mButtonList;
+    }
 }
