diff --git a/res/values/config.xml b/res/values/config.xml index 805469a63e5..eaa2b3ee94d 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -156,6 +156,11 @@ com.android.settings.intelligence + + + com.android.packageinstaller + + diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index 55e85f93f2c..7027239f52e 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -140,9 +140,9 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide if (defaultSms != null) { keepEnabledPackages.add(defaultSms.getPackageName()); } - // Keep Settings intelligence enabled, otherwise search feature will be disabled. - keepEnabledPackages.add( - mContext.getString(R.string.config_settingsintelligence_package_name)); + + keepEnabledPackages.addAll(getEnabledPackageWhitelist()); + final LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); final String locationHistoryPackage = locationManager.getExtraLocationControllerPackage(); @@ -152,6 +152,19 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide return keepEnabledPackages; } + private Set getEnabledPackageWhitelist() { + final Set keepEnabledPackages = new ArraySet<>(); + + // Keep Settings intelligence enabled, otherwise search feature will be disabled. + keepEnabledPackages.add( + mContext.getString(R.string.config_settingsintelligence_package_name)); + + // Keep Package Installer enabled. + keepEnabledPackages.add(mContext.getString(R.string.config_package_installer_package_name)); + + return keepEnabledPackages; + } + private static class CurrentUserAndManagedProfilePolicyInstalledAppCounter extends InstalledAppCounter { private NumberOfAppsCallback mCallback; @@ -219,5 +232,4 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide mCallback.onListOfAppsResult(list); } } - } diff --git a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java index e22b29bcd0f..fcb7518c270 100644 --- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java @@ -265,8 +265,6 @@ public final class ApplicationFeatureProviderImplTest { final String testSms = "com.android.test.defaultsms"; final String testLocationHistory = "com.android.test.location.history"; - final String settingsIntelligence = RuntimeEnvironment.application.getString( - R.string.config_settingsintelligence_package_name); ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver")); ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer); @@ -280,8 +278,52 @@ public final class ApplicationFeatureProviderImplTest { final Set keepEnabledPackages = mProvider.getKeepEnabledPackages(); final List expectedPackages = Arrays.asList(testDialer, testSms, - settingsIntelligence, testLocationHistory); - assertThat(keepEnabledPackages).containsExactlyElementsIn(expectedPackages); + testLocationHistory); + assertThat(keepEnabledPackages).containsAllIn(expectedPackages); + } + + @Test + @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class}) + public void getKeepEnabledPackages_shouldContainSettingsIntelligence() { + final String testDialer = "com.android.test.defaultdialer"; + final String testSms = "com.android.test.defaultsms"; + final String testLocationHistory = "com.android.test.location.history"; + + ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver")); + ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer); + + // Spy the real context to mock LocationManager. + Context spyContext = spy(RuntimeEnvironment.application); + when(mLocationManager.getExtraLocationControllerPackage()).thenReturn(testLocationHistory); + when(spyContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager); + + ReflectionHelpers.setField(mProvider, "mContext", spyContext); + + final Set whitelist = mProvider.getKeepEnabledPackages(); + + assertThat(whitelist).contains("com.android.settings.intelligence"); + } + + @Test + @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class}) + public void getKeepEnabledPackages_shouldContainPackageInstaller() { + final String testDialer = "com.android.test.defaultdialer"; + final String testSms = "com.android.test.defaultsms"; + final String testLocationHistory = "com.android.test.location.history"; + + ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver")); + ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer); + + // Spy the real context to mock LocationManager. + Context spyContext = spy(RuntimeEnvironment.application); + when(mLocationManager.getExtraLocationControllerPackage()).thenReturn(testLocationHistory); + when(spyContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager); + + ReflectionHelpers.setField(mProvider, "mContext", spyContext); + + final Set whitelist = mProvider.getKeepEnabledPackages(); + + assertThat(whitelist).contains("com.android.packageinstaller"); } private void setUpUsersAndInstalledApps() {