Merge "Make location history package not disableable."
diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
index c246c58..4bda99e 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
@@ -25,6 +25,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.UserInfo;
+import android.location.LocationManager;
 import android.os.RemoteException;
 import android.os.UserManager;
 import android.telecom.DefaultDialerManager;
@@ -142,6 +143,12 @@
         // Keep Settings intelligence enabled, otherwise search feature will be disabled.
         keepEnabledPackages.add(
                 mContext.getString(R.string.config_settingsintelligence_package_name));
+        final LocationManager locationManager =
+                (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
+        final String locationHistoryPackage = locationManager.getLocationControllerExtraPackage();
+        if (locationHistoryPackage != null) {
+            keepEnabledPackages.add(locationHistoryPackage);
+        }
         return keepEnabledPackages;
     }
 
diff --git a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
index 9cfdf98..ebbf5e0 100644
--- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.app.admin.DevicePolicyManager;
@@ -30,6 +31,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.UserInfo;
+import android.location.LocationManager;
 import android.os.Build;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -83,6 +85,8 @@
     private IPackageManager mPackageManagerService;
     @Mock
     private DevicePolicyManager mDevicePolicyManager;
+    @Mock
+    private LocationManager mLocationManager;
 
     private ApplicationFeatureProvider mProvider;
 
@@ -95,6 +99,7 @@
 
         when(mContext.getApplicationContext()).thenReturn(mContext);
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
 
         mProvider = new ApplicationFeatureProviderImpl(mContext, mPackageManager,
                 mPackageManagerService, mDevicePolicyManager);
@@ -255,19 +260,27 @@
 
     @Test
     @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class})
-    public void getKeepEnabledPackages_shouldContainDefaultPhoneAndSms() {
+    public void getKeepEnabledPackages_shouldContainDefaultPhoneAndSmsAndLocationHistory() {
         final String testDialer = "com.android.test.defaultdialer";
         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);
-        ReflectionHelpers.setField(mProvider, "mContext", RuntimeEnvironment.application);
+
+        // Spy the real context to mock LocationManager.
+        Context spyContext = spy(RuntimeEnvironment.application);
+        when(mLocationManager.getLocationControllerExtraPackage()).thenReturn(testLocationHistory);
+        when(spyContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
+
+        ReflectionHelpers.setField(mProvider, "mContext", spyContext);
 
         final Set<String> keepEnabledPackages = mProvider.getKeepEnabledPackages();
 
         final List<String> expectedPackages = Arrays.asList(testDialer, testSms,
-                settingsIntelligence);
+                settingsIntelligence, testLocationHistory);
         assertThat(keepEnabledPackages).containsExactlyElementsIn(expectedPackages);
     }