Loading services/core/java/com/android/server/pm/PackageManagerService.java +7 −7 Original line number Diff line number Diff line Loading @@ -24299,24 +24299,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); } }); } } services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt +31 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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( Loading Loading
services/core/java/com/android/server/pm/PackageManagerService.java +7 −7 Original line number Diff line number Diff line Loading @@ -24299,24 +24299,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); } }); } }
services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt +31 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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( Loading