Merge "Start removing N/A DO disclosures from search index"
diff --git a/src/com/android/settings/applications/AppCounter.java b/src/com/android/settings/applications/AppCounter.java
index 9464531..09a10e2 100644
--- a/src/com/android/settings/applications/AppCounter.java
+++ b/src/com/android/settings/applications/AppCounter.java
@@ -57,6 +57,10 @@
         onCountComplete(count);
     }
 
+    void executeInForeground() {
+        onPostExecute(doInBackground());
+    }
+
     protected abstract void onCountComplete(int num);
     protected abstract List<UserInfo> getUsersToCount();
     protected abstract boolean includeInCount(ApplicationInfo info);
diff --git a/src/com/android/settings/applications/ApplicationFeatureProvider.java b/src/com/android/settings/applications/ApplicationFeatureProvider.java
index fccbbd3..7dce793 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProvider.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProvider.java
@@ -35,15 +35,17 @@
     public static final int IGNORE_INSTALL_REASON = -1;
 
     /**
-     * Asynchronously calculates the total number of apps installed on the device, across all users
-     * and managed profiles.
+     * Calculates the total number of apps installed on the device, across all users and managed
+     * profiles.
      *
      * @param installReason Only consider apps with this install reason; may be any install reason
      *         defined in {@link android.content.pm.PackageManager} or
      *         {@link #IGNORE_INSTALL_REASON} to count all apps, irrespective of install reason.
+     * @param async Whether to count asynchronously in a background thread
      * @param callback The callback to invoke with the result
      */
-    void calculateNumberOfInstalledApps(int installReason, NumberOfAppsCallback callback);
+    void calculateNumberOfInstalledApps(int installReason, boolean async,
+            NumberOfAppsCallback callback);
 
     /**
      * Asynchronously calculates the total number of apps installed on the device, across all users
diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
index 31d26ed..5ba228f 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
@@ -56,8 +56,15 @@
     }
 
     @Override
-    public void calculateNumberOfInstalledApps(int installReason, NumberOfAppsCallback callback) {
-        new AllUserInstalledAppCounter(mContext, installReason, mPm, callback).execute();
+    public void calculateNumberOfInstalledApps(int installReason, boolean async,
+            NumberOfAppsCallback callback) {
+        final AllUserInstalledAppCounter counter = new AllUserInstalledAppCounter(mContext,
+                installReason, mPm, callback);
+        if (async) {
+            counter.execute();
+        } else {
+            counter.executeInForeground();
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java b/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
index 9b4be3a..93c1909 100644
--- a/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
+++ b/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
@@ -20,25 +20,30 @@
 
 import com.android.settings.R;
 import com.android.settings.applications.ApplicationFeatureProvider;
-import com.android.settings.core.PreferenceController;
+import com.android.settings.core.DynamicAvailabilityPreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.overlay.FeatureFactory;
 
-public class EnterpriseInstalledPackagesPreferenceController extends PreferenceController {
+public class EnterpriseInstalledPackagesPreferenceController
+        extends DynamicAvailabilityPreferenceController {
 
     private static final String KEY_NUMBER_ENTERPRISE_INSTALLED_PACKAGES
             = "number_enterprise_installed_packages";
     private final ApplicationFeatureProvider mFeatureProvider;
+    private final boolean mAsync;
 
-    public EnterpriseInstalledPackagesPreferenceController(Context context) {
-        super(context);
+    public EnterpriseInstalledPackagesPreferenceController(Context context, Lifecycle lifecycle,
+            boolean async) {
+        super(context, lifecycle);
         mFeatureProvider = FeatureFactory.getFactory(context)
                 .getApplicationFeatureProvider(context);
+        mAsync = async;
     }
 
     @Override
     public void updateState(Preference preference) {
         mFeatureProvider.calculateNumberOfInstalledApps(
-                PackageManager.INSTALL_REASON_POLICY,
+                PackageManager.INSTALL_REASON_POLICY, true /* async */,
                 (num) -> {
                     if (num == 0) {
                         preference.setVisible(false);
@@ -52,7 +57,20 @@
 
     @Override
     public boolean isAvailable() {
-        return true;
+        if (mAsync) {
+            // When called on the main UI thread, we must not block. Since calculating the number of
+            // enterprise-installed apps takes a bit of time, we always return true here and
+            // determine the pref's actual visibility asynchronously in updateState().
+            return true;
+        }
+
+        // When called by the search indexer, we are on a background thread that we can block. Also,
+        // changes to the pref's visibility made in updateState() would not be seen by the indexer.
+        // We block and return synchronously whether there are enterprise-installed apps or not.
+        final Boolean[] haveEnterpriseInstalledPackages = { null };
+        mFeatureProvider.calculateNumberOfInstalledApps(PackageManager.INSTALL_REASON_POLICY,
+                false /* async */, (num) -> haveEnterpriseInstalledPackages[0] = num > 0);
+        return haveEnterpriseInstalledPackages[0];
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java
index 3f66f02..0fb341a 100644
--- a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java
+++ b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java
@@ -22,6 +22,7 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -51,16 +52,22 @@
 
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
+        return buildPreferenceControllers(context, getLifecycle(), true /* async */);
+    }
+
+    private static List<PreferenceController> buildPreferenceControllers(Context context,
+            Lifecycle lifecycle, boolean async) {
         final List controllers = new ArrayList<PreferenceController>();
         controllers.add(new InstalledPackagesPreferenceController(context));
         controllers.add(new NetworkLogsPreferenceController(context));
         controllers.add(new BugReportsPreferenceController(context));
         controllers.add(new SecurityLogsPreferenceController(context));
-        controllers.add(new EnterpriseInstalledPackagesPreferenceController(context));
+        controllers.add(new EnterpriseInstalledPackagesPreferenceController(context, lifecycle,
+                async));
         controllers.add(new AdminGrantedLocationPermissionsPreferenceController(context));
         controllers.add(new AdminGrantedMicrophonePermissionPreferenceController(context));
         controllers.add(new AdminGrantedCameraPermissionPreferenceController(context));
-        controllers.add(new EnterpriseSetDefaultAppsPreferenceController(context));
+        controllers.add(new EnterpriseSetDefaultAppsPreferenceController(context, lifecycle));
         controllers.add(new AlwaysOnVpnPrimaryUserPreferenceController(context));
         controllers.add(new AlwaysOnVpnManagedProfilePreferenceController(context));
         controllers.add(new GlobalHttpProxyPreferenceController(context));
@@ -91,6 +98,11 @@
                     final SearchIndexableResource sir = new SearchIndexableResource(context);
                     sir.xmlResId = R.xml.enterprise_privacy_settings;
                     return Arrays.asList(sir);
+            }
+
+            @Override
+            public List<PreferenceController> getPreferenceControllers(Context context) {
+                return buildPreferenceControllers(context, null /* lifecycle */, false /* async */);
                 }
             };
 }
diff --git a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
index 08a72e3..ae76d63 100644
--- a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
+++ b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
@@ -22,22 +22,40 @@
 
 import com.android.settings.R;
 import com.android.settings.applications.ApplicationFeatureProvider;
-import com.android.settings.core.PreferenceController;
+import com.android.settings.core.DynamicAvailabilityPreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.overlay.FeatureFactory;
 
-public class EnterpriseSetDefaultAppsPreferenceController extends PreferenceController {
+public class EnterpriseSetDefaultAppsPreferenceController
+        extends DynamicAvailabilityPreferenceController {
 
     private static final String KEY_DEFAULT_APPS = "number_enterprise_set_default_apps";
     private final ApplicationFeatureProvider mFeatureProvider;
 
-    public EnterpriseSetDefaultAppsPreferenceController(Context context) {
-        super(context);
+    public EnterpriseSetDefaultAppsPreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
         mFeatureProvider = FeatureFactory.getFactory(context)
                 .getApplicationFeatureProvider(context);
     }
 
     @Override
     public void updateState(Preference preference) {
+        final int num = getNumberOfEnterpriseSetDefaultApps();
+        preference.setSummary(mContext.getResources().getQuantityString(
+                R.plurals.enterprise_privacy_number_packages, num, num));
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return getNumberOfEnterpriseSetDefaultApps() > 0;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_DEFAULT_APPS;
+    }
+
+    private int getNumberOfEnterpriseSetDefaultApps() {
         // Browser
         int num = mFeatureProvider.findPersistentPreferredActivities(new Intent[] {
                 buildIntent(Intent.ACTION_VIEW, Intent.CATEGORY_BROWSABLE, "http:", null)}).size();
@@ -64,23 +82,7 @@
         num += mFeatureProvider.findPersistentPreferredActivities(new Intent[] {
                 new Intent(Intent.ACTION_DIAL), new Intent(Intent.ACTION_CALL)}).size();
 
-        if (num == 0) {
-            preference.setVisible(false);
-        } else {
-            preference.setVisible(true);
-            preference.setSummary(mContext.getResources().getQuantityString(
-                    R.plurals.enterprise_privacy_number_packages, num, num));
-        }
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return true;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_DEFAULT_APPS;
+        return num;
     }
 
     private static Intent buildIntent(String action, String category, String protocol,
diff --git a/src/com/android/settings/enterprise/InstalledPackagesPreferenceController.java b/src/com/android/settings/enterprise/InstalledPackagesPreferenceController.java
index 4252429..43436b1 100644
--- a/src/com/android/settings/enterprise/InstalledPackagesPreferenceController.java
+++ b/src/com/android/settings/enterprise/InstalledPackagesPreferenceController.java
@@ -36,7 +36,7 @@
     @Override
     public void updateState(Preference preference) {
         mFeatureProvider.calculateNumberOfInstalledApps(
-                ApplicationFeatureProvider.IGNORE_INSTALL_REASON,
+                ApplicationFeatureProvider.IGNORE_INSTALL_REASON, true /* async */,
                 (num) -> {
                     if (num == 0) {
                         preference.setSummary("");
diff --git a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
index 2f344dc..3c8d933 100644
--- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
@@ -88,8 +88,7 @@
                 mPackageManagerService, mDevicePolicyManager);
     }
 
-    @Test
-    public void testCalculateNumberOfInstalledApps() {
+    private void testCalculateNumberOfInstalledApps(boolean async) {
         setUpUsersAndInstalledApps();
 
         when(mPackageManager.getInstallReason(APP_1, new UserHandle(MAIN_USER_ID)))
@@ -100,23 +99,33 @@
         // Count all installed apps.
         mAppCount = -1;
         mProvider.calculateNumberOfInstalledApps(ApplicationFeatureProvider.IGNORE_INSTALL_REASON,
-                (num) -> {
-                    mAppCount = num;
-                });
-        ShadowApplication.runBackgroundTasks();
+                async, (num) -> mAppCount = num);
+        if (async) {
+            ShadowApplication.runBackgroundTasks();
+        }
         assertThat(mAppCount).isEqualTo(2);
 
         // Count apps with specific install reason only.
         mAppCount = -1;
-        mProvider.calculateNumberOfInstalledApps(PackageManager.INSTALL_REASON_POLICY,
-                (num) -> {
-                    mAppCount = num;
-                });
-        ShadowApplication.runBackgroundTasks();
+        mProvider.calculateNumberOfInstalledApps(PackageManager.INSTALL_REASON_POLICY, async,
+                (num) -> mAppCount = num);
+        if (async) {
+            ShadowApplication.runBackgroundTasks();
+        }
         assertThat(mAppCount).isEqualTo(1);
     }
 
     @Test
+    public void testCalculateNumberOfInstalledAppsSync() {
+        testCalculateNumberOfInstalledApps(false /* async */);
+    }
+
+    @Test
+    public void testCalculateNumberOfInstalledAppsAsync() {
+        testCalculateNumberOfInstalledApps(true /* async */);
+    }
+
+    @Test
     public void testCalculateNumberOfAppsWithAdminGrantedPermissions() throws Exception {
         setUpUsersAndInstalledApps();
 
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java
index 458959c..8b1c9c9 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java
@@ -97,8 +97,7 @@
                         : new ArrayList<ResolveInfo>());
     }
 
-    @Test
-    public void testCountInstalledAppsAcrossAllUsers() {
+    private void testCountInstalledAppsAcrossAllUsers(boolean async) {
         // There are two users.
         mUsersToCount = Arrays.asList(
                 new UserInfo(MAIN_USER_ID, "main", UserInfo.FLAG_ADMIN),
@@ -156,12 +155,8 @@
         when(mPackageManager.getInstallReason(APP_6, managedProfileUser))
                 .thenReturn(PackageManager.INSTALL_REASON_UNKNOWN);
 
-        // Count the number of all apps installed, irrespective of install reason. Wait for the
-        // background task to finish.
-        (new InstalledAppCounterTestable(ApplicationFeatureProvider.IGNORE_INSTALL_REASON))
-                .execute();
-        ShadowApplication.runBackgroundTasks();
-
+        // Count the number of all apps installed, irrespective of install reason.
+        count(ApplicationFeatureProvider.IGNORE_INSTALL_REASON, async);
         assertThat(mInstalledAppCount).isEqualTo(5);
 
         // Verify that installed packages were retrieved for the users returned by
@@ -173,15 +168,34 @@
                 anyInt());
         verifyNoMoreInteractions(mPackageManager);
 
-        // Count once more, considering apps installed by enterprise policy only. Wait for the
-        // background task to finish.
-        mInstalledAppCount = -1;
-        (new InstalledAppCounterTestable(PackageManager.INSTALL_REASON_POLICY)).execute();
-        ShadowApplication.runBackgroundTasks();
-
+        // Count once more, considering apps installed by enterprise policy only.
+        count(PackageManager.INSTALL_REASON_POLICY, async);
         assertThat(mInstalledAppCount).isEqualTo(3);
     }
 
+    @Test
+    public void testCountInstalledAppsAcrossAllUsersSync() {
+        testCountInstalledAppsAcrossAllUsers(false /* async */);
+    }
+
+    @Test
+    public void testCountInstalledAppsAcrossAllUsersAsync() {
+        testCountInstalledAppsAcrossAllUsers(true /* async */);
+    }
+
+    private void count(int installReason, boolean async) {
+        mInstalledAppCount = -1;
+        final InstalledAppCounterTestable counter = new InstalledAppCounterTestable(installReason);
+        if (async) {
+            counter.execute();
+            // Wait for the background task to finish.
+            ShadowApplication.runBackgroundTasks();
+        } else {
+            counter.executeInForeground();
+        }
+    }
+
+
     private class InstalledAppCounterTestable extends InstalledAppCounter {
         public InstalledAppCounterTestable(int installReason) {
             super(mContext, installReason, mPackageManager);
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
index 46c29b2..6ff1703 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
@@ -62,18 +62,19 @@
         MockitoAnnotations.initMocks(this);
         FakeFeatureFactory.setupForTest(mContext);
         mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
-        mController = new EnterpriseInstalledPackagesPreferenceController(mContext);
+        mController = new EnterpriseInstalledPackagesPreferenceController(mContext,
+                null /* lifecycle */, true /* async */);
     }
 
-    private void setNumberOfEnterpriseInstalledPackages(int number) {
+    private void setNumberOfEnterpriseInstalledPackages(int number, boolean async) {
         doAnswer(new Answer() {
             public Object answer(InvocationOnMock invocation) {
                 ((ApplicationFeatureProvider.NumberOfAppsCallback)
-                        invocation.getArguments()[1]).onNumberOfAppsResult(number);
+                        invocation.getArguments()[2]).onNumberOfAppsResult(number);
                 return null;
             }}).when(mFeatureFactory.applicationFeatureProvider)
                     .calculateNumberOfInstalledApps(eq(PackageManager.INSTALL_REASON_POLICY),
-                            anyObject());
+                            eq(async), anyObject());
     }
 
     @Test
@@ -81,11 +82,11 @@
         final Preference preference = new Preference(mContext, null, 0, 0);
         preference.setVisible(true);
 
-        setNumberOfEnterpriseInstalledPackages(0);
+        setNumberOfEnterpriseInstalledPackages(0, true /* async */);
         mController.updateState(preference);
         assertThat(preference.isVisible()).isFalse();
 
-        setNumberOfEnterpriseInstalledPackages(20);
+        setNumberOfEnterpriseInstalledPackages(20, true /* async */);
         when(mContext.getResources().getQuantityString(R.plurals.enterprise_privacy_number_packages,
                 20, 20)).thenReturn("20 packages");
         mController.updateState(preference);
@@ -94,7 +95,24 @@
     }
 
     @Test
-    public void testIsAvailable() {
+    public void testIsAvailableSync() {
+        EnterpriseInstalledPackagesPreferenceController controller
+                = new EnterpriseInstalledPackagesPreferenceController(mContext,
+                        null /* lifecycle */, false /* async */);
+
+        setNumberOfEnterpriseInstalledPackages(0, false /* async */);
+        assertThat(controller.isAvailable()).isFalse();
+
+        setNumberOfEnterpriseInstalledPackages(20, false /* async */);
+        assertThat(controller.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void testIsAvailableAsync() {
+        setNumberOfEnterpriseInstalledPackages(0, true /* async */);
+        assertThat(mController.isAvailable()).isTrue();
+
+        setNumberOfEnterpriseInstalledPackages(20, true /* async */);
         assertThat(mController.isAvailable()).isTrue();
     }
 
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java
index 29ca4cd..46d6b6c 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java
@@ -104,6 +104,18 @@
     public void getPreferenceControllers() {
         final List<PreferenceController> controllers = mSettings.getPreferenceControllers(
                 ShadowApplication.getInstance().getApplicationContext());
+        verifyPreferenceControllers(controllers);
+    }
+
+    @Test
+    public void getSearchIndexProviderPreferenceControllers() {
+        final List<PreferenceController> controllers
+                = EnterprisePrivacySettings.SEARCH_INDEX_DATA_PROVIDER.getPreferenceControllers(
+                        ShadowApplication.getInstance().getApplicationContext());
+        verifyPreferenceControllers(controllers);
+    }
+
+    private void verifyPreferenceControllers(List<PreferenceController> controllers) {
         assertThat(controllers).isNotNull();
         assertThat(controllers.size()).isEqualTo(17);
         assertThat(controllers.get(0)).isInstanceOf(InstalledPackagesPreferenceController.class);
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceControllerTest.java
index 093ce20..3455e80 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceControllerTest.java
@@ -65,7 +65,8 @@
         MockitoAnnotations.initMocks(this);
         FakeFeatureFactory.setupForTest(mContext);
         mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
-        mController = new EnterpriseSetDefaultAppsPreferenceController(mContext);
+        mController = new EnterpriseSetDefaultAppsPreferenceController(mContext,
+                null /* lifecycle */);
     }
 
     private static Intent buildIntent(String action, String category, String protocol,
@@ -95,15 +96,6 @@
 
     @Test
     public void testUpdateState() {
-        final Preference preference = new Preference(mContext, null, 0, 0);
-        preference.setVisible(true);
-
-        when(mFeatureFactory.applicationFeatureProvider.findPersistentPreferredActivities(
-                anyObject())).thenReturn(
-                        new ArraySet<ApplicationFeatureProvider.PersistentPreferredActivityInfo>());
-        mController.updateState(preference);
-        assertThat(preference.isVisible()).isFalse();
-
         setEnterpriseSetDefaultApps(new Intent[] {buildIntent(Intent.ACTION_VIEW,
                 Intent.CATEGORY_BROWSABLE, "http:", null)}, 1);
         setEnterpriseSetDefaultApps(new Intent[] {new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
@@ -120,13 +112,21 @@
                 new Intent(Intent.ACTION_CALL)}, 64);
         when(mContext.getResources().getQuantityString(R.plurals.enterprise_privacy_number_packages,
                 127, 127)).thenReturn("127 apps");
+
+        final Preference preference = new Preference(mContext, null, 0, 0);
         mController.updateState(preference);
         assertThat(preference.getSummary()).isEqualTo("127 apps");
-        assertThat(preference.isVisible()).isTrue();
     }
 
     @Test
     public void testIsAvailable() {
+        when(mFeatureFactory.applicationFeatureProvider.findPersistentPreferredActivities(
+                anyObject())).thenReturn(
+                        new ArraySet<ApplicationFeatureProvider.PersistentPreferredActivityInfo>());
+        assertThat(mController.isAvailable()).isFalse();
+
+        setEnterpriseSetDefaultApps(new Intent[] {buildIntent(Intent.ACTION_VIEW,
+                Intent.CATEGORY_BROWSABLE, "http:", null)}, 1);
         assertThat(mController.isAvailable()).isTrue();
     }
 
diff --git a/tests/robotests/src/com/android/settings/enterprise/InstalledPackagesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/InstalledPackagesPreferenceControllerTest.java
index 60ceed6..4a5a183 100644
--- a/tests/robotests/src/com/android/settings/enterprise/InstalledPackagesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/InstalledPackagesPreferenceControllerTest.java
@@ -68,11 +68,10 @@
         doAnswer(new Answer() {
             public Object answer(InvocationOnMock invocation) {
                 ((ApplicationFeatureProvider.NumberOfAppsCallback)
-                        invocation.getArguments()[1]).onNumberOfAppsResult(number);
+                        invocation.getArguments()[2]).onNumberOfAppsResult(number);
                 return null;
-            }}).when(mFeatureFactory.applicationFeatureProvider)
-                    .calculateNumberOfInstalledApps(
-                            eq(ApplicationFeatureProvider.IGNORE_INSTALL_REASON), anyObject());
+            }}).when(mFeatureFactory.applicationFeatureProvider).calculateNumberOfInstalledApps(
+                    eq(ApplicationFeatureProvider.IGNORE_INSTALL_REASON), eq(true), anyObject());
     }
 
     @Test