Implement new Manage Apps list

Manage apps now only has one list.  When entered from the dashboard
it is not sortable or filterable, and shows a combination of downloaded
apps and anything that shows up in launcher.  When 'all apps' is
entered through advanced app settings, the list shows all apps and
can be filtered and sorted.

Bug: 19443900
Change-Id: I555ee56417c330424d458750b6f81d3bd543f66d
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8eccf9e..883ded3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -759,7 +759,6 @@
             <intent-filter android:priority="1">
                 <action android:name="android.settings.APPLICATION_SETTINGS" />
                 <action android:name="android.settings.MANAGE_APPLICATIONS_SETTINGS" />
-                <action android:name="android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <intent-filter>
@@ -774,6 +773,19 @@
                 android:resource="@id/application_settings" />
         </activity>
 
+        <activity android:name="Settings$AllApplicationsActivity"
+                android:label="@string/applications_settings"
+                android:taskAffinity="">
+            <intent-filter>
+                <action android:name="android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.applications.ManageApplications" />
+            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+                android:resource="@id/application_settings" />
+        </activity>
+
         <!-- Keep compatibility with old shortcuts. -->
         <activity-alias android:name=".applications.ManageApplications"
                 android:label="@string/applications_settings"
diff --git a/res/drawable/ic_settings_24dp.xml b/res/drawable/ic_settings_24dp.xml
new file mode 100644
index 0000000..545bc2d
--- /dev/null
+++ b/res/drawable/ic_settings_24dp.xml
@@ -0,0 +1,25 @@
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M19.4,13.0c0.0,-0.3 0.1,-0.6 0.1,-1.0s0.0,-0.7 -0.1,-1.0l2.1,-1.7c0.2,-0.2 0.2,-0.4 0.1,-0.6l-2.0,-3.5C19.5,5.1 19.3,5.0 19.0,5.1l-2.5,1.0c-0.5,-0.4 -1.1,-0.7 -1.7,-1.0l-0.4,-2.6C14.5,2.2 14.2,2.0 14.0,2.0l-4.0,0.0C9.8,2.0 9.5,2.2 9.5,2.4L9.1,5.1C8.5,5.3 8.0,5.7 7.4,6.1L5.0,5.1C4.7,5.0 4.5,5.1 4.3,5.3l-2.0,3.5C2.2,8.9 2.3,9.2 2.5,9.4L4.6,11.0c0.0,0.3 -0.1,0.6 -0.1,1.0s0.0,0.7 0.1,1.0l-2.1,1.7c-0.2,0.2 -0.2,0.4 -0.1,0.6l2.0,3.5C4.5,18.9 4.7,19.0 5.0,18.9l2.5,-1.0c0.5,0.4 1.1,0.7 1.7,1.0l0.4,2.6c0.0,0.2 0.2,0.4 0.5,0.4l4.0,0.0c0.2,0.0 0.5,-0.2 0.5,-0.4l0.4,-2.6c0.6,-0.3 1.2,-0.6 1.7,-1.0l2.5,1.0c0.2,0.1 0.5,0.0 0.6,-0.2l2.0,-3.5c0.1,-0.2 0.1,-0.5 -0.1,-0.6L19.4,13.0zM12.0,15.5c-1.9,0.0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5s3.5,1.6 3.5,3.5S13.9,15.5 12.0,15.5z"
+        android:fillColor="#ffffffff" />
+</vector>
diff --git a/res/layout/apps_filter_spinner.xml b/res/layout/apps_filter_spinner.xml
new file mode 100644
index 0000000..f72d7ee
--- /dev/null
+++ b/res/layout/apps_filter_spinner.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     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="?android:attr/actionBarSize"
+    android:background="@drawable/switchbar_background"
+    android:gravity="center_vertical"
+    android:theme="?attr/switchBarTheme" >
+
+    <Spinner
+        android:id="@+id/filter_spinner"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:layout_marginStart="@dimen/switchbar_subsettings_margin_start"
+        android:layout_alignWithParentIfMissing="true"
+        android:layout_centerVertical="true"
+        android:textAlignment="viewStart" />
+
+    <View
+        android:id="@+id/row_divider"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/listDivider" />
+
+</RelativeLayout>
+
diff --git a/res/layout/filter_spinner_item.xml b/res/layout/filter_spinner_item.xml
new file mode 100644
index 0000000..e83dd80
--- /dev/null
+++ b/res/layout/filter_spinner_item.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/text1"
+    style="?android:attr/spinnerItemStyle"
+    android:singleLine="true"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:ellipsize="marquee"
+    android:textAppearance="@style/TextAppearance.Switch"
+    android:textColor="@android:color/white"
+    android:textAlignment="inherit"/>
diff --git a/res/layout/manage_applications_content.xml b/res/layout/manage_applications_content.xml
deleted file mode 100644
index 364a002..0000000
--- a/res/layout/manage_applications_content.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:background="@drawable/default_preference_background">
-
-    <android.support.v4.view.ViewPager
-            android:id="@+id/pager"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_weight="1">
-        <android.support.v4.view.PagerTabStrip
-                android:id="@+id/tabs"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="top"
-                android:textAppearance="@style/TextAppearance.PagerTabs"
-                android:padding="0dp">
-        </android.support.v4.view.PagerTabStrip>
-    </android.support.v4.view.ViewPager>
-
-</LinearLayout>
diff --git a/res/menu/manage_apps.xml b/res/menu/manage_apps.xml
new file mode 100644
index 0000000..577e981
--- /dev/null
+++ b/res/menu/manage_apps.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/advanced"
+        android:title="@string/advanced_apps"
+        android:icon="@drawable/ic_settings_24dp"
+        android:showAsAction="collapseActionView|ifRoom" />
+</menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c202a89..be27f83 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5626,6 +5626,8 @@
     <string name="keywords_accounts">account</string>
     <string name="keywords_users">restriction restrict restricted</string>
     <string name="keywords_keyboard_and_ime">text correction correct sound vibrate auto language gesture suggest suggestion theme offensive word type emoji international</string>
+    <string name="keywords_reset_apps">reset preferences default</string>
+    <string name="keywords_all_apps">apps download applications system</string>
     <!-- Search keywords for different screen unlock modes : slide to unlock, password, pattern and PIN [CHAR LIMIT=none] -->
     <string name="keywords_lockscreen">slide password pattern pin</string>
 
@@ -6088,10 +6090,29 @@
        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> permissions granted</item>
    </plurals>
 
-   <!-- Launch defaults preference summary with some set [CHAR LIMIT=40] -->
-   <string name="launch_defaults_some">Some defaults set</string>
-   <!-- Launch defaults preference summary with none set [CHAR LIMIT=40] -->
-   <string name="launch_defaults_none">No defaults set</string>
+    <!-- Launch defaults preference summary with some set [CHAR LIMIT=40] -->
+    <string name="launch_defaults_some">Some defaults set</string>
+    <!-- Launch defaults preference summary with none set [CHAR LIMIT=40] -->
+    <string name="launch_defaults_none">No defaults set</string>
+
+    <!-- Label for showing all apps in list [CHAR LIMIT=30] -->
+    <string name="filter_all_apps">All apps</string>
+    <!-- Label for showing enabled apps in list [CHAR LIMIT=30] -->
+    <string name="filter_enabled_apps">Enabled</string>
+    <!-- Label for showing personal apps in list [CHAR LIMIT=30] -->
+    <string name="filter_personal_apps">Personal</string>
+    <!-- Label for showing work apps in list [CHAR LIMIT=30] -->
+    <string name="filter_work_apps">Work</string>
+
+    <!-- Description for advanced menu option to reset app preferences [CHAR LIMIT=NONE] -->
+    <string name="reset_app_preferences_description">Reset preferences across all apps to defaults</string>
+
+    <!-- Description of settings item that leads to list of all apps
+         [CHAR LIMIT=NONE] -->
+    <string name="all_apps_summary"><xliff:g id="count" example="10">%d</xliff:g> apps installed, including system and downloaded apps</string>
+
+    <!-- Title for advanced application management settings [CHAR LIMIT=30] -->
+    <string name="advanced_apps">Advanced</string>
 
    <!-- Warning toast shown when data usage screen can't find specified app -->
    <string name="unknown_app">Unknown app</string>
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
new file mode 100644
index 0000000..a6cec13
--- /dev/null
+++ b/res/xml/advanced_apps.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+    android:key="applications_settings">
+
+    <PreferenceScreen
+        android:key="all_apps"
+        android:fragment="com.android.settings.applications.ManageApplications"
+        android:title="@string/filter_all_apps"
+        settings:keywords="@string/keywords_all_apps">
+        <extra
+            android:name="classname"
+            android:value="com.android.settings.Settings$AllApplicationsActivity" />
+    </PreferenceScreen>
+
+    <Preference
+        android:key="reset_all"
+        android:title="@string/reset_app_preferences"
+        android:summary="@string/reset_app_preferences_description"
+        settings:keywords="@string/keywords_reset_apps" />
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index b16fe81..20ce116 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -47,6 +47,7 @@
     public static class DeviceInfoSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ApplicationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ManageApplicationsActivity extends SettingsActivity { /* empty */ }
+    public static class AllApplicationsActivity extends SettingsActivity { /* empty */ }
     public static class AppOpsSummaryActivity extends SettingsActivity {
         @Override
         public boolean isValidFragment(String className) {
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
new file mode 100644
index 0000000..6692d6b
--- /dev/null
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.applications;
+
+import static android.net.NetworkPolicyManager.POLICY_NONE;
+import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
+
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.AppOpsManager;
+import android.app.INotificationManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.net.NetworkPolicyManager;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.applications.ApplicationsState.AppEntry;
+import com.android.settings.applications.ApplicationsState.Callbacks;
+import com.android.settings.applications.ApplicationsState.Session;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AdvancedAppSettings extends SettingsPreferenceFragment implements Callbacks,
+        DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
+
+    static final String TAG = "AdvancedAppSettings";
+    static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    private static final String KEY_ALL_APPS = "all_apps";
+    private static final String KEY_RESET_ALL = "reset_all";
+    private static final String EXTRA_RESET_DIALOG = "resetDialog";
+
+    private ApplicationsState mApplicationsState;
+    private Session mSession;
+    private Preference mAllApps;
+    private Preference mResetAll;
+
+    AlertDialog mResetDialog;
+
+    private boolean mActivityResumed;
+    private PackageManager mPm;
+    private IPackageManager mIPm;
+    private INotificationManager mNm;
+    private NetworkPolicyManager mNpm;
+    private AppOpsManager mAom;
+    private Handler mHandler;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        addPreferencesFromResource(R.xml.advanced_apps);
+
+        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
+        mSession = mApplicationsState.newSession(this);
+
+        mAllApps = findPreference(KEY_ALL_APPS);
+        mResetAll = findPreference(KEY_RESET_ALL);
+        mResetAll.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+            @Override
+            public boolean onPreferenceClick(Preference preference) {
+                buildResetDialog();
+                return true;
+            }
+        });
+        updateAllAppsSummary();
+
+        mPm = getActivity().getPackageManager();
+        mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+        mNm = INotificationManager.Stub.asInterface(
+                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+        mNpm = NetworkPolicyManager.from(getActivity());
+        mAom = (AppOpsManager)getActivity().getSystemService(Context.APP_OPS_SERVICE);
+        mHandler = new Handler(getActivity().getMainLooper());
+    }
+
+    private void updateAllAppsSummary() {
+        mAllApps.setSummary(getString(R.string.all_apps_summary, mSession.getAllApps().size()));
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
+            buildResetDialog();
+        }
+
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        if (mResetDialog != null) {
+            mResetDialog.dismiss();
+            mResetDialog = null;
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        mActivityResumed = true;
+    }
+
+    @Override
+    public void onPause() {
+        mActivityResumed = false;
+        super.onPause();
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        if (mResetDialog != null) {
+            outState.putBoolean(EXTRA_RESET_DIALOG, true);
+        }
+    }
+
+    void buildResetDialog() {
+        if (mResetDialog == null) {
+            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+            builder.setTitle(R.string.reset_app_preferences_title);
+            builder.setMessage(R.string.reset_app_preferences_desc);
+            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
+            builder.setNegativeButton(R.string.cancel, null);
+            mResetDialog = builder.show();
+            mResetDialog.setOnDismissListener(this);
+        }
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        if (mResetDialog == dialog) {
+            mResetDialog = null;
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (mResetDialog == dialog) {
+            (new AsyncTask<Void, Void, Void>() {
+                @Override protected Void doInBackground(Void... params) {
+                    List<ApplicationInfo> apps = mPm.getInstalledApplications(
+                            PackageManager.GET_DISABLED_COMPONENTS);
+                    for (int i=0; i<apps.size(); i++) {
+                        ApplicationInfo app = apps.get(i);
+                        try {
+                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
+                            mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
+                        } catch (android.os.RemoteException ex) {
+                        }
+                        if (!app.enabled) {
+                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
+                            if (mPm.getApplicationEnabledSetting(app.packageName)
+                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+                                mPm.setApplicationEnabledSetting(app.packageName,
+                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+                                        PackageManager.DONT_KILL_APP);
+                            }
+                        }
+                    }
+                    try {
+                        mIPm.resetPreferredActivities(UserHandle.myUserId());
+                    } catch (RemoteException e) {
+                    }
+                    mAom.resetAllModes();
+                    final int[] restrictedUids = mNpm.getUidsWithPolicy(
+                            POLICY_REJECT_METERED_BACKGROUND);
+                    final int currentUserId = ActivityManager.getCurrentUser();
+                    for (int uid : restrictedUids) {
+                        // Only reset for current user
+                        if (UserHandle.getUserId(uid) == currentUserId) {
+                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
+                            mNpm.setUidPolicy(uid, POLICY_NONE);
+                        }
+                    }
+                    mHandler.post(new Runnable() {
+                        @Override public void run() {
+                            if (DEBUG) Log.v(TAG, "Done clearing");
+                            if (getActivity() != null && mActivityResumed) {
+                                if (DEBUG) Log.v(TAG, "Updating UI!");
+
+                            }
+                        }
+                    });
+                    return null;
+                }
+            }).execute();
+        }
+    }
+
+    @Override
+    public void onRunningStateChanged(boolean running) {
+        // No-op.
+    }
+
+    @Override
+    public void onPackageListChanged() {
+        updateAllAppsSummary();
+    }
+
+    @Override
+    public void onRebuildComplete(ArrayList<AppEntry> apps) {
+        // No-op.
+    }
+
+    @Override
+    public void onPackageIconChanged() {
+        // No-op.
+    }
+
+    @Override
+    public void onPackageSizeChanged(String packageName) {
+        // No-op.
+    }
+
+    @Override
+    public void onAllSizesComputed() {
+        // No-op.
+    }
+
+    @Override
+    public void onLauncherInfoChanged() {
+        // No-op.
+    }
+
+}
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 28f2925..b438051 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -180,6 +180,11 @@
     }
 
     @Override
+    public void onLauncherInfoChanged() {
+        // No op.
+    }
+
+    @Override
     public void onPackageListChanged() {
         refreshUi();
     }
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
index 3825296..51a15cf 100644
--- a/src/com/android/settings/applications/ApplicationsState.java
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -1,5 +1,6 @@
 package com.android.settings.applications;
 
+import android.app.ActivityManager;
 import android.app.AppGlobals;
 import android.app.Application;
 import android.content.BroadcastReceiver;
@@ -12,6 +13,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageStats;
 import android.content.pm.ParceledListSlice;
+import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Handler;
@@ -54,11 +56,12 @@
         public void onPackageIconChanged();
         public void onPackageSizeChanged(String packageName);
         public void onAllSizesComputed();
+        public void onLauncherInfoChanged();
     }
 
     public static interface AppFilter {
         public void init();
-        public boolean filterApp(ApplicationInfo info);
+        public boolean filterApp(AppEntry info);
     }
 
     static final int SIZE_UNKNOWN = -1;
@@ -90,7 +93,7 @@
         // for purposes of cleaning them up in the app details UI.
         long externalCacheSize;
     }
-    
+
     public static class AppEntry extends SizeInfo {
         final File apkFile;
         final long id;
@@ -100,7 +103,9 @@
         long externalSize;
 
         boolean mounted;
-        
+
+        boolean hasLauncherEntry;
+
         String getNormalizedLabel() {
             if (normalizedLabel != null) {
                 return normalizedLabel;
@@ -128,7 +133,7 @@
             this.sizeStale = true;
             ensureLabel(context);
         }
-        
+
         void ensureLabel(Context context) {
             if (this.label == null || !this.mounted) {
                 if (!this.apkFile.exists()) {
@@ -141,7 +146,7 @@
                 }
             }
         }
-        
+
         boolean ensureIconLocked(Context context, PackageManager pm) {
             if (this.icon == null) {
                 if (this.apkFile.exists()) {
@@ -175,13 +180,6 @@
         private final Collator sCollator = Collator.getInstance();
         @Override
         public int compare(AppEntry object1, AppEntry object2) {
-            final boolean normal1 = object1.info.enabled
-                    && (object1.info.flags&ApplicationInfo.FLAG_INSTALLED) != 0;
-            final boolean normal2 = object2.info.enabled
-                    && (object2.info.flags&ApplicationInfo.FLAG_INSTALLED) != 0;
-            if (normal1 != normal2) {
-                return normal1 ? -1 : 1;
-            }
             return sCollator.compare(object1.label, object2.label);
         }
     };
@@ -219,58 +217,105 @@
         }
     };
 
-    public static final AppFilter THIRD_PARTY_FILTER = new AppFilter() {
+    public static final AppFilter FILTER_PERSONAL = new AppFilter() {
+        private int mCurrentUser;
+
+        public void init() {
+            mCurrentUser = ActivityManager.getCurrentUser();
+        }
+
+        @Override
+        public boolean filterApp(AppEntry entry) {
+            return UserHandle.getUserId(entry.info.uid) == mCurrentUser;
+        }
+    };
+
+    public static final AppFilter FILTER_WORK = new AppFilter() {
+        private int mCurrentUser;
+
+        public void init() {
+            mCurrentUser = ActivityManager.getCurrentUser();
+        }
+
+        @Override
+        public boolean filterApp(AppEntry entry) {
+            return UserHandle.getUserId(entry.info.uid) != mCurrentUser;
+        }
+    };
+
+    public static final AppFilter FILTER_DOWNLOADED_AND_LAUNCHER = new AppFilter() {
         public void init() {
         }
-        
+
         @Override
-        public boolean filterApp(ApplicationInfo info) {
-            if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+        public boolean filterApp(AppEntry entry) {
+            if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
                 return true;
-            } else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+            } else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+                return true;
+            } else if (entry.hasLauncherEntry) {
                 return true;
             }
             return false;
         }
     };
 
-    public static final AppFilter ON_SD_CARD_FILTER = new AppFilter() {
+    public static final AppFilter FILTER_THIRD_PARTY = new AppFilter() {
+        public void init() {
+        }
+
+        @Override
+        public boolean filterApp(AppEntry entry) {
+            if ((entry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+                return true;
+            } else if ((entry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+                return true;
+            }
+            return false;
+        }
+    };
+
+    public static final AppFilter FILTER_ON_SD_CARD = new AppFilter() {
         final CanBeOnSdCardChecker mCanBeOnSdCardChecker
                 = new CanBeOnSdCardChecker();
-        
+
         public void init() {
             mCanBeOnSdCardChecker.init();
         }
-        
+
         @Override
-        public boolean filterApp(ApplicationInfo info) {
-            return mCanBeOnSdCardChecker.check(info);
+        public boolean filterApp(AppEntry entry) {
+            return mCanBeOnSdCardChecker.check(entry.info);
         }
     };
 
-    public static final AppFilter DISABLED_FILTER = new AppFilter() {
+    public static final AppFilter FILTER_DISABLED = new AppFilter() {
         public void init() {
         }
-        
+
         @Override
-        public boolean filterApp(ApplicationInfo info) {
-            if (!info.enabled) {
-                return true;
-            }
-            return false;
+        public boolean filterApp(AppEntry entry) {
+            return !entry.info.enabled;
         }
     };
 
-    public static final AppFilter ALL_ENABLED_FILTER = new AppFilter() {
+    public static final AppFilter FILTER_ALL_ENABLED = new AppFilter() {
         public void init() {
         }
-        
+
         @Override
-        public boolean filterApp(ApplicationInfo info) {
-            if (info.enabled) {
-                return true;
-            }
-            return false;
+        public boolean filterApp(AppEntry entry) {
+            return entry.info.enabled;
+        }
+    };
+
+    public static final AppFilter FILTER_EVERYTHING = new AppFilter() {
+        public void init() {
+        }
+
+        @Override
+        public boolean filterApp(AppEntry entry) {
+            return true;
         }
     };
 
@@ -398,6 +443,7 @@
         static final int MSG_PACKAGE_SIZE_CHANGED = 4;
         static final int MSG_ALL_SIZES_COMPUTED = 5;
         static final int MSG_RUNNING_STATE_CHANGED = 6;
+        static final int MSG_LAUNCHER_INFO_CHANGED = 7;
 
         @Override
         public void handleMessage(Message msg) {
@@ -436,6 +482,11 @@
                                 msg.arg1 != 0);
                     }
                 } break;
+                case MSG_LAUNCHER_INFO_CHANGED: {
+                    for (int i=0; i<mActiveSessions.size(); i++) {
+                        mActiveSessions.get(i).mCallbacks.onLauncherInfoChanged();
+                    }
+                } break;
             }
         }
     }
@@ -487,7 +538,7 @@
          * it keeps running and locking again it can prevent the main thread from
          * acquiring its lock for a long time...  sometimes even > 5 seconds
          * (leading to an ANR).
-         * 
+         *
          * Dalvik will promote a monitor to a "real" lock if it detects enough
          * contention on it.  It doesn't figure this out fast enough for us
          * here, though, so this little trick will force it to turn into a real
@@ -543,6 +594,12 @@
             }
         }
 
+        ArrayList<AppEntry> getAllApps() {
+            synchronized (mEntriesMap) {
+                return new ArrayList<>(mAppEntries);
+            }
+        }
+
         // Creates a new list of app entries with the given filter and comparator.
         ArrayList<AppEntry> rebuild(AppFilter filter, Comparator<AppEntry> comparator) {
             synchronized (mRebuildSync) {
@@ -600,22 +657,21 @@
             if (filter != null) {
                 filter.init();
             }
-            
-            List<ApplicationInfo> apps;
+
+            List<AppEntry> apps;
             synchronized (mEntriesMap) {
-                apps = new ArrayList<ApplicationInfo>(mApplications);
+                apps = new ArrayList<>(mAppEntries);
             }
 
             ArrayList<AppEntry> filteredApps = new ArrayList<AppEntry>();
             if (DEBUG) Log.i(TAG, "Rebuilding...");
             for (int i=0; i<apps.size(); i++) {
-                ApplicationInfo info = apps.get(i);
-                if (filter == null || filter.filterApp(info)) {
+                AppEntry entry = apps.get(i);
+                if (filter == null || filter.filterApp(entry)) {
                     synchronized (mEntriesMap) {
                         if (DEBUG_LOCKING) Log.v(TAG, "rebuild acquired lock");
-                        AppEntry entry = getEntryLocked(info);
                         entry.ensureLabel(mContext);
-                        if (DEBUG) Log.i(TAG, "Using " + info.packageName + ": " + entry);
+                        if (DEBUG) Log.i(TAG, "Using " + entry.info.packageName + ": " + entry);
                         filteredApps.add(entry);
                         if (DEBUG_LOCKING) Log.v(TAG, "rebuild releasing lock");
                     }
@@ -757,7 +813,7 @@
             return entry;
         }
     }
-    
+
     void ensureIcon(AppEntry entry) {
         if (entry.icon != null) {
             return;
@@ -766,7 +822,7 @@
             entry.ensureIconLocked(mContext, mPm);
         }
     }
-    
+
     void requestSize(String packageName, int userId) {
         if (DEBUG_LOCKING) Log.v(TAG, "requestSize about to acquire lock...");
         synchronized (mEntriesMap) {
@@ -790,7 +846,7 @@
         }
         return sum;
     }
-    
+
     int indexOfApplicationInfoLocked(String pkgName, int userId) {
         for (int i=mApplications.size()-1; i>=0; i--) {
             ApplicationInfo appInfo = mApplications.get(i);
@@ -962,6 +1018,7 @@
         static final int MSG_LOAD_ENTRIES = 2;
         static final int MSG_LOAD_ICONS = 3;
         static final int MSG_LOAD_SIZES = 4;
+        static final int MSG_LOAD_LAUNCHER = 5;
 
         boolean mRunning;
 
@@ -1074,9 +1131,40 @@
                     if (numDone >= 6) {
                         sendEmptyMessage(MSG_LOAD_ENTRIES);
                     } else {
-                        sendEmptyMessage(MSG_LOAD_ICONS);
+                        sendEmptyMessage(MSG_LOAD_LAUNCHER);
                     }
                 } break;
+                case MSG_LOAD_LAUNCHER: {
+                    Intent launchIntent = new Intent(Intent.ACTION_MAIN, null)
+                            .addCategory(Intent.CATEGORY_LAUNCHER);
+
+                    for (int i = 0; i < mEntriesMap.size(); i++) {
+                        int userId = mEntriesMap.keyAt(i);
+                        List<ResolveInfo> intents = mPm.queryIntentActivitiesAsUser(launchIntent,
+                                PackageManager.GET_DISABLED_COMPONENTS, userId);
+                        synchronized (mEntriesMap) {
+                            if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER acquired lock");
+                            HashMap<String, AppEntry> userEntries = mEntriesMap.valueAt(i);
+                            final int N = intents.size();
+                            for (int j = 0; j < N; j++) {
+                                String packageName = intents.get(j).activityInfo.packageName;
+                                AppEntry entry = userEntries.get(packageName);
+                                if (entry != null) {
+                                    entry.hasLauncherEntry = true;
+                                } else {
+                                    Log.w(TAG, "Cannot find pkg: " + packageName
+                                            + " on user " + userId);
+                                }
+                            }
+                            if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER releasing lock");
+                        }
+                    }
+
+                    if (!mMainHandler.hasMessages(MainHandler.MSG_LAUNCHER_INFO_CHANGED)) {
+                        mMainHandler.sendEmptyMessage(MainHandler.MSG_LAUNCHER_INFO_CHANGED);
+                    }
+                    sendEmptyMessage(MSG_LOAD_ICONS);
+                } break;
                 case MSG_LOAD_ICONS: {
                     int numDone = 0;
                     synchronized (mEntriesMap) {
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 555d18c..14d48c8 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -16,40 +16,22 @@
 
 package com.android.settings.applications;
 
-import static android.net.NetworkPolicyManager.POLICY_NONE;
-import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
-
 import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.app.AppOpsManager;
 import android.app.Fragment;
-import android.app.INotificationManager;
-import android.content.ComponentName;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.ServiceConnection;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.res.TypedArray;
-import android.net.NetworkPolicyManager;
 import android.net.Uri;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Environment;
-import android.os.Handler;
-import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.preference.PreferenceFrameLayout;
 import android.provider.Settings;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.PagerTabStrip;
-import android.support.v4.view.ViewPager;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -61,34 +43,35 @@
 import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.ArrayAdapter;
 import android.widget.BaseAdapter;
 import android.widget.Filter;
 import android.widget.Filterable;
 import android.widget.ListView;
 import android.widget.Spinner;
 
-import com.android.internal.app.IMediaContainerService;
 import com.android.internal.content.PackageHelper;
 import com.android.settings.R;
-import com.android.settings.Settings.RunningServicesActivity;
-import com.android.settings.Settings.StorageUseActivity;
+import com.android.settings.Settings.AllApplicationsActivity;
+import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
-import com.android.settings.deviceinfo.StorageMeasurement;
+import com.android.settings.applications.ApplicationsState.AppFilter;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Comparator;
-import java.util.List;
 
 final class CanBeOnSdCardChecker {
     final IPackageManager mPm;
     int mInstallLocation;
-    
+
     CanBeOnSdCardChecker() {
         mPm = IPackageManager.Stub.asInterface(
                 ServiceManager.getService("package"));
     }
-    
+
     void init() {
         try {
             mInstallLocation = mPm.getInstallLocation();
@@ -97,7 +80,7 @@
             return;
         }
     }
-    
+
     boolean check(ApplicationInfo info) {
         boolean canBe = false;
         if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
@@ -121,414 +104,407 @@
     }
 }
 
-interface AppClickListener {
-    void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
-            View view, int position, long id);
-}
-
 /**
  * Activity to pick an application that will be used to display installation information and
  * options to uninstall/delete user data for system applications. This activity
  * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
  * intent.
  */
-public class ManageApplications extends Fragment implements
-        AppClickListener, DialogInterface.OnClickListener, DialogInterface.OnDismissListener  {
+public class ManageApplications extends Fragment implements OnItemClickListener,
+        OnItemSelectedListener {
 
     static final String TAG = "ManageApplications";
-    static final boolean DEBUG = false;
+    static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
-    private static final String EXTRA_LIST_TYPE = "currentListType";
     private static final String EXTRA_SORT_ORDER = "sortOrder";
-    private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
-    private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
-    private static final String EXTRA_RESET_DIALOG = "resetDialog";
 
     // attributes used as keys when passing values to InstalledAppDetails activity
     public static final String APP_CHG = "chg";
 
     // constant value that can be used to check return code from sub activity.
     private static final int INSTALLED_APP_DETAILS = 1;
+    private static final int ADVANCED_SETTINGS = 2;
 
     public static final int SIZE_TOTAL = 0;
     public static final int SIZE_INTERNAL = 1;
     public static final int SIZE_EXTERNAL = 2;
 
+    // Filter options used for displayed list of applications
+    // The order which they appear is the order they will show when spinner is present.
+    public static final int FILTER_APPS_DOWNLOADED_AND_LAUNCHER = 0;
+    public static final int FILTER_APPS_ALL                     = 1;
+    public static final int FILTER_APPS_ENABLED                 = 2;
+    public static final int FILTER_APPS_DISABLED                = 3;
+    public static final int FILTER_APPS_PERSONAL                = 4;
+    public static final int FILTER_APPS_WORK                    = 5;
+
+    // This is the string labels for the filter modes above, the order must be kept in sync.
+    public static final int[] FILTER_LABELS = new int[] {
+        R.string.filter_all_apps,      // Downloaded and launcher, spinner not shown in this case
+        R.string.filter_all_apps,      // All apps
+        R.string.filter_enabled_apps,  // Enabled
+        R.string.filter_apps_disabled, // Disabled
+        R.string.filter_personal_apps, // Personal
+        R.string.filter_work_apps,     // Work
+    };
+    // This is the actual mapping to filters from FILTER_ constants above, the order must
+    // be kept in sync.
+    public static final AppFilter[] FILTERS = new AppFilter[] {
+        ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER, // Downloaded and launcher
+        ApplicationsState.FILTER_EVERYTHING,  // All apps
+        ApplicationsState.FILTER_ALL_ENABLED, // Enabled
+        ApplicationsState.FILTER_DISABLED,    // Disabled
+        ApplicationsState.FILTER_PERSONAL,    // Personal
+        ApplicationsState.FILTER_WORK,        // Work
+    };
+
     // sort order that can be changed through the menu can be sorted alphabetically
     // or size(descending)
     private static final int MENU_OPTIONS_BASE = 0;
-    // Filter options used for displayed list of applications
-    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
-    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
-    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
-    public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3;
-
-    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
-    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
-    public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
-    public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
-    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
+    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 1;
+    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 2;
+    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 3;
     // sort order
     private int mSortOrder = SORT_ORDER_ALPHA;
-    
+
     private ApplicationsState mApplicationsState;
 
-    public static class TabInfo implements OnItemClickListener {
-        public final ManageApplications mOwner;
-        public final ApplicationsState mApplicationsState;
-        public final CharSequence mLabel;
-        public final int mListType;
-        public final int mFilter;
-        public final AppClickListener mClickListener;
-        public final CharSequence mInvalidSizeStr;
-        public final CharSequence mComputingSizeStr;
-        private final Bundle mSavedInstanceState;
+    public int mListType;
+    public int mFilter;
 
-        public ApplicationsAdapter mApplications;
-        public LayoutInflater mInflater;
-        public View mRootView;
+    public ApplicationsAdapter mApplications;
 
-        private IMediaContainerService mContainerService;
+    private View mLoadingContainer;
 
-        private View mLoadingContainer;
+    private View mListContainer;
 
-        private View mListContainer;
-
-        // ListView used to display list
-        private ListView mListView;
-        // Custom view used to display running processes
-        private RunningProcessesView mRunningProcessesView;
-        
-        //private LinearColorBar mColorBar;
-        //private TextView mStorageChartLabel;
-        //private TextView mUsedStorageText;
-        //private TextView mFreeStorageText;
-        private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
-        private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
-
-        final Runnable mRunningProcessesAvail = new Runnable() {
-            public void run() {
-                handleRunningProcessesAvail();
-            }
-        };
-
-        public TabInfo(ManageApplications owner, ApplicationsState apps,
-                CharSequence label, int listType, AppClickListener clickListener,
-                Bundle savedInstanceState) {
-            mOwner = owner;
-            mApplicationsState = apps;
-            mLabel = label;
-            mListType = listType;
-            switch (listType) {
-                case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break;
-                case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break;
-                case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break;
-                default: mFilter = FILTER_APPS_ALL; break;
-            }
-            mClickListener = clickListener;
-            mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value);
-            mComputingSizeStr = owner.getActivity().getText(R.string.computing_size);
-            mSavedInstanceState = savedInstanceState;
-        }
-
-        public void setContainerService(IMediaContainerService containerService) {
-            mContainerService = containerService;
-            updateStorageUsage();
-        }
-
-        public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
-            if (mRootView != null) {
-                return mRootView;
-            }
-            mInflater = inflater;
-            mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING
-                    ? R.layout.manage_applications_running
-                    : R.layout.manage_applications_apps, null);
-            mLoadingContainer = mRootView.findViewById(R.id.loading_container);
-            mLoadingContainer.setVisibility(View.VISIBLE);
-            mListContainer = mRootView.findViewById(R.id.list_container);
-            if (mListContainer != null) {
-                // Create adapter and list view here
-                View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
-                ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
-                if (emptyView != null) {
-                    lv.setEmptyView(emptyView);
-                }
-                lv.setOnItemClickListener(this);
-                lv.setSaveEnabled(true);
-                lv.setItemsCanFocus(true);
-                lv.setTextFilterEnabled(true);
-                mListView = lv;
-                mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
-                mListView.setAdapter(mApplications);
-                mListView.setRecyclerListener(mApplications);
-                //mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
-                //mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
-                //mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
-                //mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
-                Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
-                if (mFilter == FILTER_APPS_SDCARD) {
-                    //mStorageChartLabel.setText(mOwner.getActivity().getText(
-                    //        R.string.sd_card_storage));
-                } else {
-                    //mStorageChartLabel.setText(mOwner.getActivity().getText(
-                    //        R.string.internal_storage));
-                }
-                applyCurrentStorage();
-            }
-            mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
-                    R.id.running_processes);
-            if (mRunningProcessesView != null) {
-                mRunningProcessesView.doCreate(mSavedInstanceState);
-            }
-
-            return mRootView;
-        }
-
-        public void detachView() {
-            if (mRootView != null) {
-                ViewGroup group = (ViewGroup)mRootView.getParent();
-                if (group != null) {
-                    group.removeView(mRootView);
-                }
-            }
-        }
-
-        public void resume(int sortOrder) {
-            if (mApplications != null) {
-                mApplications.resume(sortOrder);
-            }
-            if (mRunningProcessesView != null) {
-                boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail);
-                if (haveData) {
-                    mRunningProcessesView.setVisibility(View.VISIBLE);
-                    mLoadingContainer.setVisibility(View.INVISIBLE);
-                } else {
-                    mLoadingContainer.setVisibility(View.VISIBLE);
-                }
-            }
-        }
-
-        public void pause() {
-            if (mApplications != null) {
-                mApplications.pause();
-            }
-            if (mRunningProcessesView != null) {
-                mRunningProcessesView.doPause();
-            }
-        }
-
-        public void release() {
-            if (mApplications != null) {
-                mApplications.release();
-            }
-        }
-
-        void updateStorageUsage() {
-            // Make sure a callback didn't come at an inopportune time.
-            if (mOwner.getActivity() == null) return;
-            // Doesn't make sense for stuff that is not an app list.
-            if (mApplications == null) return;
-
-            mFreeStorage = 0;
-            mAppStorage = 0;
-            mTotalStorage = 0;
-
-            if (mFilter == FILTER_APPS_SDCARD) {
-                if (mContainerService != null) {
-                    try {
-                        final long[] stats = mContainerService.getFileSystemStats(
-                                Environment.getExternalStorageDirectory().getPath());
-                        mTotalStorage = stats[0];
-                        mFreeStorage = stats[1];
-                    } catch (RemoteException e) {
-                        Log.w(TAG, "Problem in container service", e);
-                    }
-                }
-
-                if (mApplications != null) {
-                    final int N = mApplications.getCount();
-                    for (int i=0; i<N; i++) {
-                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
-                        mAppStorage += ae.externalCodeSize + ae.externalDataSize
-                                + ae.externalCacheSize;
-                    }
-                }
-            } else {
-                if (mContainerService != null) {
-                    try {
-                        final long[] stats = mContainerService.getFileSystemStats(
-                                Environment.getDataDirectory().getPath());
-                        mTotalStorage = stats[0];
-                        mFreeStorage = stats[1];
-                    } catch (RemoteException e) {
-                        Log.w(TAG, "Problem in container service", e);
-                    }
-                }
-
-                final boolean emulatedStorage = Environment.isExternalStorageEmulated();
-                if (mApplications != null) {
-                    final int N = mApplications.getCount();
-                    for (int i=0; i<N; i++) {
-                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
-                        mAppStorage += ae.codeSize + ae.dataSize;
-                        if (emulatedStorage) {
-                            mAppStorage += ae.externalCodeSize + ae.externalDataSize;
-                        }
-                    }
-                }
-                mFreeStorage += mApplicationsState.sumCacheSizes();
-            }
-
-            applyCurrentStorage();
-        }
-
-        void applyCurrentStorage() {
-            // If view hierarchy is not yet created, no views to update.
-            if (mRootView == null) {
-                return;
-            }
-            /*
-            if (mTotalStorage > 0) {
-                BidiFormatter bidiFormatter = BidiFormatter.getInstance();
-                mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
-                        mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
-                long usedStorage = mTotalStorage - mFreeStorage;
-                if (mLastUsedStorage != usedStorage) {
-                    mLastUsedStorage = usedStorage;
-                    String sizeStr = bidiFormatter.unicodeWrap(
-                            Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage));
-                    mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
-                            R.string.service_foreground_processes, sizeStr));
-                }
-                if (mLastFreeStorage != mFreeStorage) {
-                    mLastFreeStorage = mFreeStorage;
-                    String sizeStr = bidiFormatter.unicodeWrap(
-                            Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage));
-                    mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
-                            R.string.service_background_processes, sizeStr));
-                }
-            } else {
-                mColorBar.setRatios(0, 0, 0);
-                if (mLastUsedStorage != -1) {
-                    mLastUsedStorage = -1;
-                    mUsedStorageText.setText("");
-                }
-                if (mLastFreeStorage != -1) {
-                    mLastFreeStorage = -1;
-                    mFreeStorageText.setText("");
-                }
-            }
-            */
-        }
-
-        @Override
-        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            mClickListener.onItemClick(this, parent, view, position, id);
-        }
-
-        void handleRunningProcessesAvail() {
-            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
-                    mOwner.getActivity(), android.R.anim.fade_out));
-            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
-                    mOwner.getActivity(), android.R.anim.fade_in));
-            mRunningProcessesView.setVisibility(View.VISIBLE);
-            mLoadingContainer.setVisibility(View.GONE);
-        }
-    }
-    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
-    private int mNumTabs;
-    TabInfo mCurTab = null;
+    // ListView used to display list
+    private ListView mListView;
 
     // Size resource used for packages whose size computation failed for some reason
     CharSequence mInvalidSizeStr;
-    private CharSequence mComputingSizeStr;
-    
+
     // layout inflater object used to inflate views
     private LayoutInflater mInflater;
-    
+
     private String mCurrentPkgName;
     private int mCurrentUid;
-    
+
     private Menu mOptionsMenu;
 
-    // These are for keeping track of activity and spinner switch state.
-    private boolean mActivityResumed;
+    public static final int LIST_TYPE_MAIN = 0;
+    public static final int LIST_TYPE_ALL = 1;
 
-    private static final int LIST_TYPE_MISSING = -1;
-    static final int LIST_TYPE_DOWNLOADED = 0;
-    static final int LIST_TYPE_RUNNING = 1;
-    static final int LIST_TYPE_SDCARD = 2;
-    static final int LIST_TYPE_ALL = 3;
-    static final int LIST_TYPE_DISABLED = 4;
-
-    private boolean mShowBackground = false;
-    
-    private int mDefaultListType = -1;
-
-    private ViewGroup mContentContainer;
     private View mRootView;
-    private ViewPager mViewPager;
-    private ViewGroup mPinnedHeader;
-    private Spinner mSpinner;
-    private Context mContext;
 
-    AlertDialog mResetDialog;
+    private View mSpinnerHeader;
+    private Spinner mFilterSpinner;
+    private FilterSpinnerAdapter mFilterAdapter;
 
-    class MyPagerAdapter extends PagerAdapter
-            implements ViewPager.OnPageChangeListener {
-        int mCurPos = 0;
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setHasOptionsMenu(true);
+        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
+
+        Intent intent = getActivity().getIntent();
+        String action = intent.getAction();
+        String className = getArguments() != null
+                ? getArguments().getString("classname") : null;
+        if (className == null) {
+            className = intent.getComponent().getClassName();
+        }
+        if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)
+                || className.equals(AllApplicationsActivity.class.getName())) {
+            mListType = LIST_TYPE_ALL;
+        } else {
+            mListType = LIST_TYPE_MAIN;
+        }
+        mFilter = getDefaultFilter();
+
+        if (savedInstanceState != null) {
+            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
+        }
+
+        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
+    }
+
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        // initialize the inflater
+        mInflater = inflater;
+
+        createHeader();
+
+        mRootView = inflater.inflate(R.layout.manage_applications_apps, null);
+        mLoadingContainer = mRootView.findViewById(R.id.loading_container);
+        mLoadingContainer.setVisibility(View.VISIBLE);
+        mListContainer = mRootView.findViewById(R.id.list_container);
+        if (mListContainer != null) {
+            // Create adapter and list view here
+            View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
+            ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
+            if (emptyView != null) {
+                lv.setEmptyView(emptyView);
+            }
+            lv.setOnItemClickListener(this);
+            lv.setSaveEnabled(true);
+            lv.setItemsCanFocus(true);
+            lv.setTextFilterEnabled(true);
+            mListView = lv;
+            mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
+            mListView.setAdapter(mApplications);
+            mListView.setRecyclerListener(mApplications);
+
+            Utils.prepareCustomPreferencesList(container, mRootView, mListView, false);
+        }
+
+        // We have to do this now because PreferenceFrameLayout looks at it
+        // only when the view is added.
+        if (container instanceof PreferenceFrameLayout) {
+            ((PreferenceFrameLayout.LayoutParams) mRootView.getLayoutParams()).removeBorders = true;
+        }
+
+        return mRootView;
+    }
+
+    private void createHeader() {
+        Activity activity = getActivity();
+        View content = activity.findViewById(R.id.main_content);
+        ViewGroup contentParent = (ViewGroup) content.getParent();
+        mSpinnerHeader = (ViewGroup) activity.getLayoutInflater()
+                .inflate(R.layout.apps_filter_spinner, contentParent, false);
+        mFilterSpinner = (Spinner) mSpinnerHeader.findViewById(R.id.filter_spinner);
+        mFilterAdapter = new FilterSpinnerAdapter(this);
+        mFilterSpinner.setAdapter(mFilterAdapter);
+        mFilterSpinner.setOnItemSelectedListener(this);
+        contentParent.addView(mSpinnerHeader, 0);
+
+        mFilterAdapter.enableFilter(getDefaultFilter());
+        if (mListType != LIST_TYPE_MAIN) {
+            if (UserManager.get(getActivity()).getUserProfiles().size() > 1) {
+                mFilterAdapter.enableFilter(FILTER_APPS_PERSONAL);
+                mFilterAdapter.enableFilter(FILTER_APPS_WORK);
+            }
+        }
+    }
+
+    private int getDefaultFilter() {
+        if (mListType == LIST_TYPE_MAIN) {
+            return FILTER_APPS_DOWNLOADED_AND_LAUNCHER;
+        }
+        return FILTER_APPS_ALL;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        updateView();
+        updateOptionsMenu();
+        if (mApplications != null) {
+            mApplications.resume(mSortOrder);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (mApplications != null) {
+            mApplications.pause();
+        }
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        if (mApplications != null) {
+            mApplications.release();
+        }
+        mRootView = null;
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
+            mApplicationsState.requestSize(mCurrentPkgName, UserHandle.getUserId(mCurrentUid));
+        }
+    }
+
+    // utility method used to start sub activity
+    private void startApplicationDetailsActivity() {
+        // TODO: Figure out if there is a way where we can spin up the profile's settings
+        // process ahead of time, to avoid a long load of data when user clicks on a managed app.
+        // Maybe when they load the list of apps that contains managed profile apps.
+        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+        intent.setData(Uri.fromParts("package", mCurrentPkgName, null));
+        getActivity().startActivityAsUser(intent,
+                new UserHandle(UserHandle.getUserId(mCurrentUid)));
+    }
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        mOptionsMenu = menu;
+        if (mListType == LIST_TYPE_MAIN) {
+            // Only show advanced options when in the main app list (from dashboard).
+            inflater.inflate(R.menu.manage_apps, menu);
+        }
+        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
+                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
+                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        updateOptionsMenu();
+    }
+
+    @Override
+    public void onPrepareOptionsMenu(Menu menu) {
+        updateOptionsMenu();
+    }
+
+    @Override
+    public void onDestroyOptionsMenu() {
+        mOptionsMenu = null;
+    }
+
+    void updateOptionsMenu() {
+        if (mOptionsMenu == null) {
+            return;
+        }
+
+        if (mListType != LIST_TYPE_MAIN) {
+            // Allow sorting except on main apps list.
+            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
+            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
+        } else {
+            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
+            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        int menuId = item.getItemId();
+        switch(item.getItemId()) {
+            case SORT_ORDER_ALPHA:
+            case SORT_ORDER_SIZE:
+                mSortOrder = menuId;
+                if (mApplications != null) {
+                    mApplications.rebuild(mSortOrder);
+                }
+                break;
+            case R.id.advanced:
+                ((SettingsActivity) getActivity()).startPreferencePanel(
+                        AdvancedAppSettings.class.getName(), null, R.string.advanced_apps,
+                        null, this, ADVANCED_SETTINGS);
+                return true;
+            default:
+                // Handle the home button
+                return false;
+        }
+        updateOptionsMenu();
+        return true;
+    }
+
+    @Override
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        if (mApplications != null && mApplications.getCount() > position) {
+            ApplicationsState.AppEntry entry = mApplications.getAppEntry(position);
+            mCurrentPkgName = entry.info.packageName;
+            mCurrentUid = entry.info.uid;
+            startApplicationDetailsActivity();
+        }
+    }
+
+    @Override
+    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+        mApplications.setFilter(mFilterAdapter.getFilter(position));
+    }
+
+    @Override
+    public void onNothingSelected(AdapterView<?> parent) {
+    }
+
+    public void updateView() {
+        updateOptionsMenu();
+        final Activity host = getActivity();
+        if (host != null) {
+            host.invalidateOptionsMenu();
+        }
+    }
+
+    public void setHasDisabled(boolean hasDisabledApps) {
+        if (mListType == LIST_TYPE_MAIN) {
+            // No filtering on main app list.
+            return;
+        }
+        if (hasDisabledApps) {
+            mFilterAdapter.enableFilter(FILTER_APPS_ENABLED);
+            mFilterAdapter.enableFilter(FILTER_APPS_DISABLED);
+        } else {
+            mFilterAdapter.disableFilter(FILTER_APPS_ENABLED);
+            mFilterAdapter.disableFilter(FILTER_APPS_DISABLED);
+        }
+    }
+
+    static class FilterSpinnerAdapter extends ArrayAdapter<CharSequence> {
+
+        private final ManageApplications mManageApplications;
+
+        // Use ArrayAdapter for view logic, but have our own list for managing
+        // the options available.
+        private final ArrayList<Integer> mFilterOptions = new ArrayList<>();
+
+        public FilterSpinnerAdapter(ManageApplications manageApplications) {
+            super(manageApplications.getActivity(), R.layout.filter_spinner_item);
+            setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+            mManageApplications = manageApplications;
+        }
+
+        public int getFilter(int position) {
+            return mFilterOptions.get(position);
+        }
+
+        public void enableFilter(int filter) {
+            if (mFilterOptions.contains(filter)) return;
+            mFilterOptions.add(filter);
+            Collections.sort(mFilterOptions);
+            mManageApplications.mSpinnerHeader.setVisibility(
+                    mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
+            notifyDataSetChanged();
+        }
+
+        public void disableFilter(int filter) {
+            if (!mFilterOptions.remove((Integer) filter)) {
+                return;
+            }
+            Collections.sort(mFilterOptions);
+            mManageApplications.mSpinnerHeader.setVisibility(
+                    mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
+            notifyDataSetChanged();
+        }
 
         @Override
         public int getCount() {
-            return mNumTabs;
-        }
-        
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            TabInfo tab = mTabs.get(position);
-            View root = tab.build(mInflater, mContentContainer, mRootView);
-            container.addView(root);
-            root.setTag(R.id.name, tab);
-            return root;
+            return mFilterOptions.size();
         }
 
         @Override
-        public void destroyItem(ViewGroup container, int position, Object object) {
-            container.removeView((View)object);
+        public CharSequence getItem(int position) {
+            return getFilterString(mFilterOptions.get(position));
         }
 
-        @Override
-        public boolean isViewFromObject(View view, Object object) {
-            return view == object;
+        private CharSequence getFilterString(int filter) {
+            return mManageApplications.getString(FILTER_LABELS[filter]);
         }
 
-        @Override
-        public int getItemPosition(Object object) {
-            return super.getItemPosition(object);
-            //return ((TabInfo)((View)object).getTag(R.id.name)).mListType;
-        }
-
-        @Override
-        public CharSequence getPageTitle(int position) {
-            return mTabs.get(position).mLabel;
-        }
-
-        @Override
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        }
-
-        @Override
-        public void onPageSelected(int position) {
-            mCurPos = position;
-        }
-
-        @Override
-        public void onPageScrollStateChanged(int state) {
-            if (state == ViewPager.SCROLL_STATE_IDLE) {
-                updateCurrentTab(mCurPos);
-            }
-        }
     }
 
     /*
@@ -544,15 +520,14 @@
             ApplicationsState.Callbacks, AbsListView.RecyclerListener {
         private final ApplicationsState mState;
         private final ApplicationsState.Session mSession;
-        private final TabInfo mTab;
+        private final ManageApplications mManageApplications;
         private final Context mContext;
         private final ArrayList<View> mActive = new ArrayList<View>();
-        private final int mFilterMode;
+        private int mFilterMode;
         private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
         private ArrayList<ApplicationsState.AppEntry> mEntries;
         private boolean mResumed;
         private int mLastSortMode=-1;
-        private boolean mWaitingForData;
         private int mWhichSize = SIZE_TOTAL;
         CharSequence mCurFilterPrefix;
 
@@ -568,22 +543,28 @@
             }
 
             @Override
+            @SuppressWarnings("unchecked")
             protected void publishResults(CharSequence constraint, FilterResults results) {
                 mCurFilterPrefix = constraint;
-                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
+                mEntries = (ArrayList<ApplicationsState.AppEntry>) results.values;
                 notifyDataSetChanged();
-                mTab.updateStorageUsage();
             }
         };
 
-        public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) {
+        public ApplicationsAdapter(ApplicationsState state, ManageApplications manageApplications,
+                int filterMode) {
             mState = state;
             mSession = state.newSession(this);
-            mTab = tab;
-            mContext = tab.mOwner.getActivity();
+            mManageApplications = manageApplications;
+            mContext = manageApplications.getActivity();
             mFilterMode = filterMode;
         }
 
+        public void setFilter(int filter) {
+            mFilterMode = filter;
+            rebuild(true);
+        }
+
         public void resume(int sort) {
             if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
             if (!mResumed) {
@@ -614,7 +595,7 @@
             mLastSortMode = sort;
             rebuild(true);
         }
-        
+
         public void rebuild(boolean eraseold) {
             if (DEBUG) Log.i(TAG, "Rebuilding app list...");
             ApplicationsState.AppFilter filterObj;
@@ -625,23 +606,7 @@
             } else {
                 mWhichSize = SIZE_INTERNAL;
             }
-            switch (mFilterMode) {
-                case FILTER_APPS_THIRD_PARTY:
-                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
-                    break;
-                case FILTER_APPS_SDCARD:
-                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
-                    if (!emulated) {
-                        mWhichSize = SIZE_EXTERNAL;
-                    }
-                    break;
-                case FILTER_APPS_DISABLED:
-                    filterObj = ApplicationsState.DISABLED_FILTER;
-                    break;
-                default:
-                    filterObj = ApplicationsState.ALL_ENABLED_FILTER;
-                    break;
-            }
+            filterObj = FILTERS[mFilterMode];
             switch (mLastSortMode) {
                 case SORT_ORDER_SIZE:
                     switch (mWhichSize) {
@@ -673,16 +638,26 @@
                 mEntries = null;
             }
             notifyDataSetChanged();
-            mTab.updateStorageUsage();
 
             if (entries == null) {
-                mWaitingForData = true;
-                mTab.mListContainer.setVisibility(View.INVISIBLE);
-                mTab.mLoadingContainer.setVisibility(View.VISIBLE);
+                mManageApplications.mListContainer.setVisibility(View.INVISIBLE);
+                mManageApplications.mLoadingContainer.setVisibility(View.VISIBLE);
             } else {
-                mTab.mListContainer.setVisibility(View.VISIBLE);
-                mTab.mLoadingContainer.setVisibility(View.GONE);
+                mManageApplications.mListContainer.setVisibility(View.VISIBLE);
+                mManageApplications.mLoadingContainer.setVisibility(View.GONE);
             }
+
+            mManageApplications.setHasDisabled(hasDisabledApps());
+        }
+
+        private boolean hasDisabledApps() {
+            ArrayList<AppEntry> allApps = mSession.getAllApps();
+            for (int i = 0; i < allApps.size(); i++) {
+                if (!allApps.get(i).info.enabled) {
+                    return true;
+                }
+            }
+            return false;
         }
 
         ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
@@ -707,24 +682,22 @@
 
         @Override
         public void onRunningStateChanged(boolean running) {
-            mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running);
+            mManageApplications.getActivity().setProgressBarIndeterminateVisibility(running);
         }
 
         @Override
         public void onRebuildComplete(ArrayList<AppEntry> apps) {
-            if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) {
-                mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
+            if (mManageApplications.mLoadingContainer.getVisibility() == View.VISIBLE) {
+                mManageApplications.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
                         mContext, android.R.anim.fade_out));
-                mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation(
+                mManageApplications.mListContainer.startAnimation(AnimationUtils.loadAnimation(
                         mContext, android.R.anim.fade_in));
             }
-            mTab.mListContainer.setVisibility(View.VISIBLE);
-            mTab.mLoadingContainer.setVisibility(View.GONE);
-            mWaitingForData = false;
+            mManageApplications.mListContainer.setVisibility(View.VISIBLE);
+            mManageApplications.mLoadingContainer.setVisibility(View.GONE);
             mBaseEntries = apps;
             mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
             notifyDataSetChanged();
-            mTab.updateStorageUsage();
         }
 
         @Override
@@ -744,9 +717,9 @@
                 AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
                 if (holder.entry.info.packageName.equals(packageName)) {
                     synchronized (holder.entry) {
-                        holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
+                        holder.updateSizeText(mManageApplications.mInvalidSizeStr, mWhichSize);
                     }
-                    if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName)
+                    if (holder.entry.info.packageName.equals(mManageApplications.mCurrentPkgName)
                             && mLastSortMode == SORT_ORDER_SIZE) {
                         // We got the size information for the last app the
                         // user viewed, and are sorting by size...  they may
@@ -754,28 +727,33 @@
                         // the list with the new size to reflect it to the user.
                         rebuild(false);
                     }
-                    mTab.updateStorageUsage();
                     return;
                 }
             }
         }
 
         @Override
+        public void onLauncherInfoChanged() {
+            if (mFilterMode == FILTER_APPS_DOWNLOADED_AND_LAUNCHER) {
+                rebuild(false);
+            }
+        }
+
+        @Override
         public void onAllSizesComputed() {
             if (mLastSortMode == SORT_ORDER_SIZE) {
                 rebuild(false);
             }
-            mTab.updateStorageUsage();
         }
-        
+
         public int getCount() {
             return mEntries != null ? mEntries.size() : 0;
         }
-        
+
         public Object getItem(int position) {
             return mEntries.get(position);
         }
-        
+
         public ApplicationsState.AppEntry getAppEntry(int position) {
             return mEntries.get(position);
         }
@@ -783,11 +761,12 @@
         public long getItemId(int position) {
             return mEntries.get(position).id;
         }
-        
+
         public View getView(int position, View convertView, ViewGroup parent) {
             // A ViewHolder keeps references to children views to avoid unnecessary calls
             // to findViewById() on each row.
-            AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView);
+            AppViewHolder holder = AppViewHolder.createOrRecycle(mManageApplications.mInflater,
+                    convertView);
             convertView = holder.rootView;
 
             // Bind the data efficiently with the holder
@@ -801,7 +780,7 @@
                 if (entry.icon != null) {
                     holder.appIcon.setImageDrawable(entry.icon);
                 }
-                holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
+                holder.updateSizeText(mManageApplications.mInvalidSizeStr, mWhichSize);
                 if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
                     holder.disabled.setVisibility(View.VISIBLE);
                     holder.disabled.setText(R.string.not_installed);
@@ -811,13 +790,7 @@
                 } else {
                     holder.disabled.setVisibility(View.GONE);
                 }
-                if (mFilterMode == FILTER_APPS_SDCARD) {
-                    holder.checkBox.setVisibility(View.VISIBLE);
-                    holder.checkBox.setChecked((entry.info.flags
-                            & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
-                } else {
-                    holder.checkBox.setVisibility(View.GONE);
-                }
+                holder.checkBox.setVisibility(View.GONE);
             }
             mActive.remove(convertView);
             mActive.add(convertView);
@@ -834,463 +807,4 @@
             mActive.remove(view);
         }
     }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setHasOptionsMenu(true);
-
-        mContext = getActivity();
-        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
-        Intent intent = getActivity().getIntent();
-        String action = intent.getAction();
-        int defaultListType = LIST_TYPE_DOWNLOADED;
-        String className = getArguments() != null
-                ? getArguments().getString("classname") : null;
-        if (className == null) {
-            className = intent.getComponent().getClassName();
-        }
-        if (className.equals(RunningServicesActivity.class.getName())
-                || className.endsWith(".RunningServices")) {
-            defaultListType = LIST_TYPE_RUNNING;
-        } else if (className.equals(StorageUseActivity.class.getName())
-                || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action)
-                || className.endsWith(".StorageUse")) {
-            mSortOrder = SORT_ORDER_SIZE;
-            defaultListType = LIST_TYPE_ALL;
-        } else if (android.provider.Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) {
-            // Select the all-apps list, with the default sorting
-            defaultListType = LIST_TYPE_ALL;
-        }
-
-        if (savedInstanceState != null) {
-            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
-            int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1);
-            if (tmp != -1) defaultListType = tmp;
-            mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false);
-        }
-
-        mDefaultListType = defaultListType;
-
-        final Intent containerIntent = new Intent().setComponent(
-                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
-        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
-
-        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
-        mComputingSizeStr = getActivity().getText(R.string.computing_size);
-
-        TabInfo tab = new TabInfo(this, mApplicationsState,
-                getActivity().getString(R.string.filter_apps_third_party),
-                LIST_TYPE_DOWNLOADED, this, savedInstanceState);
-        mTabs.add(tab);
-
-        if (!Environment.isExternalStorageEmulated()) {
-            tab = new TabInfo(this, mApplicationsState,
-                    getActivity().getString(R.string.filter_apps_onsdcard),
-                    LIST_TYPE_SDCARD, this, savedInstanceState);
-            mTabs.add(tab);
-        }
-
-        tab = new TabInfo(this, mApplicationsState,
-                getActivity().getString(R.string.filter_apps_running),
-                LIST_TYPE_RUNNING, this, savedInstanceState);
-        mTabs.add(tab);
-
-        tab = new TabInfo(this, mApplicationsState,
-                getActivity().getString(R.string.filter_apps_all),
-                LIST_TYPE_ALL, this, savedInstanceState);
-        mTabs.add(tab);
-
-        tab = new TabInfo(this, mApplicationsState,
-                getActivity().getString(R.string.filter_apps_disabled),
-                LIST_TYPE_DISABLED, this, savedInstanceState);
-        mTabs.add(tab);
-
-        mNumTabs = mTabs.size();
-    }
-
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        // initialize the inflater
-        mInflater = inflater;
-
-        View rootView = mInflater.inflate(R.layout.manage_applications_content,
-                container, false);
-        mContentContainer = container;
-        mRootView = rootView;
-        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
-        MyPagerAdapter adapter = new MyPagerAdapter();
-        mViewPager.setAdapter(adapter);
-        mViewPager.setOnPageChangeListener(adapter);
-        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
-
-        // This should be set in the XML layout, but PagerTabStrip lives in
-        // support-v4 and doesn't have styleable attributes.
-        final TypedArray ta = tabs.getContext().obtainStyledAttributes(
-                new int[] { android.R.attr.colorAccent });
-        final int colorAccent = ta.getColor(0, 0);
-        ta.recycle();
-
-        tabs.setTabIndicatorColorResource(colorAccent);
-
-        // We have to do this now because PreferenceFrameLayout looks at it
-        // only when the view is added.
-        if (container instanceof PreferenceFrameLayout) {
-            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
-        }
-
-        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
-            buildResetDialog();
-        }
-
-        if (savedInstanceState == null) {
-            // First time init: make sure view pager is showing the correct tab.
-            int extraCurrentListType = getActivity().getIntent().getIntExtra(EXTRA_LIST_TYPE,
-                    LIST_TYPE_MISSING);
-            int currentListType = (extraCurrentListType != LIST_TYPE_MISSING)
-                    ? extraCurrentListType : mDefaultListType;
-            for (int i = 0; i < mNumTabs; i++) {
-                TabInfo tab = mTabs.get(i);
-                if (tab.mListType == currentListType) {
-                    mViewPager.setCurrentItem(i);
-                    break;
-                }
-            }
-        }
-
-        return rootView;
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        mActivityResumed = true;
-        updateCurrentTab(mViewPager.getCurrentItem());
-        updateNumTabs();
-        updateOptionsMenu();
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
-        if (mDefaultListType != -1) {
-            outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
-        }
-        outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
-        if (mResetDialog != null) {
-            outState.putBoolean(EXTRA_RESET_DIALOG, true);
-        }
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mActivityResumed = false;
-        for (int i=0; i<mTabs.size(); i++) {
-            mTabs.get(i).pause();
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        if (mResetDialog != null) {
-            mResetDialog.dismiss();
-            mResetDialog = null;
-        }
-    }
-
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-
-        // We are going to keep the tab data structures around, but they
-        // are no longer attached to their view hierarchy.
-        for (int i=0; i<mTabs.size(); i++) {
-            mTabs.get(i).detachView();
-            mTabs.get(i).release();
-        }
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
-            mApplicationsState.requestSize(mCurrentPkgName, UserHandle.getUserId(mCurrentUid));
-        }
-    }
-
-    private void updateNumTabs() {
-        int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1);
-        if (newNum != mNumTabs) {
-            mNumTabs = newNum;
-            if (mViewPager != null) {
-                mViewPager.getAdapter().notifyDataSetChanged();
-            }
-        }
-    }
-
-    TabInfo tabForType(int type) {
-        for (int i = 0; i < mTabs.size(); i++) {
-            TabInfo tab = mTabs.get(i);
-            if (tab.mListType == type) {
-                return tab;
-            }
-        }
-        return null;
-    }
-
-    // utility method used to start sub activity
-    private void startApplicationDetailsActivity() {
-        // TODO: Figure out if there is a way where we can spin up the profile's settings
-        // process ahead of time, to avoid a long load of data when user clicks on a managed app.
-        // Maybe when they load the list of apps that contains managed profile apps.
-        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
-        intent.setData(Uri.fromParts("package", mCurrentPkgName, null));
-        getActivity().startActivityAsUser(intent,
-                new UserHandle(UserHandle.getUserId(mCurrentUid)));
-    }
-    
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        mOptionsMenu = menu;
-        // note: icons removed for now because the cause the new action
-        // bar UI to be very confusing.
-        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
-                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
-                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-        menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-        menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        updateOptionsMenu();
-    }
-    
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        updateOptionsMenu();
-    }
-    
-    @Override
-    public void onDestroyOptionsMenu() {
-        mOptionsMenu = null;
-    }
-
-    @Override
-    public void onDestroy() {
-        getActivity().unbindService(mContainerConnection);
-        super.onDestroy();
-    }
-
-    void updateOptionsMenu() {
-        if (mOptionsMenu == null) {
-            return;
-        }
-        
-        /*
-         * The running processes screen doesn't use the mApplicationsAdapter
-         * so bringing up this menu in that case doesn't make any sense.
-         */
-        if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) {
-            TabInfo tab = tabForType(LIST_TYPE_RUNNING);
-            boolean showingBackground = tab != null && tab.mRunningProcessesView != null
-                    ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false;
-            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
-            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
-            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
-            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
-            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
-            mShowBackground = showingBackground;
-        } else {
-            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
-            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
-            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
-            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
-            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
-        }
-    }
-
-    void buildResetDialog() {
-        if (mResetDialog == null) {
-            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-            builder.setTitle(R.string.reset_app_preferences_title);
-            builder.setMessage(R.string.reset_app_preferences_desc);
-            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
-            builder.setNegativeButton(R.string.cancel, null);
-            mResetDialog = builder.show();
-            mResetDialog.setOnDismissListener(this);
-        }
-    }
-
-    @Override
-    public void onDismiss(DialogInterface dialog) {
-        if (mResetDialog == dialog) {
-            mResetDialog = null;
-        }
-    }
-
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (mResetDialog == dialog) {
-            final PackageManager pm = getActivity().getPackageManager();
-            final IPackageManager mIPm = IPackageManager.Stub.asInterface(
-                    ServiceManager.getService("package"));
-            final INotificationManager nm = INotificationManager.Stub.asInterface(
-                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
-            final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
-            final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService(
-                    Context.APP_OPS_SERVICE);
-            final Handler handler = new Handler(getActivity().getMainLooper());
-            (new AsyncTask<Void, Void, Void>() {
-                @Override protected Void doInBackground(Void... params) {
-                    List<ApplicationInfo> apps = pm.getInstalledApplications(
-                            PackageManager.GET_DISABLED_COMPONENTS);
-                    for (int i=0; i<apps.size(); i++) {
-                        ApplicationInfo app = apps.get(i);
-                        try {
-                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
-                            nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
-                        } catch (android.os.RemoteException ex) {
-                        }
-                        if (!app.enabled) {
-                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
-                            if (pm.getApplicationEnabledSetting(app.packageName)
-                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
-                                pm.setApplicationEnabledSetting(app.packageName,
-                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
-                                        PackageManager.DONT_KILL_APP);
-                            }
-                        }
-                    }
-                    try {
-                        mIPm.resetPreferredActivities(UserHandle.myUserId());
-                    } catch (RemoteException e) {
-                    }
-                    aom.resetAllModes();
-                    final int[] restrictedUids = npm.getUidsWithPolicy(
-                            POLICY_REJECT_METERED_BACKGROUND);
-                    final int currentUserId = ActivityManager.getCurrentUser();
-                    for (int uid : restrictedUids) {
-                        // Only reset for current user
-                        if (UserHandle.getUserId(uid) == currentUserId) {
-                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
-                            npm.setUidPolicy(uid, POLICY_NONE);
-                        }
-                    }
-                    handler.post(new Runnable() {
-                        @Override public void run() {
-                            if (DEBUG) Log.v(TAG, "Done clearing");
-                            if (getActivity() != null && mActivityResumed) {
-                                if (DEBUG) Log.v(TAG, "Updating UI!");
-                                for (int i=0; i<mTabs.size(); i++) {
-                                    TabInfo tab = mTabs.get(i);
-                                    if (tab.mApplications != null) {
-                                        tab.mApplications.pause();
-                                    }
-                                }
-                                if (mCurTab != null) {
-                                    mCurTab.resume(mSortOrder);
-                                }
-                            }
-                        }
-                    });
-                    return null;
-                }
-            }).execute();
-        }
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        int menuId = item.getItemId();
-        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
-            mSortOrder = menuId;
-            if (mCurTab != null && mCurTab.mApplications != null) {
-                mCurTab.mApplications.rebuild(mSortOrder);
-            }
-        } else if (menuId == SHOW_RUNNING_SERVICES) {
-            mShowBackground = false;
-            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
-                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false);
-            }
-        } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
-            mShowBackground = true;
-            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
-                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true);
-            }
-        } else if (menuId == RESET_APP_PREFERENCES) {
-            buildResetDialog();
-        } else {
-            // Handle the home button
-            return false;
-        }
-        updateOptionsMenu();
-        return true;
-    }
-    
-    public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
-            long id) {
-        if (tab.mApplications != null && tab.mApplications.getCount() > position) {
-            ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
-            mCurrentPkgName = entry.info.packageName;
-            mCurrentUid = entry.info.uid;
-            startApplicationDetailsActivity();
-        }
-    }
-
-    public void updateCurrentTab(int position) {
-        TabInfo tab = mTabs.get(position);
-        mCurTab = tab;
-
-        // Put things in the correct paused/resumed state.
-        if (mActivityResumed) {
-            mCurTab.build(mInflater, mContentContainer, mRootView);
-            mCurTab.resume(mSortOrder);
-        } else {
-            mCurTab.pause();
-        }
-        for (int i=0; i<mTabs.size(); i++) {
-            TabInfo t = mTabs.get(i);
-            if (t != mCurTab) {
-                t.pause();
-            }
-        }
-
-        mCurTab.updateStorageUsage();
-        updateOptionsMenu();
-        final Activity host = getActivity();
-        if (host != null) {
-            host.invalidateOptionsMenu();
-        }
-    }
-
-    private volatile IMediaContainerService mContainerService;
-
-    private final ServiceConnection mContainerConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            mContainerService = IMediaContainerService.Stub.asInterface(service);
-            for (int i=0; i<mTabs.size(); i++) {
-                mTabs.get(i).setContainerService(mContainerService);
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            mContainerService = null;
-        }
-    };
 }
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index 0022338..e418e9b 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -29,6 +29,7 @@
 import com.android.settings.WallpaperTypeSettings;
 import com.android.settings.WirelessSettings;
 import com.android.settings.accessibility.AccessibilitySettings;
+import com.android.settings.applications.AdvancedAppSettings;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.deviceinfo.Memory;
 import com.android.settings.deviceinfo.UsbSettings;
@@ -67,16 +68,17 @@
     public static final int RANK_NOTIFICATIONS = 9;
     public static final int RANK_STORAGE = 10;
     public static final int RANK_POWER_USAGE = 11;
-    public static final int RANK_USERS = 12;
-    public static final int RANK_LOCATION = 13;
-    public static final int RANK_SECURITY = 14;
-    public static final int RANK_IME = 15;
-    public static final int RANK_PRIVACY = 16;
-    public static final int RANK_DATE_TIME = 17;
-    public static final int RANK_ACCESSIBILITY = 18;
-    public static final int RANK_PRINTING = 19;
-    public static final int RANK_DEVELOPEMENT = 20;
-    public static final int RANK_DEVICE_INFO = 21;
+    public static final int RANK_APPS = 12;
+    public static final int RANK_USERS = 13;
+    public static final int RANK_LOCATION = 14;
+    public static final int RANK_SECURITY = 15;
+    public static final int RANK_IME = 16;
+    public static final int RANK_PRIVACY = 17;
+    public static final int RANK_DATE_TIME = 18;
+    public static final int RANK_ACCESSIBILITY = 19;
+    public static final int RANK_PRINTING = 20;
+    public static final int RANK_DEVELOPEMENT = 21;
+    public static final int RANK_DEVICE_INFO = 22;
 
     public static final int RANK_UNDEFINED = -1;
     public static final int RANK_OTHERS = 1024;
@@ -129,6 +131,9 @@
         sRankMap.put(PowerUsageSummary.class.getName(), RANK_POWER_USAGE);
         sRankMap.put(BatterySaverSettings.class.getName(), RANK_POWER_USAGE);
 
+        // Advanced app settings
+        sRankMap.put(AdvancedAppSettings.class.getName(), RANK_APPS);
+
         // Users
         sRankMap.put(UserSettings.class.getName(), RANK_USERS);
 
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index d774469..d5aa4b7 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -31,6 +31,7 @@
 import com.android.settings.WallpaperTypeSettings;
 import com.android.settings.WirelessSettings;
 import com.android.settings.accessibility.AccessibilitySettings;
+import com.android.settings.applications.AdvancedAppSettings;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.deviceinfo.Memory;
 import com.android.settings.deviceinfo.UsbSettings;
@@ -188,6 +189,13 @@
                         BatterySaverSettings.class.getName(),
                         R.drawable.ic_settings_battery));
 
+        sResMap.put(AdvancedAppSettings.class.getName(),
+                new SearchIndexableResource(
+                        Ranking.getRankForClassName(AdvancedAppSettings.class.getName()),
+                        R.xml.advanced_apps,
+                        AdvancedAppSettings.class.getName(),
+                        R.drawable.ic_settings_applications));
+
         sResMap.put(UserSettings.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(UserSettings.class.getName()),