Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3bf26957 authored by Xiang Wang's avatar Xiang Wang
Browse files

Skip game shell commands if the package is not categorized as game

Log a message to suggest updating the app manifest

Bug: 354028293
Test: local build and run `adb shell cmd game mode 4 <package>`
Change-Id: Ib368367eed386efdf6448ada59e5540388ddbc04
parent 52148993
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -269,7 +269,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
    @Override
    public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
            String[] args, ShellCallback callback, ResultReceiver result) {
        new GameManagerShellCommand().exec(this, in, out, err, args, callback, result);
        new GameManagerShellCommand(mPackageManager).exec(this, in, out, err, args, callback,
                result);
    }

    @Override
+45 −10
Original line number Diff line number Diff line
@@ -16,10 +16,13 @@

package com.android.server.app;

import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.GameManager;
import android.app.IGameManagerService;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
@@ -47,7 +50,10 @@ public class GameManagerShellCommand extends ShellCommand {
    private static final String UNSUPPORTED_MODE_NUM = String.valueOf(
            GameManager.GAME_MODE_UNSUPPORTED);

    public GameManagerShellCommand() {
    private PackageManager mPackageManager;

    public GameManagerShellCommand(@NonNull PackageManager packageManager) {
        mPackageManager = packageManager;
    }

    @Override
@@ -91,9 +97,29 @@ public class GameManagerShellCommand extends ShellCommand {
        return -1;
    }

    private boolean isPackageGame(String packageName, int userId, PrintWriter pw) {
        try {
            final ApplicationInfo applicationInfo = mPackageManager
                    .getApplicationInfoAsUser(packageName, PackageManager.MATCH_ALL, userId);
            boolean isGame = applicationInfo.category == ApplicationInfo.CATEGORY_GAME;
            if (!isGame) {
                pw.println("Package " + packageName + " is not of game type, to use the game "
                        + "mode commands, it must specify game category in the manifest as "
                        + "android:appCategory=\"game\"");
            }
            return isGame;
        } catch (PackageManager.NameNotFoundException e) {
            pw.println("Package " + packageName + " is not found for user " + userId);
            return false;
        }
    }

    private int runListGameModes(PrintWriter pw) throws ServiceNotFoundException, RemoteException {
        final String packageName = getNextArgRequired();
        final int userId = ActivityManager.getCurrentUser();
        if (!isPackageGame(packageName, userId, pw)) {
            return -1;
        }
        final GameManagerService gameManagerService = (GameManagerService)
                ServiceManager.getService(Context.GAME_SERVICE);
        final String currentMode = gameModeIntToString(
@@ -110,12 +136,15 @@ public class GameManagerShellCommand extends ShellCommand {
    private int runListGameModeConfigs(PrintWriter pw)
            throws ServiceNotFoundException, RemoteException {
        final String packageName = getNextArgRequired();

        final int userId = ActivityManager.getCurrentUser();
        if (!isPackageGame(packageName, userId, pw)) {
            return -1;
        }
        final GameManagerService gameManagerService = (GameManagerService)
                ServiceManager.getService(Context.GAME_SERVICE);

        final String listStr = gameManagerService.getInterventionList(packageName,
                ActivityManager.getCurrentUser());
                userId);

        if (listStr == null) {
            pw.println("No interventions found for " + packageName);
@@ -131,15 +160,17 @@ public class GameManagerShellCommand extends ShellCommand {
        if (option != null && option.equals("--user")) {
            userIdStr = getNextArgRequired();
        }

        final String gameMode = getNextArgRequired();
        final String packageName = getNextArgRequired();
        int userId = userIdStr != null ? Integer.parseInt(userIdStr)
                : ActivityManager.getCurrentUser();
        if (!isPackageGame(packageName, userId, pw)) {
            return -1;
        }
        final IGameManagerService service = IGameManagerService.Stub.asInterface(
                ServiceManager.getServiceOrThrow(Context.GAME_SERVICE));
        boolean batteryModeSupported = false;
        boolean perfModeSupported = false;
        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) {
@@ -262,6 +293,9 @@ public class GameManagerShellCommand extends ShellCommand {

        int userId = userIdStr != null ? Integer.parseInt(userIdStr)
                : ActivityManager.getCurrentUser();
        if (!isPackageGame(packageName, userId, pw)) {
            return -1;
        }

        final GameManagerService gameManagerService = (GameManagerService)
                ServiceManager.getService(Context.GAME_SERVICE);
@@ -308,13 +342,14 @@ public class GameManagerShellCommand extends ShellCommand {
        }

        final String packageName = getNextArgRequired();

        final GameManagerService gameManagerService = (GameManagerService)
                ServiceManager.getService(Context.GAME_SERVICE);

        int userId = userIdStr != null ? Integer.parseInt(userIdStr)
                : ActivityManager.getCurrentUser();
        if (!isPackageGame(packageName, userId, pw)) {
            return -1;
        }

        final GameManagerService gameManagerService = (GameManagerService)
                ServiceManager.getService(Context.GAME_SERVICE);
        if (gameMode == null) {
            gameManagerService.resetGameModeConfigOverride(packageName, userId, -1);
            return 0;