summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Xiang Wang <xwxw@google.com> 2022-11-14 14:19:52 -0800
committer Xiang Wang <xwxw@google.com> 2022-11-16 01:46:06 +0000
commit36f6d05f42515b4732ffa270529dda241dedea4c (patch)
tree426556cd823a09b5f7f6561173af0eb1a2340976
parent14a97df16064418d1b6e3ace18523a60c8f7e27b (diff)
Fix the bug that user setting is removed when switching
The user is only started once and will not trigger onUserStarting in subsequent switching, we should not remove it from the mapping otherwise all the package configuration will get lost and game mode can't be set. Bug: 258724297 Bug: 259142812 Test: atest GameManagerServiceTests Change-Id: I79fecd6f0ef5d751ad4fbadb8cb3cc43df8f3bce Merged-In: I79fecd6f0ef5d751ad4fbadb8cb3cc43df8f3bce
-rw-r--r--services/core/java/com/android/server/app/GameManagerService.java19
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java32
2 files changed, 38 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index 4013acefa366..3584f16c6de1 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -1276,20 +1276,12 @@ public final class GameManagerService extends IGameManagerService.Stub {
void onUserSwitching(TargetUser from, TargetUser to) {
final int toUserId = to.getUserIdentifier();
- if (from != null) {
- synchronized (mLock) {
- final int fromUserId = from.getUserIdentifier();
- if (mSettings.containsKey(fromUserId)) {
- final Message msg = mHandler.obtainMessage(REMOVE_SETTINGS);
- msg.obj = fromUserId;
- mHandler.sendMessage(msg);
- }
- }
- }
+ // we want to re-populate the setting when switching user as the device config may have
+ // changed, which will only update for the previous user, see
+ // DeviceConfigListener#onPropertiesChanged.
final Message msg = mHandler.obtainMessage(POPULATE_GAME_MODE_SETTINGS);
msg.obj = toUserId;
mHandler.sendMessage(msg);
-
if (mGameServiceController != null) {
mGameServiceController.notifyNewForegroundUser(to);
}
@@ -1429,9 +1421,10 @@ public final class GameManagerService extends IGameManagerService.Stub {
Slog.v(TAG, "Package configuration not found for " + packageName);
return;
}
+ } else {
+ updateFps(packageConfig, packageName, gameMode, userId);
+ updateCompatModeDownscale(packageConfig, packageName, gameMode);
}
- updateCompatModeDownscale(packageConfig, packageName, gameMode);
- updateFps(packageConfig, packageName, gameMode, userId);
updateUseAngle(packageName, gameMode);
}
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 cfb80148f166..a47c529cd362 100644
--- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
@@ -1490,6 +1490,38 @@ public class GameManagerServiceTests {
}
@Test
+ public void testSwitchUser() {
+ mockManageUsersGranted();
+ mockModifyGameModeGranted();
+
+ mockDeviceConfigBattery();
+ final Context context = InstrumentationRegistry.getContext();
+ GameManagerService gameManagerService = new GameManagerService(mMockContext,
+ mTestLooper.getLooper(), context.getFilesDir());
+ startUser(gameManagerService, USER_ID_1);
+ startUser(gameManagerService, USER_ID_2);
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_BATTERY, USER_ID_1);
+ checkReportedModes(gameManagerService, GameManager.GAME_MODE_STANDARD,
+ GameManager.GAME_MODE_BATTERY);
+ assertEquals(gameManagerService.getGameMode(mPackageName, USER_ID_1),
+ GameManager.GAME_MODE_BATTERY);
+
+ mockDeviceConfigAll();
+ switchUser(gameManagerService, USER_ID_1, USER_ID_2);
+ assertEquals(gameManagerService.getGameMode(mPackageName, USER_ID_2),
+ GameManager.GAME_MODE_STANDARD);
+ checkReportedModes(gameManagerService, GameManager.GAME_MODE_STANDARD,
+ GameManager.GAME_MODE_BATTERY, GameManager.GAME_MODE_PERFORMANCE);
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_2);
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_BATTERY, USER_ID_1);
+
+ switchUser(gameManagerService, USER_ID_2, USER_ID_1);
+ checkReportedModes(gameManagerService, GameManager.GAME_MODE_STANDARD,
+ GameManager.GAME_MODE_BATTERY, GameManager.GAME_MODE_PERFORMANCE);
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_2);
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_BATTERY, USER_ID_1);
+ }
+
public void testResetInterventions_onDeviceConfigReset() throws Exception {
mockModifyGameModeGranted();
String configStringBefore =