diff options
| author | 2022-11-28 15:29:13 -0800 | |
|---|---|---|
| committer | 2022-12-01 01:14:32 +0000 | |
| commit | 17d1cf45bc107074bcbd0f0722cc3ae9a7aa3d62 (patch) | |
| tree | 920a87d2031e598ba1d4eea5244fd619ec52813f | |
| parent | d12793ea842c3988448885f879676c9c134cf38a (diff) | |
Restrict available game modes to game only
Bug: 243448953
Test: atest GameManagerServiceTests
Change-Id: I4c6074c66b418c65cbef653edb654caa1a7680fe
5 files changed, 219 insertions, 55 deletions
diff --git a/core/java/android/app/GameManager.java b/core/java/android/app/GameManager.java index f92194d3ffac..2f51b174113c 100644 --- a/core/java/android/app/GameManager.java +++ b/core/java/android/app/GameManager.java @@ -213,7 +213,7 @@ public final class GameManager { @RequiresPermission(Manifest.permission.MANAGE_GAME_MODE) public @GameMode int[] getAvailableGameModes(@NonNull String packageName) { try { - return mService.getAvailableGameModes(packageName); + return mService.getAvailableGameModes(packageName, mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/IGameManagerService.aidl b/core/java/android/app/IGameManagerService.aidl index aea097d069dc..3d6ab6fd9478 100644 --- a/core/java/android/app/IGameManagerService.aidl +++ b/core/java/android/app/IGameManagerService.aidl @@ -29,7 +29,7 @@ interface IGameManagerService { @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_GAME_MODE)") void setGameMode(String packageName, int gameMode, int userId); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_GAME_MODE)") - int[] getAvailableGameModes(String packageName); + int[] getAvailableGameModes(String packageName, int userId); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_GAME_MODE)") boolean isAngleEnabled(String packageName, int userId); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_GAME_MODE)") diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index a954164fb79f..3fdac7b8254d 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -449,6 +449,7 @@ public final class GameManagerService extends IGameManagerService.Stub { public void setGameState(String packageName, @NonNull GameState gameState, @UserIdInt int userId) { if (!isPackageGame(packageName, userId)) { + Slog.d(TAG, "No-op for attempt to set game state for non-game app: " + packageName); // Restrict to games only. return; } @@ -975,11 +976,8 @@ public final class GameManagerService extends IGameManagerService.Stub { } } - private @GameMode int[] getAvailableGameModesUnchecked(String packageName) { - final GamePackageConfiguration config; - synchronized (mDeviceConfigLock) { - config = mConfigs.get(packageName); - } + private @GameMode int[] getAvailableGameModesUnchecked(String packageName, int userId) { + final GamePackageConfiguration config = getConfig(packageName, userId); if (config == null) { return new int[]{GameManager.GAME_MODE_STANDARD, GameManager.GAME_MODE_CUSTOM}; } @@ -1002,9 +1000,13 @@ public final class GameManagerService extends IGameManagerService.Stub { */ @Override @RequiresPermission(Manifest.permission.MANAGE_GAME_MODE) - public @GameMode int[] getAvailableGameModes(String packageName) throws SecurityException { + public @GameMode int[] getAvailableGameModes(String packageName, int userId) + throws SecurityException { checkPermission(Manifest.permission.MANAGE_GAME_MODE); - return getAvailableGameModesUnchecked(packageName); + if (!isPackageGame(packageName, userId)) { + return new int[]{}; + } + return getAvailableGameModesUnchecked(packageName, userId); } private @GameMode int getGameModeFromSettingsUnchecked(String packageName, @@ -1071,7 +1073,6 @@ public final class GameManagerService extends IGameManagerService.Stub { // Check the caller has the necessary permission. checkPermission(Manifest.permission.MANAGE_GAME_MODE); - // Restrict to games only. if (!isPackageGame(packageName, userId)) { return null; } @@ -1101,7 +1102,7 @@ public final class GameManagerService extends IGameManagerService.Stub { } else { return new GameModeInfo.Builder() .setActiveGameMode(activeGameMode) - .setAvailableGameModes(getAvailableGameModesUnchecked(packageName)) + .setAvailableGameModes(getAvailableGameModesUnchecked(packageName, userId)) .build(); } } @@ -1115,9 +1116,11 @@ public final class GameManagerService extends IGameManagerService.Stub { public void setGameMode(String packageName, @GameMode int gameMode, int userId) throws SecurityException { checkPermission(Manifest.permission.MANAGE_GAME_MODE); - - if (!isPackageGame(packageName, userId) || gameMode == GameManager.GAME_MODE_UNSUPPORTED) { - // Restrict to games and valid game modes only. + if (gameMode == GameManager.GAME_MODE_UNSUPPORTED) { + Slog.d(TAG, "No-op for attempt to set UNSUPPORTED mode for app: " + packageName); + return; + } else if (!isPackageGame(packageName, userId)) { + Slog.d(TAG, "No-op for attempt to set game mode for non-game app: " + packageName); return; } int fromGameMode; @@ -1216,17 +1219,16 @@ public final class GameManagerService extends IGameManagerService.Stub { Binder.getCallingUid(), userId, false, true, "notifyGraphicsEnvironmentSetup", "com.android.server.app.GameManagerService"); - // Restrict to games only. - if (!isPackageGame(packageName, userId)) { - return; - } - if (!isValidPackageName(packageName, userId)) { + Slog.d(TAG, "No-op for attempt to notify graphics env setup for different package" + + "than caller with uid: " + Binder.getCallingUid()); return; } final int gameMode = getGameMode(packageName, userId); if (gameMode == GameManager.GAME_MODE_UNSUPPORTED) { + Slog.d(TAG, "No-op for attempt to notify graphics env setup for non-game app: " + + packageName); return; } int loadingBoostDuration = getLoadingBoostDuration(packageName, userId); @@ -1341,6 +1343,11 @@ public final class GameManagerService extends IGameManagerService.Stub { GameModeConfiguration gameModeConfig, int userId) throws SecurityException, IllegalArgumentException { checkPermission(Manifest.permission.MANAGE_GAME_MODE); + if (!isPackageGame(packageName, userId)) { + Slog.d(TAG, "No-op for attempt to update custom game mode for non-game app: " + + packageName); + return; + } synchronized (mLock) { if (!mSettings.containsKey(userId)) { throw new IllegalArgumentException("User " + userId + " wasn't started"); diff --git a/services/core/java/com/android/server/app/GameManagerShellCommand.java b/services/core/java/com/android/server/app/GameManagerShellCommand.java index cdbffbeae80b..aa9b77c42e09 100644 --- a/services/core/java/com/android/server/app/GameManagerShellCommand.java +++ b/services/core/java/com/android/server/app/GameManagerShellCommand.java @@ -105,7 +105,9 @@ public class GameManagerShellCommand extends ShellCommand { ServiceManager.getServiceOrThrow(Context.GAME_SERVICE)); boolean batteryModeSupported = false; boolean perfModeSupported = false; - int[] modes = service.getAvailableGameModes(packageName); + int userId = userIdStr != null ? Integer.parseInt(userIdStr) + : ActivityManager.getCurrentUser(); + int[] modes = service.getAvailableGameModes(packageName, userId); for (int mode : modes) { if (mode == GameManager.GAME_MODE_PERFORMANCE) { perfModeSupported = true; @@ -113,8 +115,6 @@ public class GameManagerShellCommand extends ShellCommand { batteryModeSupported = true; } } - int userId = userIdStr != null ? Integer.parseInt(userIdStr) - : ActivityManager.getCurrentUser(); switch (gameMode.toLowerCase()) { case "1": case "standard": @@ -223,7 +223,7 @@ public class GameManagerShellCommand extends ShellCommand { boolean batteryModeSupported = false; boolean perfModeSupported = false; - int [] modes = gameManagerService.getAvailableGameModes(packageName); + int [] modes = gameManagerService.getAvailableGameModes(packageName, userId); for (int mode : modes) { if (mode == GameManager.GAME_MODE_PERFORMANCE) { 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 8d2e1ecf0802..9f0d759da121 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java @@ -18,6 +18,8 @@ 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.LOADING_BOOST_MAX_DURATION; +import static com.android.server.app.GameManagerService.SET_GAME_STATE; import static com.android.server.app.GameManagerService.WRITE_SETTINGS; import static org.junit.Assert.assertArrayEquals; @@ -59,6 +61,7 @@ import android.content.res.AssetManager; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.hardware.power.Mode; +import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.PowerManagerInternal; @@ -104,7 +107,8 @@ public class GameManagerServiceTests { private static final String PACKAGE_NAME_INVALID = "com.android.app"; private static final int USER_ID_1 = 1001; private static final int USER_ID_2 = 1002; - private static final int DEFAULT_PACKAGE_UID = 12345; + // to pass the valid package check in some of the server methods + private static final int DEFAULT_PACKAGE_UID = Binder.getCallingUid(); private MockitoSession mMockingSession; private String mPackageName; @@ -205,28 +209,33 @@ public class GameManagerServiceTests { .startMocking(); mMockContext = new MockContext(InstrumentationRegistry.getContext()); mPackageName = mMockContext.getPackageName(); - final ApplicationInfo applicationInfo = new ApplicationInfo(); - applicationInfo.category = ApplicationInfo.CATEGORY_GAME; - applicationInfo.packageName = mPackageName; - final PackageInfo pi = new PackageInfo(); - pi.packageName = mPackageName; - pi.applicationInfo = applicationInfo; - final List<PackageInfo> packages = new ArrayList<>(); - packages.add(pi); - + mockAppCategory(mPackageName, ApplicationInfo.CATEGORY_GAME); final Resources resources = InstrumentationRegistry.getInstrumentation().getContext().getResources(); when(mMockPackageManager.getResourcesForApplication(anyString())) .thenReturn(resources); - when(mMockPackageManager.getInstalledPackagesAsUser(anyInt(), anyInt())) - .thenReturn(packages); - when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) - .thenReturn(applicationInfo); when(mMockPackageManager.getPackageUidAsUser(mPackageName, USER_ID_1)).thenReturn( DEFAULT_PACKAGE_UID); LocalServices.addService(PowerManagerInternal.class, mMockPowerManager); } + private void mockAppCategory(String packageName, @ApplicationInfo.Category int category) + throws Exception { + reset(mMockPackageManager); + final ApplicationInfo gameApplicationInfo = new ApplicationInfo(); + gameApplicationInfo.category = category; + gameApplicationInfo.packageName = packageName; + final PackageInfo pi = new PackageInfo(); + pi.packageName = packageName; + pi.applicationInfo = gameApplicationInfo; + final List<PackageInfo> packages = new ArrayList<>(); + packages.add(pi); + when(mMockPackageManager.getInstalledPackagesAsUser(anyInt(), anyInt())) + .thenReturn(packages); + when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) + .thenReturn(gameApplicationInfo); + } + @After public void tearDown() throws Exception { LocalServices.removeServiceForTest(PowerManagerInternal.class); @@ -457,17 +466,22 @@ public class GameManagerServiceTests { * By default game mode is set to STANDARD */ @Test - public void testGameModeDefaultValue() { - GameManagerService gameManagerService = - new GameManagerService(mMockContext, mTestLooper.getLooper()); - - startUser(gameManagerService, USER_ID_1); + public void testGetGameMode_defaultValue() { + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); mockModifyGameModeGranted(); - assertEquals(GameManager.GAME_MODE_STANDARD, gameManagerService.getGameMode(mPackageName, USER_ID_1)); } + @Test + public void testGetGameMode_nonGame() throws Exception { + mockAppCategory(mPackageName, ApplicationInfo.CATEGORY_AUDIO); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + mockModifyGameModeGranted(); + assertEquals(GameManager.GAME_MODE_UNSUPPORTED, + gameManagerService.getGameMode(mPackageName, USER_ID_1)); + } + /** * Test the default behaviour for a nonexistent user. */ @@ -614,16 +628,21 @@ public class GameManagerServiceTests { int... requiredAvailableModes) { Arrays.sort(requiredAvailableModes); // check getAvailableGameModes - int[] reportedAvailableModes = gameManagerService.getAvailableGameModes(mPackageName); + int[] reportedAvailableModes = gameManagerService.getAvailableGameModes(mPackageName, + USER_ID_1); Arrays.sort(reportedAvailableModes); assertArrayEquals(requiredAvailableModes, reportedAvailableModes); // check GetModeInfo.getAvailableGameModes GameModeInfo info = gameManagerService.getGameModeInfo(mPackageName, USER_ID_1); - assertNotNull(info); - reportedAvailableModes = info.getAvailableGameModes(); - Arrays.sort(reportedAvailableModes); - assertArrayEquals(requiredAvailableModes, reportedAvailableModes); + if (requiredAvailableModes.length == 0) { + assertNull(info); + } else { + assertNotNull(info); + reportedAvailableModes = info.getAvailableGameModes(); + Arrays.sort(reportedAvailableModes); + assertArrayEquals(requiredAvailableModes, reportedAvailableModes); + } } private void checkReportedOptedInGameModes(GameManagerService gameManagerService, @@ -726,6 +745,14 @@ public class GameManagerServiceTests { GameManager.GAME_MODE_STANDARD, GameManager.GAME_MODE_CUSTOM); } + @Test + public void testDeviceConfig_nonGame() throws Exception { + mockAppCategory(mPackageName, ApplicationInfo.CATEGORY_AUDIO); + mockDeviceConfigAll(); + mockModifyGameModeGranted(); + checkReportedAvailableGameModes(createServiceAndStartUser(USER_ID_1)); + } + /** * Override device config for performance mode exists and is valid. */ @@ -1443,12 +1470,10 @@ public class GameManagerServiceTests { } @Test - public void testGameStateLoadingRequiresPerformanceMode() { + public void testSetGameState_loadingRequiresPerformanceMode() { mockDeviceConfigNone(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = - new GameManagerService(mMockContext, mTestLooper.getLooper()); - startUser(gameManagerService, USER_ID_1); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); GameState gameState = new GameState(true, GameState.MODE_NONE); gameManagerService.setGameState(mPackageName, gameState, USER_ID_1); mTestLooper.dispatchAll(); @@ -1509,9 +1534,7 @@ public class GameManagerServiceTests { public void testSetGameStateNotLoading() { 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_GAMEPLAY_UNINTERRUPTIBLE; @@ -1523,12 +1546,24 @@ public class GameManagerServiceTests { assertEquals(testLabel, gameState.getLabel()); assertEquals(testQuality, gameState.getQuality()); gameManagerService.setGameState(mPackageName, gameState, USER_ID_1); + assertTrue(gameManagerService.mHandler.hasEqualMessages(SET_GAME_STATE, gameState)); mTestLooper.dispatchAll(); verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false); assertFalse( gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); } + @Test + public void testSetGameState_nonGame() throws Exception { + mockAppCategory(mPackageName, ApplicationInfo.CATEGORY_AUDIO); + mockDeviceConfigNone(); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + GameState gameState = new GameState(true, GameState.MODE_NONE); + gameManagerService.setGameState(mPackageName, gameState, USER_ID_1); + assertFalse(gameManagerService.mHandler.hasMessages(SET_GAME_STATE)); + } + private List<String> readGameModeInterventionList() throws Exception { final File interventionFile = new File(InstrumentationRegistry.getContext().getFilesDir(), "system/game_mode_intervention.list"); @@ -1824,6 +1859,21 @@ public class GameManagerServiceTests { } @Test + public void testUpdateCustomGameModeConfiguration_nonGame() throws Exception { + mockAppCategory(mPackageName, ApplicationInfo.CATEGORY_IMAGE); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + gameManagerService.updateCustomGameModeConfiguration(mPackageName, + new GameModeConfiguration.Builder().setScalingFactor(0.35f).setFpsOverride( + 60).build(), + USER_ID_1); + assertFalse(gameManagerService.mHandler.hasMessages(WRITE_SETTINGS)); + GameManagerService.GamePackageConfiguration pkgConfig = gameManagerService.getConfig( + mPackageName, USER_ID_1); + assertNull(pkgConfig); + } + + @Test public void testWritingSettingFile_onShutdown() throws InterruptedException { mockModifyGameModeGranted(); mockDeviceConfigAll(); @@ -1983,4 +2033,111 @@ public class GameManagerServiceTests { } folder.delete(); } + + @Test + public void testNotifyGraphicsEnvironmentSetup() { + 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); + gameManagerService.notifyGraphicsEnvironmentSetup(mPackageName, USER_ID_1); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, true); + 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 testNotifyGraphicsEnvironmentSetup_outOfBoundBoostValue() { + String configString = "mode=2,loadingBoost=0:mode=3,loadingBoost=7000"; + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); + gameManagerService.notifyGraphicsEnvironmentSetup(mPackageName, USER_ID_1); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, true); + reset(mMockPowerManager); + assertTrue(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + mTestLooper.moveTimeForward(100); + mTestLooper.dispatchAll(); + // 0 loading boost value should still trigger max timeout + verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean()); + assertTrue(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + mTestLooper.moveTimeForward(LOADING_BOOST_MAX_DURATION); + mTestLooper.dispatchAll(); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false); + reset(mMockPowerManager); + assertFalse(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + + // 7000 loading boost value should exceed the max timeout of 5s and be bounded + gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_BATTERY, USER_ID_1); + gameManagerService.notifyGraphicsEnvironmentSetup(mPackageName, USER_ID_1); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, true); + reset(mMockPowerManager); + assertTrue(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + mTestLooper.moveTimeForward(LOADING_BOOST_MAX_DURATION); + mTestLooper.dispatchAll(); + verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false); + assertFalse(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + } + + @Test + public void testNotifyGraphicsEnvironmentSetup_noDeviceConfig() { + mockDeviceConfigNone(); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + gameManagerService.notifyGraphicsEnvironmentSetup(mPackageName, USER_ID_1); + verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean()); + assertFalse(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + } + + @Test + public void testNotifyGraphicsEnvironmentSetup_noLoadingBoostValue() { + mockDeviceConfigAll(); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + gameManagerService.notifyGraphicsEnvironmentSetup(mPackageName, USER_ID_1); + verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean()); + assertFalse(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + } + + @Test + public void testNotifyGraphicsEnvironmentSetup_nonGame() throws Exception { + String configString = "mode=2,loadingBoost=2000"; + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); + mockModifyGameModeGranted(); + mockAppCategory(mPackageName, ApplicationInfo.CATEGORY_IMAGE); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); + assertEquals(GameManager.GAME_MODE_UNSUPPORTED, + gameManagerService.getGameMode(mPackageName, USER_ID_1)); + gameManagerService.notifyGraphicsEnvironmentSetup(mPackageName, USER_ID_1); + verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean()); + assertFalse(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + } + + @Test + public void testNotifyGraphicsEnvironmentSetup_differentApp() throws Exception { + String configString = "mode=2,loadingBoost=2000"; + when(DeviceConfig.getProperty(anyString(), anyString())) + .thenReturn(configString); + mockModifyGameModeGranted(); + GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1); + String someGamePkg = "some.game"; + mockAppCategory(someGamePkg, ApplicationInfo.CATEGORY_GAME); + when(mMockPackageManager.getPackageUidAsUser(someGamePkg, USER_ID_1)).thenReturn( + DEFAULT_PACKAGE_UID + 1); + gameManagerService.setGameMode(someGamePkg, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); + assertEquals(GameManager.GAME_MODE_PERFORMANCE, + gameManagerService.getGameMode(someGamePkg, USER_ID_1)); + gameManagerService.notifyGraphicsEnvironmentSetup(someGamePkg, USER_ID_1); + verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean()); + assertFalse(gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)); + } } |