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
This commit is contained in:
@@ -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 static com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS;
|
||||||
|
|
||||||
import android.app.AppOpsManager;
|
import android.app.AppOpsManager;
|
||||||
|
import android.apphibernation.AppHibernationManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.provider.DeviceConfig;
|
import android.provider.DeviceConfig;
|
||||||
@@ -134,8 +135,15 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen
|
|||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object isChecked) {
|
public boolean onPreferenceChange(Preference preference, Object isChecked) {
|
||||||
try {
|
try {
|
||||||
|
final boolean checked = (boolean) isChecked;
|
||||||
mAppOpsManager.setUidMode(OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, mPackageUid,
|
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) {
|
} catch (RuntimeException e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -34,6 +34,7 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.app.AppOpsManager;
|
import android.app.AppOpsManager;
|
||||||
|
import android.apphibernation.AppHibernationManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.provider.DeviceConfig;
|
import android.provider.DeviceConfig;
|
||||||
@@ -61,6 +62,8 @@ public class HibernationSwitchPreferenceControllerTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
@Mock
|
@Mock
|
||||||
|
private AppHibernationManager mAppHibernationManager;
|
||||||
|
@Mock
|
||||||
private SwitchPreference mPreference;
|
private SwitchPreference mPreference;
|
||||||
|
|
||||||
private HibernationSwitchPreferenceController mController;
|
private HibernationSwitchPreferenceController mController;
|
||||||
@@ -71,6 +74,8 @@ public class HibernationSwitchPreferenceControllerTest {
|
|||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
|
when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
|
||||||
|
when(mContext.getSystemService(AppHibernationManager.class))
|
||||||
|
.thenReturn(mAppHibernationManager);
|
||||||
when(mPackageManager.getPackageUid(eq(VALID_PACKAGE_NAME), anyInt()))
|
when(mPackageManager.getPackageUid(eq(VALID_PACKAGE_NAME), anyInt()))
|
||||||
.thenReturn(PACKAGE_UID);
|
.thenReturn(PACKAGE_UID);
|
||||||
when(mPackageManager.getPackageUid(eq(INVALID_PACKAGE_NAME), anyInt()))
|
when(mPackageManager.getPackageUid(eq(INVALID_PACKAGE_NAME), anyInt()))
|
||||||
@@ -109,6 +114,15 @@ public class HibernationSwitchPreferenceControllerTest {
|
|||||||
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
|
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
|
@Test
|
||||||
public void updateState_exemptedByDefaultPackage_shouldNotCheck() {
|
public void updateState_exemptedByDefaultPackage_shouldNotCheck() {
|
||||||
when(mAppOpsManager.unsafeCheckOpNoThrow(
|
when(mAppOpsManager.unsafeCheckOpNoThrow(
|
||||||
|
Reference in New Issue
Block a user