diff --git a/res/drawable/dt_expanded_desktop.xml b/res/drawable/dt_expanded_desktop.xml
new file mode 100644
index 0000000..89f9928
--- /dev/null
+++ b/res/drawable/dt_expanded_desktop.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="80dp"
+    android:width="80dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path android:fillColor="#fff" android:pathData="M16 10h-2v2h2v-2zm0 4h-2v2h2v-2zm-8-4H6v2h2v-2zm4 0h-2v2h2v-2zm8-6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V6h16v12z" />
+</vector>
diff --git a/res/drawable/ic_expanded_desktop_close_bg.xml b/res/drawable/ic_expanded_desktop_close_bg.xml
new file mode 100644
index 0000000..83193ab
--- /dev/null
+++ b/res/drawable/ic_expanded_desktop_close_bg.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+        android:color="#40607D8B">
+</ripple>
diff --git a/res/drawable/ic_expanded_desktop_hideboth.xml b/res/drawable/ic_expanded_desktop_hideboth.xml
new file mode 100644
index 0000000..2551ce4
--- /dev/null
+++ b/res/drawable/ic_expanded_desktop_hideboth.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012-2015 The CyanogenMod Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M18,4v16H6V4H18
+M18,2H6C4.9,2,4,2.9,4,4v16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C20,2.9,19.1,2,18,2L18,2Z" />
+</vector>
diff --git a/res/drawable/ic_expanded_desktop_hidenavbar.xml b/res/drawable/ic_expanded_desktop_hidenavbar.xml
new file mode 100644
index 0000000..c91d1f5
--- /dev/null
+++ b/res/drawable/ic_expanded_desktop_hidenavbar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012-2015 The CyanogenMod Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M18,20H6V8h12V20Z
+M18,2H6C4.9,2,4,2.9,4,4v16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C20,2.9,19.1,2,18,2L18,2z" />
+</vector>
diff --git a/res/drawable/ic_expanded_desktop_hidenone.xml b/res/drawable/ic_expanded_desktop_hidenone.xml
new file mode 100644
index 0000000..2c5a704
--- /dev/null
+++ b/res/drawable/ic_expanded_desktop_hidenone.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012-2015 The CyanogenMod Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M6,8h12v8H6V8Z
+M6,22h12c1.1,0,2-0.9,2-2V4c0-1.1-0.9-2-2-2H6C4.9,2,4,2.9,4,4v16C4,21.1,4.9,22,6,22L6,22z" />
+</vector>
diff --git a/res/drawable/ic_expanded_desktop_hidestatusbar.xml b/res/drawable/ic_expanded_desktop_hidestatusbar.xml
new file mode 100644
index 0000000..e048af1
--- /dev/null
+++ b/res/drawable/ic_expanded_desktop_hidestatusbar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012-2015 The CyanogenMod Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M6,4h12v12H6V4Z
+M6,22h12c1.1,0,2-0.9,2-2V4c0-1.1-0.9-2-2-2H6C4.9,2,4,2.9,4,4v16C4,21.1,4.9,22,6,22L6,22z" />
+</vector>
diff --git a/res/layout/expanded_desktop_prefs.xml b/res/layout/expanded_desktop_prefs.xml
new file mode 100644
index 0000000..1896326
--- /dev/null
+++ b/res/layout/expanded_desktop_prefs.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012-2015 The CyanogenMod Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <ListView
+        android:id="@+id/user_list_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:clipToPadding="false" />
+    <ProgressBar
+        android:id="@+id/progress_bar"
+        style="@android:style/Widget.Material.ProgressBar.Large"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:visibility="gone" />
+    <TextView
+        android:id="@+id/nothing_to_show"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:text="@string/expanded_nothing_to_show"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp"
+        android:gravity="center_vertical"
+        android:visibility="gone" />
+</RelativeLayout>
+
diff --git a/res/layout/expanded_item.xml b/res/layout/expanded_item.xml
new file mode 100644
index 0000000..36938b1
--- /dev/null
+++ b/res/layout/expanded_item.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012-2015 The CyanogenMod Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingTop="8dip"
+    android:paddingBottom="8dip"
+    android:orientation="horizontal">
+
+    <ImageView
+        android:id="@+id/app_icon"
+        android:layout_width="@android:dimen/app_icon_size"
+        android:layout_height="@android:dimen/app_icon_size"
+        android:layout_marginEnd="8dip"
+        android:layout_gravity="center_vertical"
+        android:scaleType="centerInside"
+        android:contentDescription="@null" />
+
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:orientation="vertical" >
+
+        <TextView
+            android:id="@+id/app_name"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:layout_gravity="fill_horizontal"
+            android:layout_marginTop="2dip"
+            android:singleLine="true"
+            android:ellipsize="marquee"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textAlignment="viewStart" />
+
+        <Spinner
+            android:id="@+id/app_mode"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="fill_horizontal|top"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textAlignment="viewStart" />
+
+    </LinearLayout>
+
+    <ImageView
+        android:id="@+id/state"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:scaleType="centerInside"
+        android:src="@drawable/ic_expanded_desktop_hidenone"
+        android:tint="?android:attr/colorControlNormal" />
+
+</LinearLayout>
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index 149d03d..51b96f5 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -715,4 +715,15 @@
     <string name="quick_pulldown_right">Right</string>
     <string name="quick_pulldown_always">Always</string>
 
+    <!-- Expanded desktop -->
+    <string name="expanded_desktop_title">Expanded desktop</string>
+    <string name="expanded_desktop_summary">Per-app configuration of the status bar and navigation key view</string>
+    <string name="expanded_hide_nothing">Hide nothing</string>
+    <string name="expanded_hide_status">Hide status bar</string>
+    <string name="expanded_hide_navigation">Hide navigation bar</string>
+    <string name="expanded_hide_both">Hide both</string>
+    <string name="expanded_nothing_to_show">To add a custom per-app configuration for expanded state, set "Enabled for all" to the off position</string>
+    <string name="expanded_desktop_state">Expanded state</string>
+    <string name="expanded_enabled_for_all">Enabled for all</string>
+    <string name="expanded_user_configurable">User configurable</string>
 </resources>
diff --git a/res/xml/bars_settings.xml b/res/xml/bars_settings.xml
index 531b661..c86e3a7 100644
--- a/res/xml/bars_settings.xml
+++ b/res/xml/bars_settings.xml
@@ -81,6 +81,18 @@
         </PreferenceCategory>
 
         <PreferenceCategory
+            android:key="expanded_desktop_category"
+            android:title="@string/expanded_desktop_title">
+
+            <Preference
+                android:key="expanded_desktop_category"
+                android:title="@string/expanded_desktop_title"
+                android:summary="@string/expanded_desktop_summary"
+                android:fragment="org.omnirom.omnigears.interfacesettings.ExpandedDesktop" />
+
+        </PreferenceCategory>
+
+        <PreferenceCategory
             android:key="lockscreen_category"
             android:title="@string/lockscreen_category_title" >
 
diff --git a/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java b/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
index ec40100..9e8776c 100644
--- a/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
@@ -55,6 +55,7 @@
     private static final String TAG = "BarsSettings";
     private static final String NETWORK_TRAFFIC_ROOT = "category_network_traffic";
     private static final String NAVIGATIONBAR_ROOT = "category_navigationbar";
+    private static final String EXPANDED_DESKTOP_CATEGORY = "expanded_desktop_category";
 
     private static final String QUICK_PULLDOWN = "quick_pulldown";
 
diff --git a/src/org/omnirom/omnigears/interfacesettings/ExpandedDesktop.java b/src/org/omnirom/omnigears/interfacesettings/ExpandedDesktop.java
new file mode 100644
index 0000000..ab4a58d
--- /dev/null
+++ b/src/org/omnirom/omnigears/interfacesettings/ExpandedDesktop.java
@@ -0,0 +1,582 @@
+/*
+ * Copyright (C) 2015 The CyanogenMod Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.omnirom.omnigears.interfacesettings;
+
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.provider.SearchIndexableResource;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManagerGlobal;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.SectionIndexer;
+import android.widget.Spinner;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.view.WindowManagerPolicyControl;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.widget.SwitchBar;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+import com.android.settings.Utils;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ExpandedDesktop extends SettingsPreferenceFragment implements
+        ApplicationsState.Callbacks, SwitchBar.OnSwitchChangeListener {
+
+    private static final int STATE_DISABLED = 0;
+    private static final int STATE_STATUS_HIDDEN = 1;
+    private static final int STATE_NAVIGATION_HIDDEN = 2;
+    private static final int STATE_BOTH_HIDDEN = 3;
+
+    private static final int STATE_ENABLE_FOR_ALL = 0;
+    private static final int STATE_USER_CONFIGURABLE = 1;
+
+    private AllPackagesAdapter mAllPackagesAdapter;
+    private ApplicationsState mApplicationsState;
+    private View mEmptyView;
+    private View mProgressBar;
+    private ListView mUserListView;
+    private ApplicationsState.Session mSession;
+    private ActivityFilter mActivityFilter;
+    private Map<String, ApplicationsState.AppEntry> mEntryMap =
+            new HashMap<String, ApplicationsState.AppEntry>();
+    private int mExpandedDesktopState;
+    private SwitchBar mSwitchBar;
+
+    private int getExpandedDesktopState(ContentResolver cr) {
+        String value = Settings.Global.getString(cr, Settings.Global.POLICY_CONTROL);
+        if ("immersive.full=*".equals(value)) {
+            return STATE_ENABLE_FOR_ALL;
+        }
+        return STATE_USER_CONFIGURABLE;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
+        mSession = mApplicationsState.newSession(this);
+        mSession.resume();
+        mActivityFilter = new ActivityFilter(getActivity().getPackageManager());
+
+        mExpandedDesktopState = getExpandedDesktopState(getActivity().getContentResolver());
+        if (mExpandedDesktopState == STATE_USER_CONFIGURABLE) {
+            WindowManagerPolicyControl.reloadFromSetting(getActivity(),
+                    Settings.Global.POLICY_CONTROL);
+        }
+        mAllPackagesAdapter = new AllPackagesAdapter(getActivity());
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        rebuild();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.expanded_desktop_prefs, container, false);
+        mUserListView = (ListView) view.findViewById(R.id.user_list_view);
+        mUserListView.setAdapter(mAllPackagesAdapter);
+        mUserListView.setFastScrollEnabled(true);
+
+        mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar();
+        mSwitchBar.setOnStateOffLabel(R.string.expanded_enabled_for_all);
+        mSwitchBar.setOnStateOnLabel(R.string.expanded_enabled_for_all);
+        mSwitchBar.show();
+
+        mEmptyView = view.findViewById(R.id.nothing_to_show);
+        mProgressBar = view.findViewById(R.id.progress_bar);
+
+        if (mExpandedDesktopState == STATE_USER_CONFIGURABLE) {
+            mSwitchBar.setChecked(false);
+            showListView();
+        } else {
+            mSwitchBar.setChecked(true);
+            hideListView();
+        }
+        mSwitchBar.addOnSwitchChangeListener(this);
+        return view;
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        save();
+        mSession.pause();
+        mSession.release();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        if (mSwitchBar != null) {
+            mSwitchBar.removeOnSwitchChangeListener(this);
+        }
+    }
+
+    private void enableForAll() {
+        mExpandedDesktopState = STATE_ENABLE_FOR_ALL;
+        writeValue("immersive.full=*");
+        mAllPackagesAdapter.notifyDataSetInvalidated();
+        hideListView();
+    }
+
+    private void userConfigurableSettings() {
+        mExpandedDesktopState = STATE_USER_CONFIGURABLE;
+        writeValue("");
+        WindowManagerPolicyControl.reloadFromSetting(getActivity());
+        mAllPackagesAdapter.notifyDataSetInvalidated();
+        showListView();
+    }
+
+    private void hideListView() {
+        mUserListView.setVisibility(View.GONE);
+        mEmptyView.setVisibility(View.VISIBLE);
+    }
+
+    private void showListView() {
+        mUserListView.setVisibility(View.VISIBLE);
+        mEmptyView.setVisibility(View.GONE);
+    }
+
+    private void writeValue(String value) {
+        Settings.Global.putString(getContentResolver(), Settings.Global.POLICY_CONTROL, value);
+    }
+
+    private static int getStateForPackage(String packageName) {
+        int state = STATE_DISABLED;
+
+        if (WindowManagerPolicyControl.immersiveStatusFilterMatches(packageName)) {
+            state = STATE_STATUS_HIDDEN;
+        }
+        if (WindowManagerPolicyControl.immersiveNavigationFilterMatches(packageName)) {
+            if (state == STATE_DISABLED) {
+                state = STATE_NAVIGATION_HIDDEN;
+            } else {
+                state = STATE_BOTH_HIDDEN;
+            }
+        }
+
+        return state;
+    }
+
+    @Override
+    public void onRunningStateChanged(boolean running) {
+    }
+
+    @Override
+    public void onPackageListChanged() {
+        mActivityFilter.updateLauncherInfoList();
+        rebuild();
+    }
+
+    @Override
+    public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> entries) {
+        if (entries != null) {
+            handleAppEntries(entries);
+            mAllPackagesAdapter.notifyDataSetChanged();
+        }
+    }
+
+    @Override
+    public void onPackageIconChanged() {
+    }
+
+    @Override
+    public void onPackageSizeChanged(String packageName) {
+    }
+
+    @Override
+    public void onAllSizesComputed() {
+    }
+
+    private void handleAppEntries(List<ApplicationsState.AppEntry> entries) {
+        String lastSectionIndex = null;
+        ArrayList<String> sections = new ArrayList<String>();
+        ArrayList<Integer> positions = new ArrayList<Integer>();
+        PackageManager pm = getPackageManager();
+        int count = entries.size(), offset = 0;
+
+        for (int i = 0; i < count; i++) {
+            ApplicationInfo info = entries.get(i).info;
+            String label = (String) info.loadLabel(pm);
+            String sectionIndex;
+
+            if (!info.enabled) {
+                sectionIndex = "--";
+            } else if (TextUtils.isEmpty(label)) {
+                sectionIndex = "";
+            } else {
+                sectionIndex = label.substring(0, 1).toUpperCase();
+            }
+
+            if (lastSectionIndex == null ||
+                    !TextUtils.equals(sectionIndex, lastSectionIndex)) {
+                sections.add(sectionIndex);
+                positions.add(offset);
+                lastSectionIndex = sectionIndex;
+            }
+            offset++;
+        }
+
+        mAllPackagesAdapter.setEntries(entries, sections, positions);
+        mEntryMap.clear();
+        for (ApplicationsState.AppEntry e : entries) {
+            mEntryMap.put(e.info.packageName, e);
+        }
+    }
+
+    private void rebuild() {
+        mSession.rebuild(mActivityFilter, ApplicationsState.ALPHA_COMPARATOR);
+    }
+
+    private void save() {
+        if (mExpandedDesktopState == STATE_USER_CONFIGURABLE) {
+            WindowManagerPolicyControl.saveToSettings(getActivity(),
+                    Settings.Global.POLICY_CONTROL);
+        }
+    }
+
+    int getStateDrawable(int state) {
+        switch (state) {
+            case STATE_STATUS_HIDDEN:
+                return R.drawable.ic_expanded_desktop_hidestatusbar;
+            case STATE_NAVIGATION_HIDDEN:
+                return R.drawable.ic_expanded_desktop_hidenavbar;
+            case STATE_BOTH_HIDDEN:
+                return R.drawable.ic_expanded_desktop_hideboth;
+            case STATE_DISABLED:
+            default:
+                return R.drawable.ic_expanded_desktop_hidenone;
+        }
+    }
+
+    @Override
+    public void onSwitchChanged(Switch switchView, boolean isChecked) {
+        if (isChecked) {
+            enableForAll();
+        } else {
+            userConfigurableSettings();
+        }
+    }
+
+    private class AllPackagesAdapter extends BaseAdapter
+            implements AdapterView.OnItemSelectedListener, SectionIndexer {
+
+        private final LayoutInflater inflater;
+        private List<ApplicationsState.AppEntry> entries = new ArrayList<>();
+        private final ModeAdapter mModesAdapter;
+        private String[] mSections;
+        private int[] mPositions;
+
+        public AllPackagesAdapter(Context context) {
+            this.inflater = LayoutInflater.from(context);
+            mModesAdapter = new ModeAdapter(context);
+            mActivityFilter = new ActivityFilter(context.getPackageManager());
+        }
+
+        @Override
+        public int getCount() {
+            return entries.size();
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return entries.get(position);
+        }
+
+        @Override
+        public boolean hasStableIds() {
+            return true;
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return entries.get(position).id;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ViewHolder holder;
+            if (convertView == null) {
+                holder = new ViewHolder(inflater.inflate(R.layout.expanded_item, parent, false));
+                holder.mode.setAdapter(mModesAdapter);
+                holder.mode.setOnItemSelectedListener(this);
+            } else {
+                holder = (ViewHolder) convertView.getTag();
+            }
+
+            ApplicationsState.AppEntry entry = entries.get(position);
+
+            if (entry == null) {
+                return holder.rootView;
+            }
+
+            holder.title.setText(entry.label);
+            mApplicationsState.ensureIcon(entry);
+            holder.icon.setImageDrawable(entry.icon);
+            holder.mode.setSelection(getStateForPackage(entry.info.packageName), false);
+            holder.mode.setTag(entry);
+            holder.stateIcon.setImageResource(getStateDrawable(
+                    getStateForPackage(entry.info.packageName)));
+            return holder.rootView;
+        }
+
+        private void setEntries(List<ApplicationsState.AppEntry> entries,
+                List<String> sections, List<Integer> positions) {
+            this.entries = entries;
+            mSections = sections.toArray(new String[sections.size()]);
+            mPositions = new int[positions.size()];
+            for (int i = 0; i < positions.size(); i++) {
+                mPositions[i] = positions.get(i);
+            }
+            notifyDataSetChanged();
+        }
+
+
+        @Override
+        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+            ApplicationsState.AppEntry entry = (ApplicationsState.AppEntry) parent.getTag();
+
+            WindowManagerPolicyControl.removeFromWhiteLists(entry.info.packageName);
+            switch (position) {
+                case STATE_STATUS_HIDDEN:
+                    WindowManagerPolicyControl.addToStatusWhiteList(entry.info.packageName);
+                    break;
+                case STATE_NAVIGATION_HIDDEN:
+                    WindowManagerPolicyControl.addToNavigationWhiteList(entry.info.packageName);
+                    break;
+                case STATE_BOTH_HIDDEN:
+                    WindowManagerPolicyControl.addToStatusWhiteList(entry.info.packageName);
+                    WindowManagerPolicyControl.addToNavigationWhiteList(entry.info.packageName);
+                    break;
+            }
+            save();
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public void onNothingSelected(AdapterView<?> parent) {
+        }
+
+        @Override
+        public int getPositionForSection(int section) {
+            if (section < 0 || section >= mSections.length) {
+                return -1;
+            }
+
+            return mPositions[section];
+        }
+
+        @Override
+        public int getSectionForPosition(int position) {
+            if (position < 0 || position >= getCount()) {
+                return -1;
+            }
+
+            int index = Arrays.binarySearch(mPositions, position);
+
+        /*
+         * Consider this example: section positions are 0, 3, 5; the supplied
+         * position is 4. The section corresponding to position 4 starts at
+         * position 3, so the expected return value is 1. Binary search will not
+         * find 4 in the array and thus will return -insertPosition-1, i.e. -3.
+         * To get from that number to the expected value of 1 we need to negate
+         * and subtract 2.
+         */
+            return index >= 0 ? index : -index - 2;
+        }
+
+        @Override
+        public Object[] getSections() {
+            return mSections;
+        }
+    }
+
+    private static class ViewHolder {
+        private TextView title;
+        private Spinner mode;
+        private ImageView icon;
+        private View rootView;
+        private ImageView stateIcon;
+
+        private ViewHolder(View view) {
+            this.title = (TextView) view.findViewById(R.id.app_name);
+            this.mode = (Spinner) view.findViewById(R.id.app_mode);
+            this.icon = (ImageView) view.findViewById(R.id.app_icon);
+            this.stateIcon = (ImageView) view.findViewById(R.id.state);
+            this.rootView = view;
+
+            view.setTag(this);
+        }
+    }
+
+    private static class ModeAdapter extends BaseAdapter {
+
+        private final LayoutInflater inflater;
+        private boolean hasNavigationBar = true;
+        private final int[] items = {R.string.expanded_hide_nothing, R.string.expanded_hide_status,
+                R.string.expanded_hide_navigation, R.string.expanded_hide_both};
+
+        private ModeAdapter(Context context) {
+            inflater = LayoutInflater.from(context);
+
+            try {
+                hasNavigationBar = WindowManagerGlobal.getWindowManagerService().hasNavigationBar();
+            } catch (RemoteException e) {
+                // Do nothing
+            }
+        }
+
+        @Override
+        public int getCount() {
+            return hasNavigationBar ? 4 : 2;
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return items[position];
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return 0;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            TextView view;
+            if (convertView != null) {
+                view = (TextView) convertView;
+            } else {
+                view = (TextView) inflater.inflate(android.R.layout.simple_spinner_dropdown_item,
+                        parent, false);
+            }
+
+            view.setText(items[position]);
+
+            return view;
+        }
+    }
+
+    private class ActivityFilter implements ApplicationsState.AppFilter {
+
+        private final PackageManager mPackageManager;
+        private final List<String> launcherResolveInfoList = new ArrayList<String>();
+        private boolean onlyLauncher = false;
+
+        private ActivityFilter(PackageManager packageManager) {
+            this.mPackageManager = packageManager;
+
+            updateLauncherInfoList();
+        }
+
+        public void updateLauncherInfoList() {
+            Intent i = new Intent(Intent.ACTION_MAIN);
+            i.addCategory(Intent.CATEGORY_LAUNCHER);
+            List<ResolveInfo> resolveInfoList = mPackageManager.queryIntentActivities(i, 0);
+
+            synchronized (launcherResolveInfoList) {
+                launcherResolveInfoList.clear();
+                for (ResolveInfo ri : resolveInfoList) {
+                    launcherResolveInfoList.add(ri.activityInfo.packageName);
+                }
+            }
+        }
+
+        @Override
+        public void init() {
+        }
+
+        @Override
+        public boolean filterApp(AppEntry info) {
+            boolean show = !mAllPackagesAdapter.entries.contains(info.info.packageName);
+            if (show && onlyLauncher) {
+                synchronized (launcherResolveInfoList) {
+                    show = launcherResolveInfoList.contains(info.info.packageName);
+                }
+            }
+            return show;
+        }
+    }
+
+    @Override
+    public void onLauncherInfoChanged() {
+    }
+
+    @Override
+    public void onLoadEntriesCompleted() {
+        rebuild();
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.OMNI_SETTINGS;
+    }
+
+    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider() {
+                @Override
+                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+                        boolean enabled) {
+                    ArrayList<SearchIndexableResource> result =
+                            new ArrayList<SearchIndexableResource>();
+
+                    SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.network_traffic;
+                    result.add(sir);
+
+                    return result;
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    ArrayList<String> result = new ArrayList<String>();
+                    return result;
+                }
+            };
+}
