From 5dc168af1add029df23674f60eb4130b82012e70 Mon Sep 17 00:00:00 2001 From: Bartosz Fabianowski Date: Fri, 10 Mar 2017 15:47:14 +0100 Subject: [PATCH] Start removing N/A DO disclosures from search index DO disclosures referring to actions that the admin did not actually take are hidden in the UI, but still show up in the search index. This CL takes the following steps toward fixing this: * Pass the list of PreferenceControllers to the search indexer * Make the first two PrefrenceControllers set isAvailable() correctly There are more disclosures to update, but the difficult work is done as all others will follow the same pattern. Bug: 32692748 Test: m RunSettingsRoboTests Change-Id: I7d3e248b80abe72b79fce7afa11f28a822de6986 --- .../settings/applications/AppCounter.java | 4 ++ .../ApplicationFeatureProvider.java | 8 ++-- .../ApplicationFeatureProviderImpl.java | 11 ++++- ...InstalledPackagesPreferenceController.java | 30 ++++++++++--- .../enterprise/EnterprisePrivacySettings.java | 16 ++++++- ...iseSetDefaultAppsPreferenceController.java | 44 ++++++++++--------- ...InstalledPackagesPreferenceController.java | 2 +- .../ApplicationFeatureProviderImplTest.java | 31 ++++++++----- .../applications/InstalledAppCounterTest.java | 42 ++++++++++++------ ...alledPackagesPreferenceControllerTest.java | 32 +++++++++++--- .../EnterprisePrivacySettingsTest.java | 12 +++++ ...etDefaultAppsPreferenceControllerTest.java | 22 +++++----- ...alledPackagesPreferenceControllerTest.java | 7 ++- 13 files changed, 179 insertions(+), 82 deletions(-) diff --git a/src/com/android/settings/applications/AppCounter.java b/src/com/android/settings/applications/AppCounter.java index 946453192ae..09a10e286bc 100644 --- a/src/com/android/settings/applications/AppCounter.java +++ b/src/com/android/settings/applications/AppCounter.java @@ -57,6 +57,10 @@ public abstract class AppCounter extends AsyncTask { onCountComplete(count); } + void executeInForeground() { + onPostExecute(doInBackground()); + } + protected abstract void onCountComplete(int num); protected abstract List 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 fccbbd3c67c..7dce7936606 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProvider.java +++ b/src/com/android/settings/applications/ApplicationFeatureProvider.java @@ -35,15 +35,17 @@ public interface ApplicationFeatureProvider { 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 31d26ed9eee..5ba228f4a8e 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -56,8 +56,15 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide } @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 9b4be3a3e82..93c1909148f 100644 --- a/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java +++ b/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java @@ -20,25 +20,30 @@ import android.support.v7.preference.Preference; 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 @@ public class EnterpriseInstalledPackagesPreferenceController extends PreferenceC @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 3f66f02ff1a..0fb341a4993 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java @@ -22,6 +22,7 @@ import android.provider.SearchIndexableResource; 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 @@ public class EnterprisePrivacySettings extends DashboardFragment { @Override protected List getPreferenceControllers(Context context) { + return buildPreferenceControllers(context, getLifecycle(), true /* async */); + } + + private static List buildPreferenceControllers(Context context, + Lifecycle lifecycle, boolean async) { final List controllers = new ArrayList(); 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 @@ public class EnterprisePrivacySettings extends DashboardFragment { final SearchIndexableResource sir = new SearchIndexableResource(context); sir.xmlResId = R.xml.enterprise_privacy_settings; return Arrays.asList(sir); + } + + @Override + public List 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 08a72e3fe39..ae76d63e43a 100644 --- a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java +++ b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java @@ -22,22 +22,40 @@ import android.support.v7.preference.Preference; 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 @@ public class EnterpriseSetDefaultAppsPreferenceController extends PreferenceCont 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 4252429849f..43436b147d1 100644 --- a/src/com/android/settings/enterprise/InstalledPackagesPreferenceController.java +++ b/src/com/android/settings/enterprise/InstalledPackagesPreferenceController.java @@ -36,7 +36,7 @@ public class InstalledPackagesPreferenceController extends PreferenceController @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 2f344dc029b..3c8d933fa66 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 @@ public final class ApplicationFeatureProviderImplTest { mPackageManagerService, mDevicePolicyManager); } - @Test - public void testCalculateNumberOfInstalledApps() { + private void testCalculateNumberOfInstalledApps(boolean async) { setUpUsersAndInstalledApps(); when(mPackageManager.getInstallReason(APP_1, new UserHandle(MAIN_USER_ID))) @@ -100,22 +99,32 @@ public final class ApplicationFeatureProviderImplTest { // 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 458959ca653..8b1c9c9e0ab 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 @@ public final class InstalledAppCounterTest { : new ArrayList()); } - @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 @@ public final class InstalledAppCounterTest { 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 @@ public final class InstalledAppCounterTest { 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 46c29b269c0..6ff1703e835 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 @@ public final class EnterpriseInstalledPackagesPreferenceControllerTest { 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 @@ public final class EnterpriseInstalledPackagesPreferenceControllerTest { 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 @@ public final class EnterpriseInstalledPackagesPreferenceControllerTest { } @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 29ca4cd52b3..46d6b6c6e6b 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 final class EnterprisePrivacySettingsTest { public void getPreferenceControllers() { final List controllers = mSettings.getPreferenceControllers( ShadowApplication.getInstance().getApplicationContext()); + verifyPreferenceControllers(controllers); + } + + @Test + public void getSearchIndexProviderPreferenceControllers() { + final List controllers + = EnterprisePrivacySettings.SEARCH_INDEX_DATA_PROVIDER.getPreferenceControllers( + ShadowApplication.getInstance().getApplicationContext()); + verifyPreferenceControllers(controllers); + } + + private void verifyPreferenceControllers(List 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 093ce2038dc..3455e80dc1c 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 @@ public final class EnterpriseSetDefaultAppsPreferenceControllerTest { 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 @@ public final class EnterpriseSetDefaultAppsPreferenceControllerTest { @Test public void testUpdateState() { - final Preference preference = new Preference(mContext, null, 0, 0); - preference.setVisible(true); - - when(mFeatureFactory.applicationFeatureProvider.findPersistentPreferredActivities( - anyObject())).thenReturn( - new ArraySet()); - 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 @@ public final class EnterpriseSetDefaultAppsPreferenceControllerTest { 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()); + 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 60ceed6d460..4a5a183d4a5 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 @@ public final class InstalledPackagesPreferenceControllerTest { 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