diff --git a/res/drawable/bg_app_chooser.xml b/res/drawable/bg_app_chooser.xml
new file mode 100644
index 0000000..a79d829
--- /dev/null
+++ b/res/drawable/bg_app_chooser.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="rectangle" >
+            <solid android:color="?android:attr/colorBackgroundFloating" />
+            <corners android:radius="10dp" />
+        </shape>
+    </item>
+    <item>
+        <shape android:shape="rectangle" >
+            <stroke android:width="1dp" android:color="@android:color/black" />
+            <corners android:radius="10dp" />
+        </shape>
+    </item>
+</layer-list>
diff --git a/res/layout/app_grid_view.xml b/res/layout/app_grid_view.xml
deleted file mode 100644
index 38c575f..0000000
--- a/res/layout/app_grid_view.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--  Copyright (C) 2016 The OmniROM Project
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 2 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- -->
-<GridView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:columnWidth="@android:dimen/app_icon_size"
-    android:gravity="center"
-    android:horizontalSpacing="16dp"
-    android:id="@+id/app_grid_view"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:listSelector="@android:color/transparent"
-    android:numColumns="auto_fit"
-    android:padding="16dp"
-    android:stretchMode="columnWidth"
-    android:verticalSpacing="16dp" />
-
diff --git a/res/layout/layout_floating_widget.xml b/res/layout/layout_floating_widget.xml
new file mode 100644
index 0000000..06a913a
--- /dev/null
+++ b/res/layout/layout_floating_widget.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content" >
+
+    <RelativeLayout
+        android:id="@+id/root_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        tools:ignore="UselessParent">
+
+        <ScrollView
+            android:id="@+id/verticalScroll"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:layout_centerVertical="true"
+            android:layout_marginBottom="8dip"
+            android:layout_marginTop="8dip"
+            android:scrollbars="none">
+
+            <LinearLayout
+                android:id="@+id/selected_apps"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_app_chooser"
+                android:orientation="vertical"
+                android:padding="10dp" />
+        </ScrollView>
+    </RelativeLayout>
+</FrameLayout>
diff --git a/res/values/custom_arrays.xml b/res/values/custom_arrays.xml
index cfaf4ed..f4c3f94 100644
--- a/res/values/custom_arrays.xml
+++ b/res/values/custom_arrays.xml
@@ -628,4 +628,14 @@
         <item>2</item>
         <item>3</item>
     </string-array>
+
+    <string-array name="app_chooser_position_entries" translatable="false">
+        <item>@string/app_chooser_left</item>
+        <item>@string/app_chooser_right</item>
+    </string-array>
+
+    <string-array name="app_chooser_position_values" translatable="false">
+        <item>0</item>
+        <item>1</item>
+    </string-array>
 </resources>
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index c882a1b..c58bb8f 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -712,6 +712,10 @@
     <string name="autorun_single_app_summary">Dont show app selection dialog</string>
     <string name="bt_a2dp_connect_app_list_summary">App(s) to be listed when an A2DP event is triggered, such as connecting a Bluetooth headset</string>
     <string name="headset_connect_app_list_summary">App(s) to be listed when a wired headset is connected</string>
+    <string name="app_chooser_left">Left</string>
+    <string name="app_chooser_right">Right</string>
+    <string name="app_chooser_timeout_title">App chooser dialog timeout</string>
+    <string name="app_chooser_position_title">App chooser dialog position</string>
 
     <!-- Quick Pulldown-->
     <string name="quick_pulldown_title">Quick pulldown</string>
diff --git a/res/xml/event_service_settings.xml b/res/xml/event_service_settings.xml
index cff6d4d..8983e64 100644
--- a/res/xml/event_service_settings.xml
+++ b/res/xml/event_service_settings.xml
@@ -17,6 +17,7 @@
  -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
     android:key="event_service_settings"
     android:title="@string/event_service_settings_title">
 
@@ -47,8 +48,8 @@
         <org.omnirom.omnigears.preference.ScrollAppsViewPreference
             android:dependency="event_service_enabled"
             android:key="a2dp_app_list"
-            android:selectable="false"
-            android:persistent="false" />
+            android:persistent="false"
+            android:selectable="false" />
 
         <org.omnirom.omnigears.preference.AppMultiSelectListPreference
             android:dependency="event_service_enabled"
@@ -61,8 +62,8 @@
         <org.omnirom.omnigears.preference.ScrollAppsViewPreference
             android:dependency="event_service_enabled"
             android:key="headset_app_list"
-            android:selectable="false"
-            android:persistent="false" />
+            android:persistent="false"
+            android:selectable="false" />
 
         <SwitchPreference
             android:defaultValue="true"
@@ -85,5 +86,23 @@
             android:persistent="false"
             android:title="@string/media_player_autostart_title" />
 
+        <org.omnirom.omnigears.preference.SeekBarPreference
+            android:dependency="event_service_enabled"
+            android:key="app_chooser_timeout"
+            android:max="60"
+            android:persistent="false"
+            android:title="@string/app_chooser_timeout_title"
+            settings:min="0"
+            settings:unitsLeft=""
+            settings:unitsRight="@string/unit_sec" />
+
+        <ListPreference
+            android:dependency="event_service_enabled"
+            android:entries="@array/app_chooser_position_entries"
+            android:entryValues="@array/app_chooser_position_values"
+            android:key="app_chooser_position"
+            android:persistent="false"
+            android:title="@string/app_chooser_position_title" />
+
     </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/org/omnirom/omnigears/service/EventService.java b/src/org/omnirom/omnigears/service/EventService.java
index 8bcb452..ed20f9c 100644
--- a/src/org/omnirom/omnigears/service/EventService.java
+++ b/src/org/omnirom/omnigears/service/EventService.java
@@ -17,26 +17,43 @@
  */
 package org.omnirom.omnigears.service;
 
+import android.app.ActivityManagerNative;
 import android.app.Service;
 import android.bluetooth.BluetoothA2dp;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Drawable;
 import android.media.AudioManager;
 import android.media.AudioSystem;
+import android.media.IAudioService;
+import android.media.session.MediaSessionLegacyHelper;
 import android.os.Binder;
+import android.os.Handler;
 import android.os.IBinder;
 import android.os.PowerManager;
+import android.os.ServiceManager;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.util.Log;
+import android.view.ContextThemeWrapper;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
 
-import org.omnirom.omnigears.ui.MultiAppSelectorActivity;
-import org.omnirom.omnigears.utils.SetStringPackUtils;
+import org.omnirom.omnigears.R;
 
 import java.util.Set;
 
@@ -49,6 +66,12 @@
     private static boolean mWiredHeadsetConnected;
     private static boolean mA2DPConnected;
 
+    private WindowManager mWindowManager;
+    private View mFloatingWidget = null;
+    private Set<String> appList = null;
+    private Handler mHandler = new Handler();
+    private PackageManager mPm;
+
     private BroadcastReceiver mStateListener = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -59,6 +82,7 @@
                 if (DEBUG) Log.d(TAG, "onReceive " + action);
 
                 boolean disableIfMusicActive = getPrefs(context).getBoolean(EventServiceSettings.EVENT_MUSIC_ACTIVE, true);
+                boolean autoRun = getPrefs(context).getBoolean(EventServiceSettings.EVENT_AUTORUN_SINGLE, true);
 
                 switch (action) {
                     case BluetoothAdapter.ACTION_STATE_CHANGED:
@@ -74,9 +98,13 @@
                             if (DEBUG) Log.d(TAG, "BluetoothProfile.STATE_CONNECTED = true");
 
                             if (!(disableIfMusicActive && isMusicActive())) {
-                                Set<String> apps = getPrefs(context).getStringSet(EventServiceSettings.EVENT_A2DP_CONNECT, null);
-                                if (apps != null) {
-                                    openMultiAppSelector(apps, context);
+                                appList = getPrefs(context).getStringSet(EventServiceSettings.EVENT_A2DP_CONNECT, null);
+                                if (appList != null) {
+                                    if (autoRun && appList.size() == 1) {
+                                        openApp(appList.iterator().next(), context);
+                                    } else {
+                                        openAppChooserDialog(context);
+                                    }
                                 }
                             }
                         } else {
@@ -91,9 +119,13 @@
                             if (DEBUG) Log.d(TAG, "AudioManager.ACTION_HEADSET_PLUG = true");
 
                             if (!(disableIfMusicActive && isMusicActive())) {
-                                Set<String> apps = getPrefs(context).getStringSet(EventServiceSettings.EVENT_WIRED_HEADSET_CONNECT, null);
-                                if (apps != null) {
-                                    openMultiAppSelector(apps, context);
+                                appList = getPrefs(context).getStringSet(EventServiceSettings.EVENT_WIRED_HEADSET_CONNECT, null);
+                                if (appList != null) {
+                                    if (autoRun && appList.size() == 1) {
+                                        openApp(appList.iterator().next(), context);
+                                    } else {
+                                        openAppChooserDialog(context);
+                                    }
                                 }
                             }
                         } else {
@@ -109,6 +141,128 @@
         }
     };
 
+    public void openAppChooserDialog(final Context context) {
+        final LayoutInflater inflater = LayoutInflater.from(new ContextThemeWrapper(
+                context, android.R.style.Theme_DeviceDefault_Light_Dialog));
+        mFloatingWidget = inflater.inflate(R.layout.layout_floating_widget, null);
+
+        if (mFloatingWidget.getWindowToken() == null) {
+            final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
+                    WindowManager.LayoutParams.WRAP_CONTENT,
+                    WindowManager.LayoutParams.WRAP_CONTENT,
+                    WindowManager.LayoutParams.TYPE_PHONE,
+                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
+                    PixelFormat.TRANSLUCENT);
+
+            params.x = 25;
+            params.windowAnimations = android.R.style.Animation_Dialog;
+
+            int chooserPosition = getPrefs(context).getInt(EventServiceSettings.APP_CHOOSER_POSITION, 0);
+            if (chooserPosition == 0) {
+                params.gravity = Gravity.CENTER_VERTICAL | Gravity.LEFT;
+            } else {
+                params.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT;
+            }
+
+            // Selected apps
+            LinearLayout linearLayout = (LinearLayout) mFloatingWidget.findViewById(R.id.selected_apps);
+            if (linearLayout.getChildCount() > 0) linearLayout.removeAllViews();
+
+            for (final String value : appList) {
+                try {
+                    View v = inflater.inflate(R.layout.app_grid_item, null);
+                    ComponentName componentName = ComponentName.unflattenFromString(value);
+                    Drawable icon = mPm.getActivityIcon(componentName);
+                    ((ImageView) v.findViewById(R.id.appIcon)).setImageDrawable(icon);
+                    v.setPadding(30, 15, 30, 15);
+                    v.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            mWindowManager.removeViewImmediate(mFloatingWidget);
+                            openApp(value, context);
+                        }
+                    });
+                    linearLayout.addView(v);
+                } catch (PackageManager.NameNotFoundException e) {
+                    Log.e(TAG, "Set app icon", e);
+                }
+            }
+
+            // Close button
+            View close = inflater.inflate(R.layout.app_grid_item, null);
+            ((ImageView) close.findViewById(R.id.appIcon)).setImageResource(R.drawable.ic_disabled);
+            close.setPadding(30, 15, 30, 15);
+            close.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    mWindowManager.removeViewImmediate(mFloatingWidget);
+                }
+            });
+            linearLayout.addView(close);
+
+            mWindowManager.addView(mFloatingWidget, params);
+
+            final int timeout = getPrefs(context).getInt(EventServiceSettings.APP_CHOOSER_TIMEOUT, 15);
+            if (timeout > 0) {
+                Handler mCloseHandler = new Handler();
+                mCloseHandler.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        boolean stillThere = (mFloatingWidget != null
+                                && mFloatingWidget.getWindowToken() != null);
+
+                        if (stillThere) {
+                            mWindowManager.removeViewImmediate(mFloatingWidget);
+                        }
+                    }
+                }, timeout * 1000);
+            }
+        }
+    }
+
+    private void openApp(String app_uri, Context context) {
+        try {
+            startActivityAsUser(createIntent(app_uri), UserHandle.CURRENT);
+            if (getPrefs(context).getBoolean(EventServiceSettings.EVENT_MEDIA_PLAYER_START, false)) {
+                mHandler.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        dispatchMediaKeyToAudioService(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
+                    }
+                }, 1000);
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "MultiAppSelector.EVENT_MEDIA_PLAYER_START", e);
+        }
+    }
+
+    private void dispatchMediaKeyToAudioService(int keycode) {
+        if (ActivityManagerNative.isSystemReady()) {
+            IAudioService audioService = IAudioService.Stub
+                    .asInterface(ServiceManager.checkService(Context.AUDIO_SERVICE));
+            if (audioService != null) {
+                if (DEBUG) Log.d(TAG, "dispatchMediaKeyToAudioService " + keycode);
+
+                KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(),
+                        SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN,
+                        keycode, 0);
+                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
+                event = KeyEvent.changeAction(event, KeyEvent.ACTION_UP);
+                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
+            }
+        }
+    }
+
+    private Intent createIntent(String value) {
+        ComponentName componentName = ComponentName.unflattenFromString(value);
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_LAUNCHER);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+        intent.setComponent(componentName);
+        return intent;
+    }
+
     private boolean isMusicActive() {
         if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) {
             // local / wired / BT playback active
@@ -124,19 +278,6 @@
         return false;
     }
 
-    private void openMultiAppSelector(Set<String> apps, Context context) {
-        Intent intent = new Intent(context, MultiAppSelectorActivity.class);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
-                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-        intent.putExtra(MultiAppSelectorActivity.APPS, SetStringPackUtils.packSet(apps));
-        intent.putExtra(MultiAppSelectorActivity.AUTORUN_SINGLE,
-                getPrefs(context).getBoolean(EventServiceSettings.EVENT_AUTORUN_SINGLE, true));
-        intent.putExtra(MultiAppSelectorActivity.MEDIA_PLAYER_START,
-                getPrefs(context).getBoolean(EventServiceSettings.EVENT_MEDIA_PLAYER_START, false));
-        startActivityAsUser(intent, UserHandle.CURRENT);
-    }
-
     public class LocalBinder extends Binder {
         public EventService getService() {
             return EventService.this;
@@ -153,6 +294,8 @@
         mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
         mWakeLock.setReferenceCounted(true);
         mIsRunning = true;
+        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
+        mPm = getPackageManager();
         registerListener();
     }
 
@@ -185,6 +328,7 @@
         try {
             this.unregisterReceiver(mStateListener);
         } catch (Exception e) {
+            Log.e(TAG, "unregisterListener", e);
         }
     }
 
diff --git a/src/org/omnirom/omnigears/service/EventServiceSettings.java b/src/org/omnirom/omnigears/service/EventServiceSettings.java
index e146278..5d89ebc 100644
--- a/src/org/omnirom/omnigears/service/EventServiceSettings.java
+++ b/src/org/omnirom/omnigears/service/EventServiceSettings.java
@@ -21,10 +21,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Handler;
 import android.provider.SearchIndexableResource;
 import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 
@@ -36,6 +38,7 @@
 
 import org.omnirom.omnigears.preference.AppMultiSelectListPreference;
 import org.omnirom.omnigears.preference.ScrollAppsViewPreference;
+import org.omnirom.omnigears.preference.SeekBarPreference;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -53,6 +56,8 @@
     public static final String EVENT_AUTORUN_SINGLE = "autorun_single_app";
     public static final String A2DP_APP_LIST = "a2dp_app_list";
     public static final String HEADSET_APP_LIST = "headset_app_list";
+    public static final String APP_CHOOSER_TIMEOUT = "app_chooser_timeout";
+    public static final String APP_CHOOSER_POSITION = "app_chooser_position";
 
     // -- For backward compatibility
     public static final String OLD_EVENT_A2DP_CONNECT = "bt_a2dp_connect_app";
@@ -67,6 +72,8 @@
     private SwitchPreference mAutoStart;
     private SwitchPreference mMusicActive;
     private SwitchPreference mAutorun;
+    private SeekBarPreference mChooserTimeout;
+    private ListPreference mChooserPosition;
     private Handler mHandler = new Handler();
     private String mServiceRunning;
     private String mServiceStopped;
@@ -103,6 +110,12 @@
         mServiceStopped = getResources().getString(R.string.event_service_stopped);
         mEnable.setSummary(isServiceRunning() ? mServiceRunning : mServiceStopped);
 
+        mChooserPosition = (ListPreference) findPreference(APP_CHOOSER_POSITION);
+        mChooserPosition.setOnPreferenceChangeListener(this);
+        mChooserPosition.setValue(
+                Integer.toString(getPrefs().getInt(EventServiceSettings.APP_CHOOSER_POSITION, 0)));
+        mChooserPosition.setSummary(mChooserPosition.getEntry());
+
         mAutoStart = (SwitchPreference) findPreference(EVENT_MEDIA_PLAYER_START);
         mAutoStart.setChecked(getPrefs().getBoolean(EventServiceSettings.EVENT_MEDIA_PLAYER_START, false));
         mAutoStart.setOnPreferenceChangeListener(this);
@@ -115,6 +128,10 @@
         mAutorun.setChecked(getPrefs().getBoolean(EventServiceSettings.EVENT_AUTORUN_SINGLE, true));
         mAutorun.setOnPreferenceChangeListener(this);
 
+        mChooserTimeout = (SeekBarPreference) findPreference(APP_CHOOSER_TIMEOUT);
+        mChooserTimeout.setValue(getPrefs().getInt(EventServiceSettings.APP_CHOOSER_TIMEOUT, 15));
+        mChooserTimeout.setOnPreferenceChangeListener(this);
+
         mA2DPappSelect = (AppMultiSelectListPreference) findPreference(EVENT_A2DP_CONNECT);
         Set<String> value = getPrefs().getStringSet(EVENT_A2DP_CONNECT, null);
         if (value != null) mA2DPappSelect.setValues(value);
@@ -205,10 +222,28 @@
             boolean value = ((Boolean) newValue).booleanValue();
             getPrefs().edit().putBoolean(EVENT_AUTORUN_SINGLE, value).commit();
             return true;
+        } else if (preference == mChooserTimeout) {
+            int value = ((int) newValue);
+            getPrefs().edit().putInt(APP_CHOOSER_TIMEOUT, value).commit();
+            return true;
+        } else if (preference == mChooserPosition) {
+            int value = Integer.valueOf((String) newValue);
+            getPrefs().edit().putInt(APP_CHOOSER_POSITION, value).commit();
+            updateChooserPositionSummary(value);
+            return true;
         }
         return false;
     }
 
+    private void updateChooserPositionSummary(int value) {
+        Resources res = getResources();
+        if (value == 0) {
+            mChooserPosition.setSummary(res.getString(R.string.app_chooser_left));
+        } else {
+            mChooserPosition.setSummary(res.getString(R.string.app_chooser_right));
+        }
+    }
+
     private boolean isServiceRunning() {
         return EventService.isRunning();
     }
diff --git a/src/org/omnirom/omnigears/ui/AppGridAdapter.java b/src/org/omnirom/omnigears/ui/AppGridAdapter.java
deleted file mode 100644
index 4dddb4e..0000000
--- a/src/org/omnirom/omnigears/ui/AppGridAdapter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2017 The OmniROM Project
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package org.omnirom.omnigears.ui;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-
-import org.omnirom.omnigears.R;
-
-public class AppGridAdapter extends BaseAdapter {
-    private static final String TAG = "AppGridAdapter";
-
-    private LayoutInflater layoutinflater;
-    private Object[] appList;
-    private PackageManager mPm;
-
-    public AppGridAdapter(Context context, Object[] customizedListView) {
-        mPm = context.getPackageManager();
-        layoutinflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        appList = customizedListView;
-    }
-
-    @Override
-    public int getCount() {
-        return appList.length;
-    }
-
-    @Override
-    public Object getItem(int position) {
-        return appList[position];
-    }
-
-    @Override
-    public long getItemId(int position) {
-        return (long) position;
-    }
-
-    @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
-
-        ViewHolder listViewHolder;
-
-        if (convertView == null) {
-            listViewHolder = new ViewHolder();
-            convertView = layoutinflater.inflate(R.layout.app_grid_item, parent, false);
-            listViewHolder.imageInListView = (ImageView) convertView.findViewById(R.id.appIcon);
-            convertView.setTag(listViewHolder);
-        } else {
-            listViewHolder = (ViewHolder) convertView.getTag();
-        }
-
-        try {
-            ComponentName componentName = ComponentName.unflattenFromString((String) appList[position]);
-            Drawable icon = mPm.getActivityIcon(componentName);
-            listViewHolder.imageInListView.setImageDrawable(icon);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Set app icon", e);
-        }
-
-        return convertView;
-    }
-
-    static class ViewHolder {
-        ImageView imageInListView;
-    }
-}
diff --git a/src/org/omnirom/omnigears/ui/MultiAppSelectorActivity.java b/src/org/omnirom/omnigears/ui/MultiAppSelectorActivity.java
deleted file mode 100644
index 1e5b9c6..0000000
--- a/src/org/omnirom/omnigears/ui/MultiAppSelectorActivity.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package org.omnirom.omnigears.ui;
-
-
-import android.app.Activity;
-import android.app.ActivityManagerNative;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.media.IAudioService;
-import android.media.session.MediaSessionLegacyHelper;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.GridView;
-
-import org.omnirom.omnigears.R;
-import org.omnirom.omnigears.utils.SetStringPackUtils;
-
-public class MultiAppSelectorActivity extends Activity {
-    private static final String TAG = "MultiAppSelector";
-    private static final boolean DEBUG = false;
-
-    public static final String APPS = "apps";
-    public static final String MEDIA_PLAYER_START = "media_player_start";
-    public static final String AUTORUN_SINGLE = "autorun_single";
-
-    private Handler mHandler = new Handler();
-    private Boolean mediaStart = false;
-    private Boolean autoRun = false;
-    private Object[] appList = null;
-    private GridView gridview;
-
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        requestWindowFeature(Window.FEATURE_NO_TITLE);
-        setContentView(R.layout.app_grid_view);
-        Intent intent = getIntent();
-
-        mediaStart = intent.getBooleanExtra(MEDIA_PLAYER_START, false);
-        autoRun = intent.getBooleanExtra(AUTORUN_SINGLE, false);
-        appList = SetStringPackUtils.unpackString(intent.getStringExtra(APPS)).toArray();
-
-        gridview = (GridView) findViewById(R.id.app_grid_view);
-        gridview.setAdapter(new AppGridAdapter(MultiAppSelectorActivity.this, appList));
-        gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                openApp((String) appList[position]);
-            }
-        });
-
-        if (autoRun && appList.length == 1) { // If there is only one app open it
-            openApp((String) appList[0]);
-        }
-    }
-
-    private void openApp(String app_uri) {
-        try {
-            startActivityAsUser(createIntent(app_uri), UserHandle.CURRENT);
-            if (mediaStart) {
-                mHandler.postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        dispatchMediaKeyToAudioService(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
-                    }
-                }, 1000);
-            }
-        } catch (Exception e) {
-            Log.e(TAG, "MultiAppSelector.EVENT_MEDIA_PLAYER_START", e);
-        }
-    }
-
-    private Intent createIntent(String value) {
-        ComponentName componentName = ComponentName.unflattenFromString(value);
-        Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.addCategory(Intent.CATEGORY_LAUNCHER);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-        intent.setComponent(componentName);
-        return intent;
-    }
-
-    private void dispatchMediaKeyToAudioService(int keycode) {
-        if (ActivityManagerNative.isSystemReady()) {
-            IAudioService audioService = IAudioService.Stub
-                    .asInterface(ServiceManager.checkService(Context.AUDIO_SERVICE));
-            if (audioService != null) {
-                if (DEBUG) Log.d(TAG, "dispatchMediaKeyToAudioService " + keycode);
-
-                KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(),
-                        SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN,
-                        keycode, 0);
-                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
-                event = KeyEvent.changeAction(event, KeyEvent.ACTION_UP);
-                MediaSessionLegacyHelper.getHelper(this).sendMediaButtonEvent(event, true);
-            }
-        }
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-    }
-
-    @Override
-    protected void onStop() {
-        super.onStop();
-        finish();
-    }
-}
diff --git a/src/org/omnirom/omnigears/utils/SetStringPackUtils.java b/src/org/omnirom/omnigears/utils/SetStringPackUtils.java
deleted file mode 100644
index 758c97e..0000000
--- a/src/org/omnirom/omnigears/utils/SetStringPackUtils.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2017 The OmniROM Project
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package org.omnirom.omnigears.utils;
-
-import android.text.TextUtils;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-public class SetStringPackUtils {
-    public static Set<String> unpackString(String packed) {
-        return new HashSet<String>(Arrays.asList(packed.split("\\|")));
-    }
-
-    public static String packSet(Set<String> values) {
-        return TextUtils.join("|", values);
-    }
-}
