diff options
| -rw-r--r-- | services/core/java/com/android/server/app/GameManagerShellCommand.java | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/app/GameManagerShellCommand.java b/services/core/java/com/android/server/app/GameManagerShellCommand.java index e4c0002ab513..c5f1a0b3f67e 100644 --- a/services/core/java/com/android/server/app/GameManagerShellCommand.java +++ b/services/core/java/com/android/server/app/GameManagerShellCommand.java @@ -16,6 +16,8 @@ package com.android.server.app; +import android.app.GameManager; +import android.app.IGameManagerService; import android.compat.Compatibility; import android.content.Context; import android.os.ServiceManager; @@ -55,7 +57,7 @@ public class GameManagerShellCommand extends ShellCommand { final PrintWriter pw = getOutPrintWriter(); try { switch (cmd) { - case "downscale": + case "downscale": { final String ratio = getNextArgRequired(); final String packageName = getNextArgRequired(); @@ -114,6 +116,71 @@ public class GameManagerShellCommand extends ShellCommand { } break; + } + case "mode": { + /** The "mode" command allows setting a package's current game mode outside of + * the game dashboard UI. This command requires that a mode already be supported + * by the package. Devs can forcibly support game modes via the manifest + * metadata flags: com.android.app.gamemode.performance.enabled, + * com.android.app.gamemode.battery.enabled + * OR by `adb shell device_config put game_overlay \ + * <PACKAGE_NAME> <CONFIG_STRING>` + * see: {@link GameManagerServiceTests#mockDeviceConfigAll()} + */ + final String gameMode = getNextArgRequired(); + final String packageName = getNextArgRequired(); + final String userIdStr = getNextArgRequired(); + final IGameManagerService service = IGameManagerService.Stub.asInterface( + ServiceManager.getServiceOrThrow(Context.GAME_SERVICE)); + boolean batteryModeSupported = false; + boolean perfModeSupported = false; + int[] modes = service.getAvailableGameModes(packageName); + for (int mode : modes) { + if (mode == GameManager.GAME_MODE_PERFORMANCE) { + perfModeSupported = true; + } else if (mode == GameManager.GAME_MODE_BATTERY) { + batteryModeSupported = true; + } + } + int userId = Integer.parseInt(userIdStr); + switch (gameMode.toLowerCase()) { + case "1": + case "standard": + // Standard should only be available if other game modes are. + if (batteryModeSupported || perfModeSupported) { + service.setGameMode(packageName, GameManager.GAME_MODE_STANDARD, + userId); + } else { + pw.println("Game mode: " + gameMode + " not supported by " + + packageName); + } + break; + case "2": + case "performance": + if (perfModeSupported) { + service.setGameMode(packageName, GameManager.GAME_MODE_PERFORMANCE, + userId); + } else { + pw.println("Game mode: " + gameMode + " not supported by " + + packageName); + } + break; + case "3": + case "battery": + if (batteryModeSupported) { + service.setGameMode(packageName, GameManager.GAME_MODE_BATTERY, + userId); + } else { + pw.println("Game mode: " + gameMode + " not supported by " + + packageName); + } + break; + default: + pw.println("Invalid game mode: " + gameMode); + break; + } + break; + } default: return handleDefaultCommands(cmd); } @@ -132,5 +199,7 @@ public class GameManagerShellCommand extends ShellCommand { pw.println(" Print this help text."); pw.println(" downscale [0.5|0.6|0.7|0.8|0.9|disable] <PACKAGE_NAME>"); pw.println(" Force app to run at the specified scaling ratio."); + pw.println(" mode [1|2|3|standard|performance|battery] <PACKAGE_NAME> <USER_ID>"); + pw.println(" Force app to run in the specified game mode, if supported."); } } |