Unhibernate an app when a user exempts it

When an app is exempted from hibernation, we unhibernate as well. This
prevents confusing situations where a user may return to the "Unused
Apps" page and sees that the app is still there even after exemption.

Bug: 205641871
Test: atest HibernationSwitchPreferenceControllerTest
Change-Id: I4f98a2212eefdb6c456a0de36d428021b262cca3
diff --git a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java
index 1d34a13..d922867 100644
--- a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java
@@ -26,6 +26,7 @@
 import static com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS;
 
 import android.app.AppOpsManager;
+import android.apphibernation.AppHibernationManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.provider.DeviceConfig;
@@ -134,8 +135,15 @@
     @Override
     public boolean onPreferenceChange(Preference preference, Object isChecked) {
         try {
+            final boolean checked = (boolean) isChecked;
             mAppOpsManager.setUidMode(OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, mPackageUid,
-                    (boolean) isChecked ? MODE_ALLOWED : MODE_IGNORED);
+                    checked ? MODE_ALLOWED : MODE_IGNORED);
+            if (!checked) {
+                final AppHibernationManager ahm =
+                        mContext.getSystemService(AppHibernationManager.class);
+                ahm.setHibernatingForUser(mPackageName, false);
+                ahm.setHibernatingGlobally(mPackageName, false);
+            }
         } catch (RuntimeException e) {
             return false;
         }
diff --git a/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java
index 1e1799a..567594c 100644
--- a/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceControllerTest.java
@@ -34,6 +34,7 @@
 import static org.mockito.Mockito.when;
 
 import android.app.AppOpsManager;
+import android.apphibernation.AppHibernationManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.provider.DeviceConfig;
@@ -61,6 +62,8 @@
     @Mock
     private PackageManager mPackageManager;
     @Mock
+    private AppHibernationManager mAppHibernationManager;
+    @Mock
     private SwitchPreference mPreference;
 
     private HibernationSwitchPreferenceController mController;
@@ -71,6 +74,8 @@
         MockitoAnnotations.initMocks(this);
         mContext = spy(ApplicationProvider.getApplicationContext());
         when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
+        when(mContext.getSystemService(AppHibernationManager.class))
+                .thenReturn(mAppHibernationManager);
         when(mPackageManager.getPackageUid(eq(VALID_PACKAGE_NAME), anyInt()))
                 .thenReturn(PACKAGE_UID);
         when(mPackageManager.getPackageUid(eq(INVALID_PACKAGE_NAME), anyInt()))
@@ -110,6 +115,15 @@
     }
 
     @Test
+    public void onPreferenceChange_unhibernatesWhenExempted() {
+        mController.setPackage(VALID_PACKAGE_NAME);
+        mController.onPreferenceChange(mPreference, false);
+
+        verify(mAppHibernationManager).setHibernatingForUser(VALID_PACKAGE_NAME, false);
+        verify(mAppHibernationManager).setHibernatingGlobally(VALID_PACKAGE_NAME, false);
+    }
+
+    @Test
     public void updateState_exemptedByDefaultPackage_shouldNotCheck() {
         when(mAppOpsManager.unsafeCheckOpNoThrow(
                 eq(OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED), anyInt(), eq(EXEMPTED_PACKAGE_NAME)))