Merge "Filter app list by storage volume"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7c75120..dbd842d0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6462,4 +6462,7 @@
     <!-- Label of default app for current setting [CHAR LIMIT=40] -->
     <string name="default_app">(Default)</string>
 
+    <!-- Title of app storage screen [CHAR LIMIT=30] -->
+    <string name="apps_storage">Apps storage</string>
+
 </resources>
diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java
index ff6f219..883c67c 100644
--- a/src/com/android/settings/InstrumentedFragment.java
+++ b/src/com/android/settings/InstrumentedFragment.java
@@ -27,6 +27,7 @@
     public static final int VIEW_CATEGORY_UNDECLARED = 100000;
 
     public static final int VIEW_CATEGORY_DEFAULT_APPS = VIEW_CATEGORY_UNDECLARED + 1;
+    public static final int VIEW_CATEGORY_STORAGE_APPS = VIEW_CATEGORY_UNDECLARED + 2;
 
     /**
      * Declare the view of this category.
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
index ddfc207..c5124c6 100644
--- a/src/com/android/settings/applications/ApplicationsState.java
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -54,6 +54,7 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Objects;
 import java.util.regex.Pattern;
 
 /**
@@ -335,6 +336,23 @@
         }
     };
 
+    public static class VolumeFilter implements AppFilter {
+        private final String mVolumeUuid;
+
+        public VolumeFilter(String volumeUuid) {
+            mVolumeUuid = volumeUuid;
+        }
+
+        @Override
+        public void init() {
+        }
+
+        @Override
+        public boolean filterApp(AppEntry info) {
+            return Objects.equals(info.info.volumeUuid, mVolumeUuid);
+        }
+    }
+
     public static class CompoundFilter implements AppFilter {
         private final AppFilter mFirstFilter;
         private final AppFilter mSecondFilter;
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 362903e..b675ba4 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -50,17 +50,20 @@
 import android.widget.Spinner;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.settings.AppHeader;
 import com.android.settings.HelpUtils;
 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.Settings.StorageUseActivity;
 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.applications.ApplicationsState.VolumeFilter;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settings.notification.NotificationBackend.AppRow;
 
@@ -81,6 +84,12 @@
     static final String TAG = "ManageApplications";
     static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
+    // Intent extras.
+    public static final String EXTRA_CLASSNAME = "classname";
+    // Used for storage only.
+    public static final String EXTRA_VOLUME_UUID = "volumeUuid";
+    public static final String EXTRA_VOLUME_NAME = "volumeName";
+
     private static final String EXTRA_SORT_ORDER = "sortOrder";
 
     // attributes used as keys when passing values to InstalledAppDetails activity
@@ -180,6 +189,7 @@
     public static final int LIST_TYPE_MAIN = 0;
     public static final int LIST_TYPE_NOTIFICATION = 1;
     public static final int LIST_TYPE_DOMAINS_URLS = 2;
+    public static final int LIST_TYPE_STORAGE = 3;
 
     private View mRootView;
 
@@ -188,6 +198,8 @@
     private FilterSpinnerAdapter mFilterAdapter;
     private NotificationBackend mNotifBackend;
     private ResetAppsHelper mResetAppsHelper;
+    private String mVolumeUuid;
+    private String mVolumeName;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -196,8 +208,8 @@
         mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
 
         Intent intent = getActivity().getIntent();
-        String className = getArguments() != null
-                ? getArguments().getString("classname") : null;
+        Bundle args = getArguments();
+        String className = args != null ? args.getString(EXTRA_CLASSNAME) : null;
         if (className == null) {
             className = intent.getComponent().getClassName();
         }
@@ -208,6 +220,16 @@
             mNotifBackend = new NotificationBackend();
         } else if (className.equals(DomainsURLsAppListActivity.class.getName())) {
             mListType = LIST_TYPE_DOMAINS_URLS;
+        } else if (className.equals(StorageUseActivity.class.getName())) {
+            if (args != null && args.containsKey(EXTRA_VOLUME_UUID)) {
+                mVolumeUuid = args.getString(EXTRA_VOLUME_UUID);
+                mVolumeName = args.getString(EXTRA_VOLUME_NAME);
+                mListType = LIST_TYPE_STORAGE;
+            } else {
+                // No volume selected, display a normal list, sorted by size.
+                mListType = LIST_TYPE_MAIN;
+                mSortOrder = R.id.sort_order_size;
+            }
         } else {
             mListType = LIST_TYPE_MAIN;
         }
@@ -278,7 +300,7 @@
         contentParent.addView(mSpinnerHeader, 0);
 
         mFilterAdapter.enableFilter(getDefaultFilter());
-        if (mListType != LIST_TYPE_MAIN) {
+        if (mListType != LIST_TYPE_STORAGE) {
             if (UserManager.get(getActivity()).getUserProfiles().size() > 1) {
                 mFilterAdapter.enableFilter(FILTER_APPS_PERSONAL);
                 mFilterAdapter.enableFilter(FILTER_APPS_WORK);
@@ -290,6 +312,15 @@
             mFilterAdapter.enableFilter(FILTER_APPS_PRIORITY);
             mFilterAdapter.enableFilter(FILTER_APPS_SENSITIVE);
         }
+        mApplications.setOverrideFilter(new VolumeFilter(mVolumeUuid));
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        if (mListType == LIST_TYPE_STORAGE) {
+            AppHeader.createAppHeader(getActivity(), null, mVolumeName, null);
+        }
     }
 
     private int getDefaultFilter() {
@@ -312,6 +343,8 @@
                 return MetricsLogger.MANAGE_APPLICATIONS_NOTIFICATIONS;
             case LIST_TYPE_DOMAINS_URLS:
                 return MetricsLogger.MANAGE_DOMAIN_URLS;
+            case LIST_TYPE_STORAGE:
+                return InstrumentedFragment.VIEW_CATEGORY_STORAGE_APPS;
             default:
                 return MetricsLogger.VIEW_UNKNOWN;
         }
@@ -634,6 +667,7 @@
         private int mWhichSize = SIZE_TOTAL;
         CharSequence mCurFilterPrefix;
         private PackageManager mPm;
+        private AppFilter mOverrideFilter;
 
         private Filter mFilter = new Filter() {
             @Override
@@ -672,6 +706,11 @@
             }
         }
 
+        public void setOverrideFilter(AppFilter overrideFilter) {
+            mOverrideFilter = overrideFilter;
+            rebuild(true);
+        }
+
         public void setFilter(int filter) {
             mFilterMode = filter;
             rebuild(true);
@@ -728,6 +767,9 @@
                 mWhichSize = SIZE_INTERNAL;
             }
             filterObj = FILTERS[mFilterMode];
+            if (mOverrideFilter != null) {
+                filterObj = mOverrideFilter;
+            }
             switch (mLastSortMode) {
                 case R.id.sort_order_size:
                     switch (mWhichSize) {
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index dec259b..a280b2d 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -55,6 +55,9 @@
 import com.android.settings.R;
 import com.android.settings.Settings;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
+import com.android.settings.Settings.StorageUseActivity;
+import com.android.settings.applications.ManageApplications;
 import com.android.settings.deviceinfo.StorageMeasurement.MeasurementDetails;
 import com.android.settings.deviceinfo.StorageMeasurement.MeasurementReceiver;
 import com.android.settings.deviceinfo.StorageSettings.MountTask;
@@ -323,9 +326,13 @@
 
         Intent intent = null;
         if (pref == mApps) {
-            intent = new Intent(Intent.ACTION_MANAGE_PACKAGE_STORAGE);
-            intent.setClass(getActivity(), Settings.ManageApplicationsActivity.class);
-
+            Bundle args = new Bundle();
+            args.putString(ManageApplications.EXTRA_CLASSNAME, StorageUseActivity.class.getName());
+            args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid());
+            args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription());
+            intent = Utils.onBuildStartFragmentIntent(getActivity(),
+                    ManageApplications.class.getName(), args, null, R.string.apps_storage, null,
+                    false);
         } else if (pref == mDownloads) {
             intent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS).putExtra(
                     DownloadManager.INTENT_EXTRAS_SORT_BY_SIZE, true);