summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/api/current.txt1
-rw-r--r--services/core/java/com/android/server/RescueParty.java7
-rw-r--r--services/core/java/com/android/server/app/GameManagerService.java11
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java39
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java30
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java44
-rw-r--r--services/core/java/com/android/server/pm/UserVisibilityMediator.java4
-rw-r--r--services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java5
-rw-r--r--services/core/java/com/android/server/pm/pkg/AndroidPackage.java9
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java3
-rw-r--r--services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt12
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java23
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java66
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java17
-rw-r--r--services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java88
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,