diff options
Diffstat (limited to 'services')
15 files changed, 225 insertions, 134 deletions
diff --git a/services/api/current.txt b/services/api/current.txt index 35a4dcb45674..834ed2f67865 100644 --- a/services/api/current.txt +++ b/services/api/current.txt @@ -76,6 +76,7 @@ package com.android.server.pm.pkg { method @Nullable public String getSdkLibraryName(); method @NonNull public java.util.List<com.android.server.pm.pkg.AndroidPackageSplit> getSplits(); method @Nullable public String getStaticSharedLibraryName(); + method @NonNull public java.util.UUID getStorageUuid(); method public int getTargetSdkVersion(); method public boolean isDebuggable(); method public boolean isIsolatedSplitLoading(); diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java index b56d1fca7f6a..b4ab254b06e7 100644 --- a/services/core/java/com/android/server/RescueParty.java +++ b/services/core/java/com/android/server/RescueParty.java @@ -447,6 +447,13 @@ public class RescueParty { thread.start(); break; case LEVEL_FACTORY_RESET: + // Before the completion of Reboot, if any crash happens then PackageWatchdog + // escalates to next level i.e. factory reset, as they happen in separate threads. + // Adding a check to prevent factory reset to execute before above reboot completes. + // Note: this reboot property is not persistent resets after reboot is completed. + if (isRebootPropertySet()) { + break; + } SystemProperties.set(PROP_ATTEMPTING_FACTORY_RESET, "true"); runnable = new Runnable() { @Override diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index b92c1635d7c6..a954164fb79f 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -338,7 +338,18 @@ public final class GameManagerService extends IGameManagerService.Stub { + " and userId " + userId); break; } + if (mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)) { + mHandler.removeMessages(CANCEL_GAME_LOADING_MODE); + } mPowerManagerInternal.setPowerMode(Mode.GAME_LOADING, isLoading); + if (isLoading) { + int loadingBoostDuration = getLoadingBoostDuration(packageName, userId); + loadingBoostDuration = loadingBoostDuration > 0 ? loadingBoostDuration + : LOADING_BOOST_MAX_DURATION; + mHandler.sendMessageDelayed( + mHandler.obtainMessage(CANCEL_GAME_LOADING_MODE), + loadingBoostDuration); + } } break; } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 05cd67f2f808..c5cb08db934f 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -105,7 +105,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; import android.provider.Settings; -import android.sysprop.DisplayProperties; import android.text.TextUtils; import android.util.ArraySet; import android.util.EventLog; @@ -451,8 +450,6 @@ public final class DisplayManagerService extends SystemService { } }; - private final boolean mAllowNonNativeRefreshRateOverride; - private final BrightnessSynchronizer mBrightnessSynchronizer; /** @@ -506,7 +503,6 @@ public final class DisplayManagerService extends SystemService { ColorSpace[] colorSpaces = SurfaceControl.getCompositionColorSpaces(); mWideColorSpace = colorSpaces[1]; mOverlayProperties = SurfaceControl.getOverlaySupport(); - mAllowNonNativeRefreshRateOverride = mInjector.getAllowNonNativeRefreshRateOverride(); mSystemReady = false; } @@ -930,24 +926,20 @@ public final class DisplayManagerService extends SystemService { } } - if (mAllowNonNativeRefreshRateOverride) { - overriddenInfo.refreshRateOverride = frameRateHz; - if (!CompatChanges.isChangeEnabled(DISPLAY_MODE_RETURNS_PHYSICAL_REFRESH_RATE, - callingUid)) { - overriddenInfo.supportedModes = Arrays.copyOf(info.supportedModes, - info.supportedModes.length + 1); - overriddenInfo.supportedModes[overriddenInfo.supportedModes.length - 1] = - new Display.Mode(Display.DISPLAY_MODE_ID_FOR_FRAME_RATE_OVERRIDE, - currentMode.getPhysicalWidth(), currentMode.getPhysicalHeight(), - overriddenInfo.refreshRateOverride); - overriddenInfo.modeId = - overriddenInfo.supportedModes[overriddenInfo.supportedModes.length - 1] - .getModeId(); - } - return overriddenInfo; + overriddenInfo.refreshRateOverride = frameRateHz; + if (!CompatChanges.isChangeEnabled(DISPLAY_MODE_RETURNS_PHYSICAL_REFRESH_RATE, + callingUid)) { + overriddenInfo.supportedModes = Arrays.copyOf(info.supportedModes, + info.supportedModes.length + 1); + overriddenInfo.supportedModes[overriddenInfo.supportedModes.length - 1] = + new Display.Mode(Display.DISPLAY_MODE_ID_FOR_FRAME_RATE_OVERRIDE, + currentMode.getPhysicalWidth(), currentMode.getPhysicalHeight(), + overriddenInfo.refreshRateOverride); + overriddenInfo.modeId = + overriddenInfo.supportedModes[overriddenInfo.supportedModes.length - 1] + .getModeId(); } - - return info; + return overriddenInfo; } private DisplayInfo getDisplayInfoInternal(int displayId, int callingUid) { @@ -2602,11 +2594,6 @@ public final class DisplayManagerService extends SystemService { long getDefaultDisplayDelayTimeout() { return WAIT_FOR_DEFAULT_DISPLAY_TIMEOUT; } - - boolean getAllowNonNativeRefreshRateOverride() { - return DisplayProperties - .debug_allow_non_native_refresh_rate_override().orElse(true); - } } @VisibleForTesting diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 3c720190fd66..283640d7613a 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -2259,26 +2259,20 @@ final class InstallPackageHelper { incrementalStorages.add(storage); } - // Enabling fs-verity is a blocking operation. To reduce the impact to the install time, - // run in a background thread. - new Thread("fsverity-setup") { - @Override public void run() { - try { - if (!VerityUtils.hasFsverity(pkg.getBaseApkPath())) { - VerityUtils.setUpFsverity(pkg.getBaseApkPath(), (byte[]) null); - } - for (String path : pkg.getSplitCodePaths()) { - if (!VerityUtils.hasFsverity(path)) { - VerityUtils.setUpFsverity(path, (byte[]) null); - } - } - } catch (IOException e) { - // There's nothing we can do if the setup failed. Since fs-verity is - // optional, just ignore the error for now. - Slog.e(TAG, "Failed to fully enable fs-verity to " + packageName); + try { + if (!VerityUtils.hasFsverity(pkg.getBaseApkPath())) { + VerityUtils.setUpFsverity(pkg.getBaseApkPath(), (byte[]) null); + } + for (String path : pkg.getSplitCodePaths()) { + if (!VerityUtils.hasFsverity(path)) { + VerityUtils.setUpFsverity(path, (byte[]) null); } } - }.start(); + } catch (IOException e) { + // There's nothing we can do if the setup failed. Since fs-verity is + // optional, just ignore the error for now. + Slog.e(TAG, "Failed to fully enable fs-verity to " + packageName); + } // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088) mAppDataHelper.prepareAppDataPostCommitLIF(pkg, 0); diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 02a57b288a06..b5c1206bdfa4 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -3358,13 +3358,13 @@ public class UserManagerService extends IUserManager.Stub { Slogf.wtf(LOG_TAG, "emulateSystemUserModeIfNeeded(): no system user data"); return; } + final int oldMainUserId = getMainUserIdUnchecked(); final int oldFlags = systemUserData.info.flags; final int newFlags; final String newUserType; - // TODO(b/256624031): Also handle FLAG_MAIN if (newHeadlessSystemUserMode) { newUserType = UserManager.USER_TYPE_SYSTEM_HEADLESS; - newFlags = oldFlags & ~UserInfo.FLAG_FULL; + newFlags = oldFlags & ~UserInfo.FLAG_FULL & ~UserInfo.FLAG_MAIN; } else { newUserType = UserManager.USER_TYPE_FULL_SYSTEM; newFlags = oldFlags | UserInfo.FLAG_FULL; @@ -3379,9 +3379,38 @@ public class UserManagerService extends IUserManager.Stub { + "%s, flags changed from %s to %s", systemUserData.info.userType, newUserType, UserInfo.flagsToString(oldFlags), UserInfo.flagsToString(newFlags)); + systemUserData.info.userType = newUserType; systemUserData.info.flags = newFlags; writeUserLP(systemUserData); + + // Switch the MainUser to a reasonable choice if needed. + // (But if there was no MainUser, we deliberately continue to have no MainUser.) + final UserData oldMain = getUserDataNoChecks(oldMainUserId); + if (newHeadlessSystemUserMode) { + if (oldMain != null && (oldMain.info.flags & UserInfo.FLAG_SYSTEM) != 0) { + // System was MainUser. So we need a new choice for Main. Pick the oldest. + // If no oldest, don't set any. Let the BootUserInitializer do that later. + final UserInfo newMainUser = getEarliestCreatedFullUser(); + if (newMainUser != null) { + Slogf.i(LOG_TAG, "Designating user " + newMainUser.id + " to be Main"); + newMainUser.flags |= UserInfo.FLAG_MAIN; + writeUserLP(getUserDataNoChecks(newMainUser.id)); + } + } + } else { + // TODO(b/256624031): For now, we demand the Main user (if there is one) is + // always the system in non-HSUM. In the future, when we relax this, change how + // we handle MAIN. + if (oldMain != null && (oldMain.info.flags & UserInfo.FLAG_SYSTEM) == 0) { + // Someone else was the MainUser; transfer it to System. + Slogf.i(LOG_TAG, "Transferring Main to user 0 from " + oldMain.info.id); + oldMain.info.flags &= ~UserInfo.FLAG_MAIN; + systemUserData.info.flags |= UserInfo.FLAG_MAIN; + writeUserLP(oldMain); + writeUserLP(systemUserData); + } + } } } @@ -3658,8 +3687,10 @@ public class UserManagerService extends IUserManager.Stub { // Add FLAG_MAIN if (isHeadlessSystemUserMode()) { final UserInfo earliestCreatedUser = getEarliestCreatedFullUser(); - earliestCreatedUser.flags |= UserInfo.FLAG_MAIN; - userIdsToWrite.add(earliestCreatedUser.id); + if (earliestCreatedUser != null) { + earliestCreatedUser.flags |= UserInfo.FLAG_MAIN; + userIdsToWrite.add(earliestCreatedUser.id); + } } else { synchronized (mUsersLock) { final UserData userData = mUsers.get(UserHandle.USER_SYSTEM); @@ -3799,9 +3830,10 @@ public class UserManagerService extends IUserManager.Stub { userInfo.profileBadge = getFreeProfileBadgeLU(userInfo.profileGroupId, userInfo.userType); } - private UserInfo getEarliestCreatedFullUser() { + /** Returns the oldest Full Admin user, or null is if there none. */ + private @Nullable UserInfo getEarliestCreatedFullUser() { final List<UserInfo> users = getUsersInternal(true, true, true); - UserInfo earliestUser = users.get(0); + UserInfo earliestUser = null; long earliestCreationTime = Long.MAX_VALUE; for (int i = 0; i < users.size(); i++) { final UserInfo info = users.get(i); diff --git a/services/core/java/com/android/server/pm/UserVisibilityMediator.java b/services/core/java/com/android/server/pm/UserVisibilityMediator.java index 2650b2394cc5..878855a89fb1 100644 --- a/services/core/java/com/android/server/pm/UserVisibilityMediator.java +++ b/services/core/java/com/android/server/pm/UserVisibilityMediator.java @@ -575,9 +575,7 @@ public final class UserVisibilityMediator implements Dumpable { ipw.println(mCurrentUserId); ipw.print("Visible users: "); - // TODO: merge 2 lines below if/when IntArray implements toString()... - IntArray visibleUsers = getVisibleUsers(); - ipw.println(java.util.Arrays.toString(visibleUsers.toArray())); + ipw.println(getVisibleUsers()); dumpSparseIntArray(ipw, mStartedProfileGroupIds, "started user / profile group", "u", "pg"); diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java index b1e91417b612..ba36ab7a1f02 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java @@ -1335,6 +1335,11 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal, } @Override + public UUID getStorageUuid() { + return mStorageUuid; + } + + @Override public int getTargetSandboxVersion() { return targetSandboxVersion; } diff --git a/services/core/java/com/android/server/pm/pkg/AndroidPackage.java b/services/core/java/com/android/server/pm/pkg/AndroidPackage.java index e3dad452c9f4..84907a57c03d 100644 --- a/services/core/java/com/android/server/pm/pkg/AndroidPackage.java +++ b/services/core/java/com/android/server/pm/pkg/AndroidPackage.java @@ -34,6 +34,7 @@ import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; import android.content.pm.SigningDetails; import android.os.Bundle; +import android.os.storage.StorageManager; import android.processor.immutability.Immutable; import android.util.ArraySet; import android.util.Pair; @@ -58,6 +59,7 @@ import java.security.PublicKey; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; /** * The representation of an application on disk, as parsed from its split APKs' manifests. @@ -111,6 +113,13 @@ public interface AndroidPackage { String getStaticSharedLibraryName(); /** + * @return The {@link UUID} for use with {@link StorageManager} APIs identifying where this + * package was installed. + */ + @NonNull + UUID getStorageUuid(); + + /** * @see ApplicationInfo#targetSdkVersion * @see R.styleable#AndroidManifestUsesSdk_targetSdkVersion */ diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index f74956b7c846..5d084616bfea 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1559,8 +1559,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub try { mReply.sendResult(null); } catch (RemoteException e) { - Binder.restoreCallingIdentity(ident); Slog.d(TAG, "failed to send callback!", e); + } finally { + Binder.restoreCallingIdentity(ident); } t.traceEnd(); mReply = null; diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt index ee6196d60f9c..7bf9a9ef121f 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt @@ -48,11 +48,16 @@ import com.android.server.testutils.mockThrowOnUnmocked import com.android.server.testutils.whenever import java.security.KeyPairGenerator import java.security.PublicKey +import java.util.UUID import kotlin.contracts.ExperimentalContracts @ExperimentalContracts class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, PackageImpl::class) { + companion object { + private val TEST_UUID = UUID.fromString("57554103-df3e-4475-ae7a-8feba49353ac") + } + override val defaultImpl = PackageImpl.forTesting("com.example.test") override val creator = PackageImpl.CREATOR @@ -88,8 +93,6 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag "getLongVersionCode", // Tested through constructor "getManifestPackageName", - // Utility methods - "getStorageUuid", // Removal not tested, irrelevant for parcelling concerns "removeUsesOptionalLibrary", "clearAdoptPermissions", @@ -101,6 +104,7 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag // Tested manually "getMimeGroups", "getRequestedPermissions", + "getStorageUuid", // Tested through asSplit "asSplit", "getSplits", @@ -256,7 +260,7 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag ) override fun extraParams() = listOf( - getter(AndroidPackage::getVolumeUuid, "57554103-df3e-4475-ae7a-8feba49353ac"), + getter(AndroidPackage::getVolumeUuid, TEST_UUID.toString()), getter(AndroidPackage::isProfileable, true), getter(PackageImpl::getVersionCode, 3), getter(PackageImpl::getVersionCodeMajor, 9), @@ -617,6 +621,8 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag expect.that(after.usesStaticLibrariesCertDigests!!.size).isEqualTo(1) expect.that(after.usesStaticLibrariesCertDigests!![0]).asList() .containsExactly("testCertDigest2") + + expect.that(after.storageUuid).isEqualTo(TEST_UUID) } private fun testKey() = KeyPairGenerator.getInstance("RSA") diff --git a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java index 51fa8517e45f..e7c384b48152 100644 --- a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java @@ -252,6 +252,7 @@ public class RescuePartyTest { noteBoot(4); assertTrue(RescueParty.isRebootPropertySet()); + SystemProperties.set(RescueParty.PROP_ATTEMPTING_REBOOT, Boolean.toString(false)); noteBoot(5); assertTrue(RescueParty.isFactoryResetPropertySet()); } @@ -276,6 +277,7 @@ public class RescuePartyTest { noteAppCrash(4, true); assertTrue(RescueParty.isRebootPropertySet()); + SystemProperties.set(RescueParty.PROP_ATTEMPTING_REBOOT, Boolean.toString(false)); noteAppCrash(5, true); assertTrue(RescueParty.isFactoryResetPropertySet()); } @@ -429,6 +431,27 @@ public class RescuePartyTest { for (int i = 0; i < LEVEL_FACTORY_RESET; i++) { noteBoot(i + 1); } + assertFalse(RescueParty.isFactoryResetPropertySet()); + SystemProperties.set(RescueParty.PROP_ATTEMPTING_REBOOT, Boolean.toString(false)); + noteBoot(LEVEL_FACTORY_RESET + 1); + assertTrue(RescueParty.isAttemptingFactoryReset()); + assertTrue(RescueParty.isFactoryResetPropertySet()); + } + + @Test + public void testIsAttemptingFactoryResetOnlyAfterRebootCompleted() { + for (int i = 0; i < LEVEL_FACTORY_RESET; i++) { + noteBoot(i + 1); + } + int mitigationCount = LEVEL_FACTORY_RESET + 1; + assertFalse(RescueParty.isFactoryResetPropertySet()); + noteBoot(mitigationCount++); + assertFalse(RescueParty.isFactoryResetPropertySet()); + noteBoot(mitigationCount++); + assertFalse(RescueParty.isFactoryResetPropertySet()); + noteBoot(mitigationCount++); + SystemProperties.set(RescueParty.PROP_ATTEMPTING_REBOOT, Boolean.toString(false)); + noteBoot(mitigationCount + 1); assertTrue(RescueParty.isAttemptingFactoryReset()); assertTrue(RescueParty.isFactoryResetPropertySet()); } diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java index dc77762795c7..8d2e1ecf0802 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java @@ -17,6 +17,7 @@ package com.android.server.app; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; +import static com.android.server.app.GameManagerService.CANCEL_GAME_LOADING_MODE; import static com.android.server.app.GameManagerService.WRITE_SETTINGS; import static org.junit.Assert.assertArrayEquals; @@ -1454,35 +1455,78 @@ public class GameManagerServiceTests { verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean()); } - private void setGameState(boolean isLoading) { + @Test + public void testSetGameStateLoading_withNoDeviceConfig() { mockDeviceConfigNone(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = - new GameManagerService(mMockContext, mTestLooper.getLooper()); - startUser(gameManagerService, USER_ID_1); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); gameManagerService.setGameMode( mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); - int testMode = GameState.MODE_NONE; + assertEquals(gameManagerService.getGameMode(mPackageName, USER_ID_1), + GameManager.GAME_MODE_PERFORMANCE); + int testMode = GameState.MODE_GAMEPLAY_INTERRUPTIBLE; int testLabel = 99; int testQuality = 123; - GameState gameState = new GameState(isLoading, testMode, testLabel, testQuality); - assertEquals(isLoading, gameState.isLoading()); + GameState gameState = new GameState(true, testMode, testLabel, testQuality); assertEquals(testMode, gameState.getMode()); assertEquals(testLabel, gameState.getLabel()); assertEquals(testQuality, gameState.getQuality()); gameManagerService.setGameState(mPackageName, gameState, USER_ID_1); mTestLooper.dispatchAll(); - verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, isLoading); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, true); + reset(mMockPowerManager); + assertTrue( + gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + verify(mMockPowerManager, never()).setPowerMode(Mode.GAME_LOADING, false); + mTestLooper.moveTimeForward(GameManagerService.LOADING_BOOST_MAX_DURATION); + mTestLooper.dispatchAll(); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false); } @Test - public void testSetGameStateLoading() { - setGameState(true); + public void testSetGameStateLoading_withDeviceConfig() { + String configString = "mode=2,loadingBoost=2000"; + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + gameManagerService.setGameMode( + mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); + GameState gameState = new GameState(true, GameState.MODE_GAMEPLAY_INTERRUPTIBLE, 99, 123); + gameManagerService.setGameState(mPackageName, gameState, USER_ID_1); + mTestLooper.dispatchAll(); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, true); + verify(mMockPowerManager, never()).setPowerMode(Mode.GAME_LOADING, false); + reset(mMockPowerManager); + assertTrue( + gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + mTestLooper.moveTimeForward(2000); + mTestLooper.dispatchAll(); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false); } @Test public void testSetGameStateNotLoading() { - setGameState(false); + mockDeviceConfigNone(); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); + gameManagerService.setGameMode( + mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); + int testMode = GameState.MODE_GAMEPLAY_UNINTERRUPTIBLE; + int testLabel = 99; + int testQuality = 123; + GameState gameState = new GameState(false, testMode, testLabel, testQuality); + assertFalse(gameState.isLoading()); + assertEquals(testMode, gameState.getMode()); + assertEquals(testLabel, gameState.getLabel()); + assertEquals(testQuality, gameState.getQuality()); + gameManagerService.setGameState(mPackageName, gameState, USER_ID_1); + mTestLooper.dispatchAll(); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false); + assertFalse( + gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); } private List<String> readGameModeInterventionList() throws Exception { diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java index 5c3d69547755..01674bbc6859 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java @@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.timeout; @@ -107,12 +108,16 @@ public final class BackgroundDexOptServiceUnitTest { @Mock private BackgroundDexOptJobService mJobServiceForIdle; - private final JobParameters mJobParametersForPostBoot = new JobParameters(null, - BackgroundDexOptService.JOB_POST_BOOT_UPDATE, null, null, null, - 0, false, false, null, null, null); - private final JobParameters mJobParametersForIdle = new JobParameters(null, - BackgroundDexOptService.JOB_IDLE_OPTIMIZE, null, null, null, - 0, false, false, null, null, null); + private final JobParameters mJobParametersForPostBoot = + createJobParameters(BackgroundDexOptService.JOB_POST_BOOT_UPDATE); + private final JobParameters mJobParametersForIdle = + createJobParameters(BackgroundDexOptService.JOB_IDLE_OPTIMIZE); + + private static JobParameters createJobParameters(int jobId) { + JobParameters params = mock(JobParameters.class); + when(params.getJobId()).thenReturn(jobId); + return params; + } private BackgroundDexOptService mService; diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java index 9853b7acaf13..ce35626a5106 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -171,22 +171,6 @@ public class DisplayManagerServiceTest { private final DisplayManagerService.Injector mBasicInjector = new BasicInjector(); - private final DisplayManagerService.Injector mAllowNonNativeRefreshRateOverrideInjector = - new BasicInjector() { - @Override - boolean getAllowNonNativeRefreshRateOverride() { - return true; - } - }; - - private final DisplayManagerService.Injector mDenyNonNativeRefreshRateOverrideInjector = - new BasicInjector() { - @Override - boolean getAllowNonNativeRefreshRateOverride() { - return false; - } - }; - @Mock InputManagerInternal mMockInputManagerInternal; @Mock VirtualDeviceManagerInternal mMockVirtualDeviceManagerInternal; @Mock IVirtualDisplayCallback.Stub mMockAppToken; @@ -1113,13 +1097,32 @@ public class DisplayManagerServiceTest { } /** - * Tests that the frame rate override is updated accordingly to the - * allowNonNativeRefreshRateOverride policy. + * Tests that the frame rate override is returning the correct value from + * DisplayInfo#getRefreshRate */ @Test public void testDisplayInfoNonNativeFrameRateOverride() throws Exception { - testDisplayInfoNonNativeFrameRateOverride(mDenyNonNativeRefreshRateOverrideInjector); - testDisplayInfoNonNativeFrameRateOverride(mAllowNonNativeRefreshRateOverrideInjector); + DisplayManagerService displayManager = + new DisplayManagerService(mContext, mBasicInjector); + DisplayManagerService.BinderService displayManagerBinderService = + displayManager.new BinderService(); + registerDefaultDisplays(displayManager); + displayManager.onBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); + + FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, + new float[]{60f}); + int displayId = getDisplayIdForDisplayDevice(displayManager, displayManagerBinderService, + displayDevice); + DisplayInfo displayInfo = displayManagerBinderService.getDisplayInfo(displayId); + assertEquals(60f, displayInfo.getRefreshRate(), 0.01f); + + updateFrameRateOverride(displayManager, displayDevice, + new DisplayEventReceiver.FrameRateOverride[]{ + new DisplayEventReceiver.FrameRateOverride( + Process.myUid(), 20f) + }); + displayInfo = displayManagerBinderService.getDisplayInfo(displayId); + assertEquals(20f, displayInfo.getRefreshRate(), 0.01f); } /** @@ -1147,10 +1150,7 @@ public class DisplayManagerServiceTest { @Test @DisableCompatChanges({DisplayManagerService.DISPLAY_MODE_RETURNS_PHYSICAL_REFRESH_RATE}) public void testDisplayInfoNonNativeFrameRateOverrideModeCompat() throws Exception { - testDisplayInfoNonNativeFrameRateOverrideMode(mDenyNonNativeRefreshRateOverrideInjector, - /*compatChangeEnabled*/ false); - testDisplayInfoNonNativeFrameRateOverrideMode(mAllowNonNativeRefreshRateOverrideInjector, - /*compatChangeEnabled*/ false); + testDisplayInfoNonNativeFrameRateOverrideMode(/*compatChangeEnabled*/ false); } /** @@ -1159,10 +1159,7 @@ public class DisplayManagerServiceTest { @Test @EnableCompatChanges({DisplayManagerService.DISPLAY_MODE_RETURNS_PHYSICAL_REFRESH_RATE}) public void testDisplayInfoNonNativeFrameRateOverrideMode() throws Exception { - testDisplayInfoNonNativeFrameRateOverrideMode(mDenyNonNativeRefreshRateOverrideInjector, - /*compatChangeEnabled*/ true); - testDisplayInfoNonNativeFrameRateOverrideMode(mAllowNonNativeRefreshRateOverrideInjector, - /*compatChangeEnabled*/ true); + testDisplayInfoNonNativeFrameRateOverrideMode(/*compatChangeEnabled*/ true); } /** @@ -1385,10 +1382,9 @@ public class DisplayManagerServiceTest { assertEquals(expectedMode, displayInfo.getMode()); } - private void testDisplayInfoNonNativeFrameRateOverrideMode( - DisplayManagerService.Injector injector, boolean compatChangeEnabled) { + private void testDisplayInfoNonNativeFrameRateOverrideMode(boolean compatChangeEnabled) { DisplayManagerService displayManager = - new DisplayManagerService(mContext, injector); + new DisplayManagerService(mContext, mBasicInjector); DisplayManagerService.BinderService displayManagerBinderService = displayManager.new BinderService(); registerDefaultDisplays(displayManager); @@ -1410,40 +1406,12 @@ public class DisplayManagerServiceTest { Display.Mode expectedMode; if (compatChangeEnabled) { expectedMode = new Display.Mode(1, 100, 200, 60f); - } else if (injector.getAllowNonNativeRefreshRateOverride()) { - expectedMode = new Display.Mode(255, 100, 200, 20f); } else { - expectedMode = new Display.Mode(1, 100, 200, 60f); + expectedMode = new Display.Mode(255, 100, 200, 20f); } assertEquals(expectedMode, displayInfo.getMode()); } - private void testDisplayInfoNonNativeFrameRateOverride( - DisplayManagerService.Injector injector) { - DisplayManagerService displayManager = - new DisplayManagerService(mContext, injector); - DisplayManagerService.BinderService displayManagerBinderService = - displayManager.new BinderService(); - registerDefaultDisplays(displayManager); - displayManager.onBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); - - FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, - new float[]{60f}); - int displayId = getDisplayIdForDisplayDevice(displayManager, displayManagerBinderService, - displayDevice); - DisplayInfo displayInfo = displayManagerBinderService.getDisplayInfo(displayId); - assertEquals(60f, displayInfo.getRefreshRate(), 0.01f); - - updateFrameRateOverride(displayManager, displayDevice, - new DisplayEventReceiver.FrameRateOverride[]{ - new DisplayEventReceiver.FrameRateOverride( - Process.myUid(), 20f) - }); - displayInfo = displayManagerBinderService.getDisplayInfo(displayId); - float expectedRefreshRate = injector.getAllowNonNativeRefreshRateOverride() ? 20f : 60f; - assertEquals(expectedRefreshRate, displayInfo.getRefreshRate(), 0.01f); - } - private int getDisplayIdForDisplayDevice( DisplayManagerService displayManager, DisplayManagerService.BinderService displayManagerBinderService, |