Add personal/work tab for ManageApplications

- Add ProfileSelectManageApplications containing tabLayout
- Modify StorageItemPreferenceController to display only personal
or work profile data
- Add getTargetFragment in Utils to handle fragment selection

Bug: 141601408
Test: manual
Change-Id: Ie4db1ce2e77f60a82018e5a3e1f2fccb812502dc
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 4d813d5..87ae8b1 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -35,7 +35,6 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.text.TextUtils;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
@@ -53,13 +52,11 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.Settings.WifiSettingsActivity;
 import com.android.settings.applications.manageapplications.ManageApplications;
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.core.SettingsBaseActivity;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.dashboard.DashboardFeatureProvider;
-import com.android.settings.dashboard.profileselector.ProfileFragmentBridge;
 import com.android.settings.homepage.TopLevelSettings;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.wfd.WifiDisplaySettings;
@@ -568,15 +565,7 @@
             throw new IllegalArgumentException("Invalid fragment for this activity: "
                     + fragmentName);
         }
-        Fragment f = null;
-        if (FeatureFlagUtils.isEnabled(this, FeatureFlags.PERSONAL_WORK_PROFILE)
-                && UserManager.get(this).getUserProfiles().size() > 1
-                && ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName) != null) {
-            f = Fragment.instantiate(this, ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName),
-                    args);
-        } else {
-            f = Fragment.instantiate(this, fragmentName, args);
-        }
+        Fragment f = Utils.getTargetFragment(this, fragmentName, args);
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
         transaction.replace(R.id.main_content, f);
         if (titleResId > 0) {
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 75db3e1..3616b18 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -21,6 +21,9 @@
 import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
 import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
 
+import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_PERSONAL_ONLY;
+import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_WORK_ONLY;
+
 import android.annotation.Nullable;
 import android.app.ActionBar;
 import android.app.Activity;
@@ -82,6 +85,7 @@
 import android.text.format.DateUtils;
 import android.text.style.TtsSpan;
 import android.util.ArraySet;
+import android.util.FeatureFlagUtils;
 import android.util.IconDrawableFactory;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -102,6 +106,7 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.core.FeatureFlags;
+import com.android.settings.dashboard.profileselector.ProfileFragmentBridge;
 import com.android.settings.development.featureflags.FeatureFlagPersistent;
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settingslib.widget.ActionBarShadowController;
@@ -1065,4 +1070,27 @@
             ActionBarShadowController.attachToView(activity, lifecycle, scrollView);
         }
     }
+
+    /**
+     * Return correct target fragment based on argument
+     *
+     * @param activity     the activity target fragment will be launched.
+     * @param fragmentName initial target fragment name.
+     * @param args         fragment launch arguments.
+     */
+    public static Fragment getTargetFragment(Activity activity, String fragmentName, Bundle args) {
+        Fragment f = null;
+        final boolean isWorkOnly = args == null ? false : args.getBoolean(EXTRA_WORK_ONLY);
+        final boolean isPersonalOnly = args == null ? false : args.getBoolean(EXTRA_PERSONAL_ONLY);
+        if (FeatureFlagUtils.isEnabled(activity, FeatureFlags.PERSONAL_WORK_PROFILE)
+                && UserManager.get(activity).getUserProfiles().size() > 1
+                && ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName) != null
+                && !isWorkOnly && !isPersonalOnly) {
+            f = Fragment.instantiate(activity, ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName),
+                    args);
+        } else {
+            f = Fragment.instantiate(activity, fragmentName, args);
+        }
+        return f;
+    }
 }
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 90ab71a..01289f2 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -143,6 +143,7 @@
     public static final String EXTRA_STORAGE_TYPE = "storageType";
     public static final String EXTRA_WORK_ONLY = "workProfileOnly";
     public static final String EXTRA_WORK_ID = "workId";
+    public static final String EXTRA_PERSONAL_ONLY = "personalOnly";
 
     private static final String EXTRA_SORT_ORDER = "sortOrder";
     private static final String EXTRA_SHOW_SYSTEM = "showSystem";
@@ -234,6 +235,7 @@
     private int mStorageType;
     private boolean mIsWorkOnly;
     private int mWorkUserId;
+    private boolean mIsPersonalOnly;
     private View mEmptyView;
     private int mFilterType;
 
@@ -308,6 +310,7 @@
         }
         final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
         mFilter = appFilterRegistry.get(appFilterRegistry.getDefaultFilterType(mListType));
+        mIsPersonalOnly = args != null ? args.getBoolean(EXTRA_PERSONAL_ONLY) : false;
         mIsWorkOnly = args != null ? args.getBoolean(EXTRA_WORK_ONLY) : false;
         mWorkUserId = args != null ? args.getInt(EXTRA_WORK_ID) : NO_USER_SPECIFIED;
         mExpandSearch = activity.getIntent().getBooleanExtra(EXTRA_EXPAND_SEARCH_VIEW, false);
@@ -405,8 +408,22 @@
 
         final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
         mFilterAdapter.enableFilter(appFilterRegistry.getDefaultFilterType(mListType));
+
+        AppFilter compositeFilter = getCompositeFilter(mListType, mStorageType, mVolumeUuid);
+        if (mIsWorkOnly) {
+            compositeFilter = new CompoundFilter(compositeFilter, ApplicationsState.FILTER_WORK);
+        }
+        if (mIsPersonalOnly) {
+            compositeFilter = new CompoundFilter(compositeFilter,
+                    ApplicationsState.FILTER_PERSONAL);
+        }
+        if (compositeFilter != null) {
+            mApplications.setCompositeFilter(compositeFilter);
+        }
+
         if (mListType == LIST_TYPE_MAIN) {
-            if (UserManager.get(getActivity()).getUserProfiles().size() > 1) {
+            if (UserManager.get(getActivity()).getUserProfiles().size() > 1 && !mIsWorkOnly
+                    && !mIsPersonalOnly) {
                 mFilterAdapter.enableFilter(FILTER_APPS_PERSONAL);
                 mFilterAdapter.enableFilter(FILTER_APPS_WORK);
             }
@@ -420,15 +437,6 @@
         if (mListType == LIST_TYPE_HIGH_POWER) {
             mFilterAdapter.enableFilter(FILTER_APPS_POWER_WHITELIST_ALL);
         }
-
-        AppFilter compositeFilter = getCompositeFilter(mListType, mStorageType, mVolumeUuid);
-        if (mIsWorkOnly) {
-            final AppFilter workFilter = appFilterRegistry.get(FILTER_APPS_WORK).getFilter();
-            compositeFilter = new CompoundFilter(compositeFilter, workFilter);
-        }
-        if (compositeFilter != null) {
-            mApplications.setCompositeFilter(compositeFilter);
-        }
     }
 
     @VisibleForTesting
@@ -449,9 +457,11 @@
             return new CompoundFilter(ApplicationsState.FILTER_MOVIES, filter);
         } else if (listType == LIST_TYPE_PHOTOGRAPHY) {
             return new CompoundFilter(ApplicationsState.FILTER_PHOTOS, filter);
+        } else {
+            final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
+            return appFilterRegistry.get(
+                    appFilterRegistry.getDefaultFilterType(listType)).getFilter();
         }
-
-        return null;
     }
 
     @Override
@@ -508,7 +518,7 @@
         outState.putBoolean(EXTRA_SHOW_SYSTEM, mShowSystem);
         outState.putBoolean(EXTRA_HAS_ENTRIES, mApplications.mHasReceivedLoadEntries);
         outState.putBoolean(EXTRA_HAS_BRIDGE, mApplications.mHasReceivedBridgeCallback);
-        if(mSearchView != null) {
+        if (mSearchView != null) {
             outState.putBoolean(EXTRA_EXPAND_SEARCH_VIEW, !mSearchView.isIconified());
         }
         if (mApplications != null) {
@@ -1166,7 +1176,7 @@
                 mSearchFilter = new SearchFilter();
             }
             // If we haven't load apps list completely, don't filter anything.
-            if(mOriginalEntries == null) {
+            if (mOriginalEntries == null) {
                 Log.w(TAG, "Apps haven't loaded completely yet, so nothing can be filtered");
                 return;
             }
diff --git a/src/com/android/settings/applications/manageapplications/ProfileSelectManageApplications.java b/src/com/android/settings/applications/manageapplications/ProfileSelectManageApplications.java
new file mode 100644
index 0000000..dc53e18
--- /dev/null
+++ b/src/com/android/settings/applications/manageapplications/ProfileSelectManageApplications.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 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.manageapplications;
+
+import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_PERSONAL_ONLY;
+import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_WORK_ONLY;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
+
+/**
+ * Application Setting page for work profile.
+ */
+public class ProfileSelectManageApplications extends ProfileSelectFragment {
+
+    @Override
+    public Fragment[] getFragments() {
+        final Bundle workOnly = new Bundle();
+        workOnly.putBoolean(EXTRA_WORK_ONLY, true);
+        final Fragment workFragment = new ManageApplications();
+        workFragment.setArguments(workOnly);
+
+        final Bundle personalOnly = new Bundle();
+        personalOnly.putBoolean(EXTRA_PERSONAL_ONLY, true);
+        final Fragment personalFragment = new ManageApplications();
+        personalFragment.setArguments(personalOnly);
+        return new Fragment[] {
+                personalFragment, //0
+                workFragment
+        };
+    }
+}
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileFragmentBridge.java b/src/com/android/settings/dashboard/profileselector/ProfileFragmentBridge.java
index 797782a..1a1a3e6 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileFragmentBridge.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileFragmentBridge.java
@@ -20,6 +20,8 @@
 
 import com.android.settings.accounts.AccountDashboardFragment;
 import com.android.settings.accounts.AccountProfileSelectFragment;
+import com.android.settings.applications.manageapplications.ManageApplications;
+import com.android.settings.applications.manageapplications.ProfileSelectManageApplications;
 
 import java.util.Map;
 
@@ -38,5 +40,7 @@
         FRAGMENT_MAP = new ArrayMap<>();
         FRAGMENT_MAP.put(AccountDashboardFragment.class.getName(),
                 AccountProfileSelectFragment.class.getName());
+        FRAGMENT_MAP.put(ManageApplications.class.getName(),
+                ProfileSelectManageApplications.class.getName());
     }
 }
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 525a887..31898d1 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -26,6 +26,7 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.storage.VolumeInfo;
+import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -37,6 +38,7 @@
 import com.android.settings.R;
 import com.android.settings.Settings;
 import com.android.settings.applications.manageapplications.ManageApplications;
+import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment;
@@ -389,10 +391,18 @@
     }
 
     private Bundle getWorkAnnotatedBundle(int additionalCapacity) {
-        final Bundle args = new Bundle(2 + additionalCapacity);
-        args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
-        args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
-        return args;
+        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.PERSONAL_WORK_PROFILE)) {
+            final Bundle args = new Bundle(3 + additionalCapacity);
+            args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
+            args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
+            args.putBoolean(ManageApplications.EXTRA_PERSONAL_ONLY, !mIsWorkProfile);
+            return args;
+        } else {
+            final Bundle args = new Bundle(2 + additionalCapacity);
+            args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
+            args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
+            return args;
+        }
     }
 
     private Intent getFilesIntent() {