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

Commit d7cf4bcb authored by Xiang Wang's avatar Xiang Wang
Browse files

Always return STANDARD & CUSTOM game modes as available modes

Change the default game mode from UNSUPPORTED to STANDARD when config
is missing etc. This will solve the ambiguity on UNSUPPORTED as it's
publicly documented to always return from getGameMode when application
is not a game instead.

Bug: b/243448953
Test: atest GameManagerServiceTests
Change-Id: I277735cccd0daf6148aa106cc31bf92f73db018a
parent 4ab05d06
Loading
Loading
Loading
Loading
+34 −38
Original line number Original line Diff line number Diff line
@@ -598,6 +598,14 @@ public final class GameManagerService extends IGameManagerService.Stub {
            }
            }
        }
        }


        // used to check if the override package config has any game mode config, if not, it's
        // considered empty and safe to delete from settings
        boolean hasActiveGameModeConfig() {
            synchronized (mModeConfigLock) {
                return !mModeConfigs.isEmpty();
            }
        }

        /**
        /**
         * GameModeConfiguration contains all the values for all the interventions associated with
         * GameModeConfiguration contains all the values for all the interventions associated with
         * a game mode.
         * a game mode.
@@ -693,7 +701,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
            public boolean isActive() {
            public boolean isActive() {
                return (mGameMode == GameManager.GAME_MODE_STANDARD
                return (mGameMode == GameManager.GAME_MODE_STANDARD
                        || mGameMode == GameManager.GAME_MODE_PERFORMANCE
                        || mGameMode == GameManager.GAME_MODE_PERFORMANCE
                        || mGameMode == GameManager.GAME_MODE_BATTERY)
                        || mGameMode == GameManager.GAME_MODE_BATTERY
                        || mGameMode == GameManager.GAME_MODE_CUSTOM)
                        && !willGamePerformOptimizations(mGameMode);
                        && !willGamePerformOptimizations(mGameMode);
            }
            }


@@ -741,7 +750,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
        }
        }


        private int getAvailableGameModesBitfield() {
        private int getAvailableGameModesBitfield() {
            int field = 0;
            int field = modeToBitmask(GameManager.GAME_MODE_CUSTOM)
                    | modeToBitmask(GameManager.GAME_MODE_STANDARD);
            synchronized (mModeConfigLock) {
            synchronized (mModeConfigLock) {
                for (final int mode : mModeConfigs.keySet()) {
                for (final int mode : mModeConfigs.keySet()) {
                    field |= modeToBitmask(mode);
                    field |= modeToBitmask(mode);
@@ -753,13 +763,6 @@ public final class GameManagerService extends IGameManagerService.Stub {
            if (mPerfModeOptedIn) {
            if (mPerfModeOptedIn) {
                field |= modeToBitmask(GameManager.GAME_MODE_PERFORMANCE);
                field |= modeToBitmask(GameManager.GAME_MODE_PERFORMANCE);
            }
            }
            // The lowest bit is reserved for UNSUPPORTED, STANDARD is supported if we support any
            // other mode.
            if (field > 1) {
                field |= modeToBitmask(GameManager.GAME_MODE_STANDARD);
            } else {
                field |= modeToBitmask(GameManager.GAME_MODE_UNSUPPORTED);
            }
            return field;
            return field;
        }
        }


@@ -881,7 +884,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
    private final class LocalService extends GameManagerInternal {
    private final class LocalService extends GameManagerInternal {
        @Override
        @Override
        public float getResolutionScalingFactor(String packageName, int userId) {
        public float getResolutionScalingFactor(String packageName, int userId) {
            final int gameMode = getGameModeFromSettings(packageName, userId);
            final int gameMode = getGameModeFromSettingsUnchecked(packageName, userId);
            return getResolutionScalingFactorInternal(packageName, gameMode, userId);
            return getResolutionScalingFactorInternal(packageName, gameMode, userId);
        }
        }
    }
    }
@@ -960,7 +963,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
            config = mConfigs.get(packageName);
            config = mConfigs.get(packageName);
        }
        }
        if (config == null) {
        if (config == null) {
            return new int[]{};
            return new int[]{GameManager.GAME_MODE_STANDARD, GameManager.GAME_MODE_CUSTOM};
        }
        }
        return config.getAvailableGameModes();
        return config.getAvailableGameModes();
    }
    }
@@ -986,12 +989,13 @@ public final class GameManagerService extends IGameManagerService.Stub {
        return getAvailableGameModesUnchecked(packageName);
        return getAvailableGameModesUnchecked(packageName);
    }
    }


    private @GameMode int getGameModeFromSettings(String packageName, @UserIdInt int userId) {
    private @GameMode int getGameModeFromSettingsUnchecked(String packageName,
            @UserIdInt int userId) {
        synchronized (mLock) {
        synchronized (mLock) {
            if (!mSettings.containsKey(userId)) {
            if (!mSettings.containsKey(userId)) {
                Slog.d(TAG, "User ID '" + userId + "' does not have a Game Mode"
                Slog.d(TAG, "User ID '" + userId + "' does not have a Game Mode"
                        + " selected for package: '" + packageName + "'");
                        + " selected for package: '" + packageName + "'");
                return GameManager.GAME_MODE_UNSUPPORTED;
                return GameManager.GAME_MODE_STANDARD;
            }
            }


            return mSettings.get(userId).getGameModeLocked(packageName);
            return mSettings.get(userId).getGameModeLocked(packageName);
@@ -1024,12 +1028,12 @@ public final class GameManagerService extends IGameManagerService.Stub {
        // return a value if the package name is valid. Next, check if the caller has the necessary
        // return a value if the package name is valid. Next, check if the caller has the necessary
        // permission and return a value. Do this check last, since it can throw an exception.
        // permission and return a value. Do this check last, since it can throw an exception.
        if (isValidPackageName(packageName, userId)) {
        if (isValidPackageName(packageName, userId)) {
            return getGameModeFromSettings(packageName, userId);
            return getGameModeFromSettingsUnchecked(packageName, userId);
        }
        }


        // Since the package name doesn't match, check the caller has the necessary permission.
        // Since the package name doesn't match, check the caller has the necessary permission.
        checkPermission(Manifest.permission.MANAGE_GAME_MODE);
        checkPermission(Manifest.permission.MANAGE_GAME_MODE);
        return getGameModeFromSettings(packageName, userId);
        return getGameModeFromSettingsUnchecked(packageName, userId);
    }
    }


    /**
    /**
@@ -1054,7 +1058,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
            return null;
            return null;
        }
        }


        final @GameMode int activeGameMode = getGameModeFromSettings(packageName, userId);
        final @GameMode int activeGameMode = getGameModeFromSettingsUnchecked(packageName, userId);
        final GamePackageConfiguration config = getConfig(packageName, userId);
        final GamePackageConfiguration config = getConfig(packageName, userId);
        if (config != null) {
        if (config != null) {
            final @GameMode int[] optedInGameModes = config.getOptedInGameModes();
            final @GameMode int[] optedInGameModes = config.getOptedInGameModes();
@@ -1077,7 +1081,10 @@ public final class GameManagerService extends IGameManagerService.Stub {
            }
            }
            return gameModeInfoBuilder.build();
            return gameModeInfoBuilder.build();
        } else {
        } else {
            return new GameModeInfo.Builder().setActiveGameMode(activeGameMode).build();
            return new GameModeInfo.Builder()
                    .setActiveGameMode(activeGameMode)
                    .setAvailableGameModes(getAvailableGameModesUnchecked(packageName))
                    .build();
        }
        }
    }
    }


@@ -1474,7 +1481,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
        final GamePackageConfiguration packageConfig = getConfig(packageName, userId);
        final GamePackageConfiguration packageConfig = getConfig(packageName, userId);
        if (gameMode == GameManager.GAME_MODE_STANDARD
        if (gameMode == GameManager.GAME_MODE_STANDARD
                || gameMode == GameManager.GAME_MODE_UNSUPPORTED || packageConfig == null
                || gameMode == GameManager.GAME_MODE_UNSUPPORTED || packageConfig == null
                || packageConfig.willGamePerformOptimizations(gameMode)) {
                || packageConfig.willGamePerformOptimizations(gameMode)
                || packageConfig.getGameModeConfiguration(gameMode) == null) {
            resetFps(packageName, userId);
            resetFps(packageName, userId);
            // resolution scaling does not need to be reset as it's now read dynamically on game
            // resolution scaling does not need to be reset as it's now read dynamically on game
            // restart, see #getResolutionScalingFactor and CompatModePackages#getCompatScale.
            // restart, see #getResolutionScalingFactor and CompatModePackages#getCompatScale.
@@ -1562,13 +1570,9 @@ public final class GameManagerService extends IGameManagerService.Stub {
                if (!bitFieldContainsModeBitmask(modesBitfield, gameModeToReset)) {
                if (!bitFieldContainsModeBitmask(modesBitfield, gameModeToReset)) {
                    return;
                    return;
                }
                }
                // if the game mode to reset is the only mode other than standard mode or there
                // is device config, the entire package config override is removed.
                if (Integer.bitCount(modesBitfield) <= 2 || deviceConfig == null) {
                    settings.removeConfigOverride(packageName);
                } else {
                    // otherwise we reset the mode by removing the game mode config override
                configOverride.removeModeConfig(gameModeToReset);
                configOverride.removeModeConfig(gameModeToReset);
                if (!configOverride.hasActiveGameModeConfig()) {
                    settings.removeConfigOverride(packageName);
                }
                }
            } else {
            } else {
                settings.removeConfigOverride(packageName);
                settings.removeConfigOverride(packageName);
@@ -1596,20 +1600,12 @@ public final class GameManagerService extends IGameManagerService.Stub {
            // want to check if we support selectable game modes
            // want to check if we support selectable game modes
            modesBitfield &= ~modeToBitmask(GameManager.GAME_MODE_UNSUPPORTED);
            modesBitfield &= ~modeToBitmask(GameManager.GAME_MODE_UNSUPPORTED);
            if (!bitFieldContainsModeBitmask(modesBitfield, gameMode)) {
            if (!bitFieldContainsModeBitmask(modesBitfield, gameMode)) {
                if (bitFieldContainsModeBitmask(modesBitfield,
                // always default to STANDARD if there is no mode config
                        GameManager.GAME_MODE_STANDARD)) {
                    // If the current set mode isn't supported,
                    // but we support STANDARD, then set the mode to STANDARD.
                newGameMode = GameManager.GAME_MODE_STANDARD;
                newGameMode = GameManager.GAME_MODE_STANDARD;
                } else {
                    // If we don't support any game modes, then set to UNSUPPORTED
                    newGameMode = GameManager.GAME_MODE_UNSUPPORTED;
                }
            }
            }
        } else if (gameMode != GameManager.GAME_MODE_UNSUPPORTED) {
        } else {
            // If we have no config for the package, but the configured mode is not
            // always default to STANDARD if there is no package config
            // UNSUPPORTED, then set to UNSUPPORTED
            newGameMode = GameManager.GAME_MODE_STANDARD;
            newGameMode = GameManager.GAME_MODE_UNSUPPORTED;
        }
        }
        return newGameMode;
        return newGameMode;
    }
    }
+3 −3
Original line number Original line Diff line number Diff line
@@ -92,7 +92,7 @@ public class GameManagerSettings {
        if (mGameModes.containsKey(packageName)) {
        if (mGameModes.containsKey(packageName)) {
            return mGameModes.get(packageName);
            return mGameModes.get(packageName);
        }
        }
        return GameManager.GAME_MODE_UNSUPPORTED;
        return GameManager.GAME_MODE_STANDARD;
    }
    }


    /**
    /**
@@ -255,7 +255,7 @@ public class GameManagerSettings {
            XmlUtils.skipCurrentTag(parser);
            XmlUtils.skipCurrentTag(parser);
            return;
            return;
        }
        }
        int gameMode = GameManager.GAME_MODE_UNSUPPORTED;
        int gameMode;
        try {
        try {
            gameMode = parser.getAttributeInt(null, ATTR_GAME_MODE);
            gameMode = parser.getAttributeInt(null, ATTR_GAME_MODE);
        } catch (XmlPullParserException e) {
        } catch (XmlPullParserException e) {
@@ -282,7 +282,7 @@ public class GameManagerSettings {
                        + type);
                        + type);
            }
            }
        }
        }
        if (config.getAvailableGameModes().length > 1) {
        if (config.hasActiveGameModeConfig()) {
            mConfigOverrides.put(name, config);
            mConfigOverrides.put(name, config);
        }
        }
    }
    }
+61 −46

File changed.

Preview size limit exceeded, changes collapsed.