Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83a8b76e authored by Kevin Han's avatar Kevin Han Committed by Android (Google) Code Review
Browse files

Merge "Unhibernate an app when a user exempts it" into sc-v2-dev

parents 03b049e8 39f03813
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -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;
        }
+14 −0
Original line number Diff line number Diff line
@@ -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(