Prevent the disabling of specified apps

Prevent the disabling of specified apps, avoiding cases
where disabling the app may result in an unusable system.

Bug: 200043113
Test: make RunSettingsRoboTests ROBOTEST_FILTER=ApplicationFeatureProviderImplTest

Change-Id: I0b298af76cec20e4f31ec7411bbf3200a2869035
Merged-In: I0b298af76cec20e4f31ec7411bbf3200a2869035
diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
index 80d3947..371326c 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
@@ -30,6 +30,7 @@
 import android.content.pm.UserInfo;
 import android.location.LocationManager;
 import android.os.RemoteException;
+import android.os.SystemConfigManager;
 import android.os.UserManager;
 import android.service.euicc.EuiccService;
 import android.telecom.DefaultDialerManager;
@@ -54,6 +55,8 @@
     private final IPackageManager mPms;
     private final DevicePolicyManager mDpm;
     private final UserManager mUm;
+    private final SystemConfigManager mSystemConfigManager;
+
     /** Flags to use when querying PackageManager for Euicc component implementations. */
     private static final int EUICC_QUERY_FLAGS =
             PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING
@@ -66,6 +69,7 @@
         mPms = pms;
         mDpm = dpm;
         mUm = UserManager.get(mContext);
+        mSystemConfigManager = context.getSystemService(SystemConfigManager.class);
     }
 
     @Override
@@ -167,6 +171,7 @@
         if (locationHistoryPackage != null) {
             keepEnabledPackages.add(locationHistoryPackage);
         }
+        keepEnabledPackages.addAll(mSystemConfigManager.getPreventUserDisablePackages());
         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 7044389..5fef809 100644
--- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java
@@ -35,6 +35,7 @@
 import android.content.pm.UserInfo;
 import android.location.LocationManager;
 import android.os.Build;
+import android.os.SystemConfigManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 
@@ -76,6 +77,9 @@
 
     private final String PERMISSION = "some.permission";
 
+    private final List<String> PREVENT_USER_DISABLE_PACKAGES = List.of(
+            "prevent.disable.package1", "prevent.disable.package2", "prevent.disable.package3");
+
     @Mock
     private UserManager mUserManager;
     @Mock
@@ -88,6 +92,8 @@
     private DevicePolicyManager mDevicePolicyManager;
     @Mock
     private LocationManager mLocationManager;
+    @Mock
+    private SystemConfigManager mSystemConfigManager;
 
     private ApplicationFeatureProvider mProvider;
 
@@ -101,6 +107,7 @@
         when(mContext.getApplicationContext()).thenReturn(mContext);
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
+        when(mContext.getSystemService(SystemConfigManager.class)).thenReturn(mSystemConfigManager);
 
         mProvider = new ApplicationFeatureProviderImpl(mContext, mPackageManager,
                 mPackageManagerService, mDevicePolicyManager);
@@ -356,6 +363,16 @@
         assertThat(allowlist).contains("com.android.packageinstaller");
     }
 
+    @Test
+    public void getKeepEnabledPackages_shouldContainPreventUserDisablePackages() {
+        when(mSystemConfigManager.getPreventUserDisablePackages())
+                .thenReturn(PREVENT_USER_DISABLE_PACKAGES);
+
+        final Set<String> keepEnabledPackages = mProvider.getKeepEnabledPackages();
+
+        assertThat(keepEnabledPackages).containsAtLeastElementsIn(PREVENT_USER_DISABLE_PACKAGES);
+    }
+
     private void setUpUsersAndInstalledApps() {
         when(mUserManager.getProfiles(UserHandle.myUserId())).thenReturn(Arrays.asList(
                 new UserInfo(MAIN_USER_ID, "main", UserInfo.FLAG_ADMIN),