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() {