Remove all apps page

Instead move the functionality back into overflow menu as show/hide
system apps. Also move the reset app preferences from advanced to
the overflow menu.

Bug: 20210160
Change-Id: Ied573e1f7dfc438b06642ee2af8f11868130ba3b
diff --git a/res/menu/manage_apps.xml b/res/menu/manage_apps.xml
index 577e981..225f974 100644
--- a/res/menu/manage_apps.xml
+++ b/res/menu/manage_apps.xml
@@ -18,6 +18,25 @@
     <item
         android:id="@+id/advanced"
         android:title="@string/advanced_apps"
-        android:icon="@drawable/ic_settings_24dp"
-        android:showAsAction="collapseActionView|ifRoom" />
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/show_system"
+        android:title="@string/menu_show_system"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/hide_system"
+        android:title="@string/menu_hide_system"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/sort_order_alpha"
+        android:title="@string/sort_order_alpha"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/sort_order_size"
+        android:title="@string/sort_order_size"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/reset_app_preferences"
+        android:title="@string/reset_app_preferences"
+        android:showAsAction="never" />
 </menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a0b0653..f416d89 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4234,8 +4234,10 @@
     <string name="menu_duration_12h">12 hours</string>
     <!-- [CHAR LIMIT=NONE] Menu for process stats to show 3 hours of data -->
     <string name="menu_duration_1d">1 day</string>
-    <!-- [CHAR LIMIT=NONE] Menu for process stats to control whether system processes are shown -->
+    <!-- [CHAR LIMIT=NONE] Menu for manage apps to control whether system processes are shown -->
     <string name="menu_show_system">Show system</string>
+    <!-- [CHAR LIMIT=NONE] Menu for manage apps to control whether system processes are hidden -->
+    <string name="menu_hide_system">Hide system</string>
     <!-- [CHAR LIMIT=NONE] Menu for process stats to control whether computation should be based
         on Uss (Unique Set Size) instead of Pss (Proportional Set Size) -->
     <string name="menu_use_uss">Use Uss</string>
@@ -6359,15 +6361,9 @@
     <!-- Label for showing apps with domain URLs (data URI with http or https) in list [CHAR LIMIT=30] -->
     <string name="filter_with_domain_urls_apps">With domain URLs</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>
-
     <!-- Summary for a trust agent that was disabled by the device policy [LIMIT=NONE] -->
     <string name="trust_agent_disabled_device_admin">Disabled by administrator</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>
 
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index 0307a60..28324ca 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -40,22 +40,6 @@
                 android:value="com.android.settings.Settings$DomainsURLsAppListActivity" />
     </PreferenceScreen>
 
-    <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" />
-
     <com.android.settings.applications.DefaultEmergencyPreference
         android:key="default_emergency_app"
         android:title="@string/default_emergency_app"
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index 2c6efa6..ee47c68 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -15,33 +15,13 @@
  */
 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.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.provider.SearchIndexableResource;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
@@ -56,35 +36,20 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class AdvancedAppSettings extends SettingsPreferenceFragment implements Callbacks,
-        DialogInterface.OnClickListener, DialogInterface.OnDismissListener, Callback, Indexable {
+public class AdvancedAppSettings extends SettingsPreferenceFragment implements Callbacks, Callback,
+        Indexable {
 
     static final String TAG = "AdvancedAppSettings";
     static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     private static final String KEY_APP_PERM = "manage_perms";
-    private static final String KEY_ALL_APPS = "all_apps";
     private static final String KEY_APP_DOMAIN_URLS = "domain_urls";
-    private static final String KEY_RESET_ALL = "reset_all";
     private static final String KEY_DEFAULT_EMERGENCY_APP = "default_emergency_app";
-    private static final String EXTRA_RESET_DIALOG = "resetDialog";
 
     private ApplicationsState mApplicationsState;
     private Session mSession;
     private Preference mAppPermsPreference;
     private Preference mAppDomainURLsPreference;
-    private Preference mAllAppsPreference;
-    private Preference mResetAllPreference;
-
-    AlertDialog mResetDialog;
-
-    private boolean mActivityResumed;
-    private PackageManager mPm;
-    private IPackageManager mIPm;
-    private INotificationManager mNm;
-    private NetworkPolicyManager mNpm;
-    private AppOpsManager mAom;
-    private Handler mHandler;
     private PermissionsInfo mPermissionsInfo;
 
     @Override
@@ -97,25 +62,8 @@
 
         mAppPermsPreference = findPreference(KEY_APP_PERM);
         mAppDomainURLsPreference = findPreference(KEY_APP_DOMAIN_URLS);
-        mAllAppsPreference = findPreference(KEY_ALL_APPS);
-        mResetAllPreference = findPreference(KEY_RESET_ALL);
-        mResetAllPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-            @Override
-            public boolean onPreferenceClick(Preference preference) {
-                buildResetDialog();
-                return true;
-            }
-        });
         updateUI();
 
-        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());
-
         if (!DefaultEmergencyPreference.isAvailable(getActivity())) {
             removePreference(KEY_DEFAULT_EMERGENCY_APP);
         }
@@ -123,7 +71,6 @@
 
     private void updateUI() {
         ArrayList<AppEntry> allApps = mSession.getAllApps();
-        mAllAppsPreference.setSummary(getString(R.string.all_apps_summary, allApps.size()));
 
         int countAppWithDomainURLs = 0;
         for (AppEntry entry : allApps) {
@@ -137,25 +84,6 @@
     }
 
     @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
     protected int getMetricsCategory() {
         return MetricsLogger.APPLICATIONS_ADVANCED;
     }
@@ -163,98 +91,10 @@
     @Override
     public void onResume() {
         super.onResume();
-        mActivityResumed = true;
         mPermissionsInfo = new PermissionsInfo(getActivity(), this);
     }
 
     @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.
     }
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
index 71d0790..162ca77 100644
--- a/src/com/android/settings/applications/ApplicationsState.java
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -349,6 +349,27 @@
         }
     };
 
+    public static class CompoundFilter implements AppFilter {
+        private final AppFilter mFirstFilter;
+        private final AppFilter mSecondFilter;
+
+        public CompoundFilter(AppFilter first, AppFilter second) {
+            mFirstFilter = first;
+            mSecondFilter = second;
+        }
+
+        @Override
+        public void init() {
+            mFirstFilter.init();
+            mSecondFilter.init();
+        }
+
+        @Override
+        public boolean filterApp(AppEntry info) {
+            return mFirstFilter.filterApp(info) && mSecondFilter.filterApp(info);
+        }
+    }
+
     final Context mContext;
     final PackageManager mPm;
     final IPackageManager mIpm;
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 4acbedb..825a215 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -58,14 +58,15 @@
 import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.Settings.AllApplicationsActivity;
+import com.android.settings.Settings.DomainsURLsAppListActivity;
 import com.android.settings.Settings.NotificationAppListActivity;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
 import com.android.settings.applications.ApplicationsState.AppFilter;
+import com.android.settings.applications.ApplicationsState.CompoundFilter;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settings.notification.NotificationBackend.AppRow;
-import com.android.settings.Settings.DomainsURLsAppListActivity;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -141,19 +142,23 @@
     // 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_BLOCKED                 = 4;
-    public static final int FILTER_APPS_PRIORITY                = 5;
-    public static final int FILTER_APPS_SENSITIVE               = 6;
-    public static final int FILTER_APPS_PERSONAL                = 7;
-    public static final int FILTER_APPS_WORK                    = 8;
-    public static final int FILTER_APPS_WITH_DOMAIN_URLS        = 9;
+    public static final int FILTER_APPS_DL_ENABLED              = 1;
+    public static final int FILTER_APPS_DL_DISABLED             = 2;
+    public static final int FILTER_APPS_ALL                     = 3;
+    public static final int FILTER_APPS_ENABLED                 = 4;
+    public static final int FILTER_APPS_DISABLED                = 5;
+    public static final int FILTER_APPS_BLOCKED                 = 6;
+    public static final int FILTER_APPS_PRIORITY                = 7;
+    public static final int FILTER_APPS_SENSITIVE               = 8;
+    public static final int FILTER_APPS_PERSONAL                = 9;
+    public static final int FILTER_APPS_WORK                    = 10;
+    public static final int FILTER_APPS_WITH_DOMAIN_URLS        = 11;
 
     // 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,      // Downloaded and launcher
+        R.string.filter_enabled_apps,  // Downloaded and launcher, Enabled
+        R.string.filter_apps_disabled, // Downloaded and launcher, Disabled
         R.string.filter_all_apps,      // All apps
         R.string.filter_enabled_apps,  // Enabled
         R.string.filter_apps_disabled, // Disabled
@@ -168,6 +173,12 @@
     // be kept in sync.
     public static final AppFilter[] FILTERS = new AppFilter[] {
         ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER, // Downloaded and launcher
+        new CompoundFilter(                               // Downloaded and launcher, Enabled
+                ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER,
+                ApplicationsState.FILTER_ALL_ENABLED),
+        new CompoundFilter(                               // Downloaded and launcher, Disabled
+                ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER,
+                ApplicationsState.FILTER_DISABLED),
         ApplicationsState.FILTER_EVERYTHING,  // All apps
         ApplicationsState.FILTER_ALL_ENABLED, // Enabled
         ApplicationsState.FILTER_DISABLED,    // Disabled
@@ -179,14 +190,12 @@
         ApplicationsState.FILTER_WITH_DOMAIN_URLS,   // Apps with Domain URLs
     };
 
-    // sort order that can be changed through the menu can be sorted alphabetically
-    // or size(descending)
-    private static final int MENU_OPTIONS_BASE = 0;
-    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 int mSortOrder = R.id.sort_order_alpha;
+
+    // whether showing system apps.
+    private boolean mShowSystem;
+    private boolean mHasDisabledApps;
 
     private ApplicationsState mApplicationsState;
 
@@ -214,9 +223,8 @@
     private Menu mOptionsMenu;
 
     public static final int LIST_TYPE_MAIN = 0;
-    public static final int LIST_TYPE_ALL = 1;
-    public static final int LIST_TYPE_NOTIFICATION = 2;
-    public static final int LIST_TYPE_DOMAINS_URLS = 3;
+    public static final int LIST_TYPE_NOTIFICATION = 1;
+    public static final int LIST_TYPE_DOMAINS_URLS = 2;
 
     private View mRootView;
 
@@ -224,6 +232,7 @@
     private Spinner mFilterSpinner;
     private FilterSpinnerAdapter mFilterAdapter;
     private NotificationBackend mNotifBackend;
+    private ResetAppsHelper mResetAppsHelper;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -238,7 +247,7 @@
             className = intent.getComponent().getClassName();
         }
         if (className.equals(AllApplicationsActivity.class.getName())) {
-            mListType = LIST_TYPE_ALL;
+            mShowSystem = true;
         } else if (className.equals(NotificationAppListActivity.class.getName())) {
             mListType = LIST_TYPE_NOTIFICATION;
             mNotifBackend = new NotificationBackend();
@@ -254,6 +263,8 @@
         }
 
         mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
+
+        mResetAppsHelper = new ResetAppsHelper(getActivity());
     }
 
 
@@ -263,8 +274,6 @@
         // 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);
@@ -294,6 +303,10 @@
             ((PreferenceFrameLayout.LayoutParams) mRootView.getLayoutParams()).removeBorders = true;
         }
 
+        createHeader();
+
+        mResetAppsHelper.onRestoreInstanceState(savedInstanceState);
+
         return mRootView;
     }
 
@@ -316,23 +329,23 @@
                 mFilterAdapter.enableFilter(FILTER_APPS_WORK);
             }
         }
+        updateMainFilters();
         if (mListType == LIST_TYPE_NOTIFICATION) {
             mFilterAdapter.enableFilter(FILTER_APPS_BLOCKED);
             mFilterAdapter.enableFilter(FILTER_APPS_PRIORITY);
             mFilterAdapter.enableFilter(FILTER_APPS_SENSITIVE);
-        } else if (mListType == LIST_TYPE_DOMAINS_URLS) {
-            mFilterAdapter.disableFilter(FILTER_APPS_ALL);
-            mFilterAdapter.enableFilter(FILTER_APPS_WITH_DOMAIN_URLS);
         }
     }
 
     private int getDefaultFilter() {
-        if (mListType == LIST_TYPE_MAIN) {
-            return FILTER_APPS_DOWNLOADED_AND_LAUNCHER;
-        } else if (mListType == LIST_TYPE_DOMAINS_URLS) {
-            return FILTER_APPS_WITH_DOMAIN_URLS;
+        switch (mListType) {
+            case LIST_TYPE_MAIN:
+                return mShowSystem ? FILTER_APPS_ALL : FILTER_APPS_DOWNLOADED_AND_LAUNCHER;
+            case LIST_TYPE_DOMAINS_URLS:
+                return FILTER_APPS_WITH_DOMAIN_URLS;
+            default:
+                return FILTER_APPS_ALL;
         }
-        return FILTER_APPS_ALL;
     }
 
     @Override
@@ -340,8 +353,6 @@
         switch (mListType) {
             case LIST_TYPE_MAIN:
                 return MetricsLogger.MANAGE_APPLICATIONS;
-            case LIST_TYPE_ALL:
-                return MetricsLogger.MANAGE_APPLICATIONS_ALL;
             case LIST_TYPE_NOTIFICATION:
                 return MetricsLogger.MANAGE_APPLICATIONS_NOTIFICATIONS;
             case LIST_TYPE_DOMAINS_URLS:
@@ -365,6 +376,7 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
+        mResetAppsHelper.onSaveInstanceState(outState);
         outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
     }
 
@@ -377,6 +389,12 @@
     }
 
     @Override
+    public void onStop() {
+        super.onStop();
+        mResetAppsHelper.stop();
+    }
+
+    @Override
     public void onDestroyView() {
         super.onDestroyView();
 
@@ -428,19 +446,11 @@
 
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        if (mListType == LIST_TYPE_DOMAINS_URLS) {
-            // No option menu
+        if (mListType != LIST_TYPE_MAIN) {
             return;
         }
         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);
+        inflater.inflate(R.menu.manage_apps, menu);
         updateOptionsMenu();
     }
 
@@ -460,11 +470,19 @@
         }
         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);
+            mOptionsMenu.findItem(R.id.sort_order_alpha).setVisible(
+                    mSortOrder != R.id.sort_order_alpha);
+            mOptionsMenu.findItem(R.id.sort_order_size).setVisible(
+                    mSortOrder != R.id.sort_order_size);
+
+            mOptionsMenu.findItem(R.id.show_system).setVisible(false);
+            mOptionsMenu.findItem(R.id.hide_system).setVisible(false);
         } else {
-            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
-            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
+            mOptionsMenu.findItem(R.id.sort_order_alpha).setVisible(false);
+            mOptionsMenu.findItem(R.id.sort_order_size).setVisible(false);
+
+            mOptionsMenu.findItem(R.id.show_system).setVisible(!mShowSystem);
+            mOptionsMenu.findItem(R.id.hide_system).setVisible(mShowSystem);
         }
     }
 
@@ -472,13 +490,21 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         int menuId = item.getItemId();
         switch(item.getItemId()) {
-            case SORT_ORDER_ALPHA:
-            case SORT_ORDER_SIZE:
+            case R.id.sort_order_alpha:
+            case R.id.sort_order_size:
                 mSortOrder = menuId;
                 if (mApplications != null) {
                     mApplications.rebuild(mSortOrder);
                 }
                 break;
+            case R.id.show_system:
+            case R.id.hide_system:
+                mShowSystem = !mShowSystem;
+                updateMainFilters();
+                break;
+            case R.id.reset_app_preferences:
+                mResetAppsHelper.buildResetDialog();
+                return true;
             case R.id.advanced:
                 ((SettingsActivity) getActivity()).startPreferencePanel(
                         AdvancedAppSettings.class.getName(), null, R.string.advanced_apps,
@@ -492,6 +518,18 @@
         return true;
     }
 
+    private void updateMainFilters() {
+        if (mListType != LIST_TYPE_MAIN) {
+            return;
+        }
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_ALL, mShowSystem);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_ENABLED, mShowSystem && mHasDisabledApps);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DISABLED, mShowSystem && mHasDisabledApps);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DOWNLOADED_AND_LAUNCHER, !mShowSystem);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DL_ENABLED, !mShowSystem && mHasDisabledApps);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DL_DISABLED, !mShowSystem && mHasDisabledApps);
+    }
+
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         if (mApplications != null && mApplications.getCount() > position) {
@@ -506,7 +544,9 @@
 
     @Override
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        mApplications.setFilter(mFilterAdapter.getFilter(position));
+        mFilter = mFilterAdapter.getFilter(position);
+        mApplications.setFilter(mFilter);
+        if (DEBUG) Log.d(TAG, "Selecting filter " + mFilter);
     }
 
     @Override
@@ -522,17 +562,11 @@
     }
 
     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);
-        }
+        mHasDisabledApps = hasDisabledApps;
+        mFilterAdapter.setFilterEnabled(
+                mShowSystem ? FILTER_APPS_ENABLED : FILTER_APPS_DL_ENABLED, hasDisabledApps);
+        mFilterAdapter.setFilterEnabled(
+                mShowSystem ? FILTER_APPS_DISABLED : FILTER_APPS_DL_DISABLED, hasDisabledApps);
     }
 
     static class FilterSpinnerAdapter extends ArrayAdapter<CharSequence> {
@@ -553,23 +587,45 @@
             return mFilterOptions.get(position);
         }
 
+        public void setFilterEnabled(int filter, boolean enabled) {
+            if (enabled) {
+                enableFilter(filter);
+            } else {
+                disableFilter(filter);
+            }
+        }
+
         public void enableFilter(int filter) {
             if (mFilterOptions.contains(filter)) return;
+            if (DEBUG) Log.d(TAG, "Enabling filter " + filter);
             mFilterOptions.add(filter);
             Collections.sort(mFilterOptions);
             mManageApplications.mSpinnerHeader.setVisibility(
                     mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
             notifyDataSetChanged();
+            if (mFilterOptions.size() == 1) {
+                if (DEBUG) Log.d(TAG, "Auto selecting filter " + filter);
+                mManageApplications.mFilterSpinner.setSelection(0);
+                mManageApplications.onItemSelected(null, null, 0, 0);
+            }
         }
 
         public void disableFilter(int filter) {
             if (!mFilterOptions.remove((Integer) filter)) {
                 return;
             }
+            if (DEBUG) Log.d(TAG, "Disabling filter " + filter);
             Collections.sort(mFilterOptions);
             mManageApplications.mSpinnerHeader.setVisibility(
                     mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
             notifyDataSetChanged();
+            if (mManageApplications.mFilter == filter) {
+                if (mFilterOptions.size() > 0) {
+                    if (DEBUG) Log.d(TAG, "Auto selecting filter " + mFilterOptions.get(0));
+                    mManageApplications.mFilterSpinner.setSelection(0);
+                    mManageApplications.onItemSelected(null, null, 0, 0);
+                }
+            }
         }
 
         @Override
@@ -716,7 +772,7 @@
             }
             filterObj = FILTERS[mFilterMode];
             switch (mLastSortMode) {
-                case SORT_ORDER_SIZE:
+                case R.id.sort_order_size:
                     switch (mWhichSize) {
                         case SIZE_INTERNAL:
                             comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
@@ -845,7 +901,7 @@
                         }
                     }
                     if (holder.entry.info.packageName.equals(mManageApplications.mCurrentPkgName)
-                            && mLastSortMode == SORT_ORDER_SIZE) {
+                            && mLastSortMode == R.id.sort_order_size) {
                         // We got the size information for the last app the
                         // user viewed, and are sorting by size...  they may
                         // have cleared data, so we immediately want to resort
@@ -866,7 +922,7 @@
 
         @Override
         public void onAllSizesComputed() {
-            if (mLastSortMode == SORT_ORDER_SIZE) {
+            if (mLastSortMode == R.id.sort_order_size) {
                 rebuild(false);
             }
         }
diff --git a/src/com/android/settings/applications/ResetAppsHelper.java b/src/com/android/settings/applications/ResetAppsHelper.java
new file mode 100644
index 0000000..cc83157
--- /dev/null
+++ b/src/com/android/settings/applications/ResetAppsHelper.java
@@ -0,0 +1,145 @@
+/*
+ * 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.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+
+import com.android.settings.R;
+
+import java.util.List;
+
+public class ResetAppsHelper implements DialogInterface.OnClickListener,
+        DialogInterface.OnDismissListener {
+
+    private static final String EXTRA_RESET_DIALOG = "resetDialog";
+
+    private final PackageManager mPm;
+    private final IPackageManager mIPm;
+    private final INotificationManager mNm;
+    private final NetworkPolicyManager mNpm;
+    private final AppOpsManager mAom;
+    private final Context mContext;
+
+    private AlertDialog mResetDialog;
+
+    public ResetAppsHelper(Context context) {
+        mContext = context;
+        mPm = context.getPackageManager();
+        mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+        mNm = INotificationManager.Stub.asInterface(
+                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+        mNpm = NetworkPolicyManager.from(context);
+        mAom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+    }
+
+    public void onRestoreInstanceState(Bundle savedInstanceState) {
+        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
+            buildResetDialog();
+        }
+    }
+
+    public void onSaveInstanceState(Bundle outState) {
+        if (mResetDialog != null) {
+            outState.putBoolean(EXTRA_RESET_DIALOG, true);
+        }
+    }
+
+    public void stop() {
+        if (mResetDialog != null) {
+            mResetDialog.dismiss();
+            mResetDialog = null;
+        }
+    }
+
+    void buildResetDialog() {
+        if (mResetDialog == null) {
+            mResetDialog = new AlertDialog.Builder(mContext)
+                    .setTitle(R.string.reset_app_preferences_title)
+                    .setMessage(R.string.reset_app_preferences_desc)
+                    .setPositiveButton(R.string.reset_app_preferences_button, this)
+                    .setNegativeButton(R.string.cancel, null)
+                    .setOnDismissListener(this)
+                    .show();
+        }
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        if (mResetDialog == dialog) {
+            mResetDialog = null;
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (mResetDialog != dialog) {
+            return;
+        }
+        AsyncTask.execute(new Runnable() {
+            @Override
+            public void run() {
+                List<ApplicationInfo> apps = mPm.getInstalledApplications(
+                        PackageManager.GET_DISABLED_COMPONENTS);
+                for (int i = 0; i < apps.size(); i++) {
+                    ApplicationInfo app = apps.get(i);
+                    try {
+                        mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
+                    } catch (android.os.RemoteException ex) {
+                    }
+                    if (!app.enabled) {
+                        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) {
+                        mNpm.setUidPolicy(uid, POLICY_NONE);
+                    }
+                }
+            }
+        });
+    }
+}