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

Commit 4b12d4a0 authored by Kevin Han's avatar Kevin Han Committed by Automerger Merge Worker
Browse files

Merge "Add hibernation NPE check and unhibernate only if hibernating" into sc-v2-dev am: fdd7b1a0

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16374644

Change-Id: I86abe904a35ba229ec3047619563b0827c55815f
parents 4e657826 fdd7b1a0
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -24310,24 +24310,24 @@ public class PackageManagerService extends IPackageManager.Stub
        }
        enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
                true /* checkShell */, "stop package");
        boolean shouldUnhibernate = false;
        // writer
        synchronized (mLock) {
            final PackageSetting ps = mSettings.getPackageLPr(packageName);
            if (ps != null && ps.getStopped(userId) && !stopped) {
                shouldUnhibernate = true;
            }
            if (!shouldFilterApplicationLocked(ps, callingUid, userId)
                    && mSettings.setPackageStoppedStateLPw(this, packageName, stopped, userId)) {
                scheduleWritePackageRestrictionsLocked(userId);
            }
        }
        if (shouldUnhibernate) {
        // If this would cause the app to leave force-stop, then also make sure to unhibernate the
        // app if needed.
        if (!stopped) {
            mHandler.post(() -> {
                AppHibernationManagerInternal ah =
                        mInjector.getLocalService(AppHibernationManagerInternal.class);
                if (ah != null && ah.isHibernatingForUser(packageName, userId)) {
                    ah.setHibernatingForUser(packageName, userId, false);
                    ah.setHibernatingGlobally(packageName, false);
                }
            });
        }
    }
+31 −2
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.server.apphibernation.AppHibernationManagerInternal
import com.android.server.apphibernation.AppHibernationService
import com.android.server.extendedtestutils.wheneverStatic
import com.android.server.testutils.whenever
import org.junit.Assert
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
@@ -100,8 +101,11 @@ class PackageManagerServiceHibernationTests {
            rule.system().dataAppDirectory)
        val pm = createPackageManagerService()
        rule.system().validateFinalState()
        val ps = pm.getPackageSetting(TEST_PACKAGE_NAME)
        ps!!.setStopped(true, TEST_USER_ID)

        TestableLooper.get(this).processAllMessages()

        whenever(appHibernationManager.isHibernatingForUser(TEST_PACKAGE_NAME, TEST_USER_ID))
            .thenReturn(true)

        pm.setPackageStoppedState(TEST_PACKAGE_NAME, false, TEST_USER_ID)

@@ -111,6 +115,31 @@ class PackageManagerServiceHibernationTests {
        verify(appHibernationManager).setHibernatingGlobally(TEST_PACKAGE_NAME, false)
    }

    @Test
    fun testExitForceStop_nonExistingAppHibernationManager_doesNotThrowException() {
        whenever(rule.mocks().injector.getLocalService(AppHibernationManagerInternal::class.java))
            .thenReturn(null)

        rule.system().stageScanExistingPackage(
            TEST_PACKAGE_NAME,
            1L,
            rule.system().dataAppDirectory)
        val pm = createPackageManagerService()
        rule.system().validateFinalState()

        TestableLooper.get(this).processAllMessages()

        whenever(appHibernationManager.isHibernatingForUser(TEST_PACKAGE_NAME, TEST_USER_ID))
            .thenReturn(true)

        try {
            pm.setPackageStoppedState(TEST_PACKAGE_NAME, false, TEST_USER_ID)
            TestableLooper.get(this).processAllMessages()
        } catch (e: Exception) {
            Assert.fail("Method throws exception when AppHibernationManager is not ready.\n$e")
        }
    }

    @Test
    fun testGetOptimizablePackages_ExcludesGloballyHibernatingPackages() {
        rule.system().stageScanExistingPackage(