diff --git a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java index 1d34a13e1ff..d9228673552 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_APP_HIBERNATION_ENABLED; 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 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen @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 1e1799a282b..567594c8eb2 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.verify; 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 @@ public class HibernationSwitchPreferenceControllerTest { @Mock private PackageManager mPackageManager; @Mock + private AppHibernationManager mAppHibernationManager; + @Mock private SwitchPreference mPreference; private HibernationSwitchPreferenceController mController; @@ -71,6 +74,8 @@ public class HibernationSwitchPreferenceControllerTest { 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())) @@ -109,6 +114,15 @@ public class HibernationSwitchPreferenceControllerTest { assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } + @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(