Do not allow force stopping protected packages

Bug: 75997475
Test: make RunSettingsRoboTests
Test: manual
Change-Id: I0670f6f0afbc603d8ac61711cfefec2b1fc4b43b
diff --git a/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceController.java b/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceController.java
index 130138c..6e978dc 100644
--- a/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceController.java
@@ -283,6 +283,10 @@
             // User can't force stop device admin.
             Log.w(TAG, "User can't force stop device admin");
             updateForceStopButton(false);
+        } else if (mPm.isPackageStateProtected(packageInfo.packageName,
+            UserHandle.getUserId(appEntry.info.uid))) {
+            Log.w(TAG, "User can't force stop protected packages");
+            updateForceStopButton(false);
         } else if (AppUtils.isInstant(packageInfo.applicationInfo)) {
             updateForceStopButton(false);
             mActionButtons.setButton2Visible(false);
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceControllerTest.java
index d7c2964..e571521 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppActionButtonPreferenceControllerTest.java
@@ -79,6 +79,8 @@
     private AppInfoDashboardFragment mFragment;
     @Mock
     private ApplicationInfo mAppInfo;
+    @Mock
+    private PackageManager mPackageManager;
 
     private Context mContext;
     private AppActionButtonPreferenceController mController;
@@ -95,7 +97,9 @@
         ReflectionHelpers.setField(mController, "mDpm", mDevicePolicyManager);
         ReflectionHelpers.setField(mController, "mApplicationFeatureProvider",
                 mFeatureFactory.applicationFeatureProvider);
+        ReflectionHelpers.setField(mController, "mPm", mPackageManager);
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
         final PackageInfo packageInfo = mock(PackageInfo.class);
         packageInfo.applicationInfo = mAppInfo;
         when(mFragment.getPackageInfo()).thenReturn(packageInfo);
@@ -214,6 +218,25 @@
     }
 
     @Test
+    public void checkForceStop_isStateProtected_shouldDisableForceStop() {
+        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
+            (InstantAppDataProvider) (i -> false));
+        final String packageName = "Package1";
+        final PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = packageName;
+        final ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = 42;
+        appInfo.sourceDir = "source";
+        final ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(
+            mContext, appInfo, 0);
+        when(mPackageManager.isPackageStateProtected(packageName, 0)).thenReturn(true);
+
+        mController.checkForceStop(appEntry, packageInfo);
+
+        verify(mController.mActionButtons).setButton2Enabled(false);
+    }
+
+    @Test
     public void checkForceStop_hasActiveAdmin_shouldDisableForceStop() {
         ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
                 (InstantAppDataProvider) (i -> false));