Merge "Add loading boost intervention for games." into tm-dev

This commit is contained in:
Jim Blackler
2022-04-01 09:39:44 +00:00
committed by Android (Google) Code Review
5 changed files with 148 additions and 1 deletions

View File

@@ -199,6 +199,21 @@ public final class GameManager {
} }
} }
/**
* Set up the automatic power boost if appropriate.
*
* @hide
*/
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
public void notifyGraphicsEnvironmentSetup() {
try {
mService.notifyGraphicsEnvironmentSetup(
mContext.getPackageName(), mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/** /**
* Called by games to communicate the current state to the platform. * Called by games to communicate the current state to the platform.
* @param gameState An object set to the current state. * @param gameState An object set to the current state.

View File

@@ -27,6 +27,7 @@ interface IGameManagerService {
void setGameMode(String packageName, int gameMode, int userId); void setGameMode(String packageName, int gameMode, int userId);
int[] getAvailableGameModes(String packageName); int[] getAvailableGameModes(String packageName);
boolean isAngleEnabled(String packageName, int userId); boolean isAngleEnabled(String packageName, int userId);
void notifyGraphicsEnvironmentSetup(String packageName, int userId);
void setGameState(String packageName, in GameState gameState, int userId); void setGameState(String packageName, in GameState gameState, int userId);
GameModeInfo getGameModeInfo(String packageName, int userId); GameModeInfo getGameModeInfo(String packageName, int userId);
void setGameServiceProvider(String packageName); void setGameServiceProvider(String packageName);

View File

@@ -157,6 +157,13 @@ public class GraphicsEnvironment {
} }
} }
Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "notifyGraphicsEnvironmentSetup");
if (mGameManager != null
&& appInfoWithMetaData.category == ApplicationInfo.CATEGORY_GAME) {
mGameManager.notifyGraphicsEnvironmentSetup();
}
Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
} }
/** /**

View File

@@ -572,11 +572,13 @@ public final class GameManagerService extends IGameManagerService.Stub {
public static final String DEFAULT_SCALING = "1.0"; public static final String DEFAULT_SCALING = "1.0";
public static final String DEFAULT_FPS = ""; public static final String DEFAULT_FPS = "";
public static final String ANGLE_KEY = "useAngle"; public static final String ANGLE_KEY = "useAngle";
public static final String LOADING_BOOST_KEY = "loadingBoost";
private final @GameMode int mGameMode; private final @GameMode int mGameMode;
private String mScaling; private String mScaling;
private String mFps; private String mFps;
private final boolean mUseAngle; private final boolean mUseAngle;
private final int mLoadingBoostDuration;
GameModeConfiguration(KeyValueListParser parser) { GameModeConfiguration(KeyValueListParser parser) {
mGameMode = parser.getInt(MODE_KEY, GameManager.GAME_MODE_UNSUPPORTED); mGameMode = parser.getInt(MODE_KEY, GameManager.GAME_MODE_UNSUPPORTED);
@@ -595,6 +597,9 @@ public final class GameManagerService extends IGameManagerService.Stub {
// - The Phenotype config has enabled it. // - The Phenotype config has enabled it.
mUseAngle = mAllowAngle && !willGamePerformOptimizations(mGameMode) mUseAngle = mAllowAngle && !willGamePerformOptimizations(mGameMode)
&& parser.getBoolean(ANGLE_KEY, false); && parser.getBoolean(ANGLE_KEY, false);
mLoadingBoostDuration = willGamePerformOptimizations(mGameMode) ? -1
: parser.getInt(LOADING_BOOST_KEY, -1);
} }
public int getGameMode() { public int getGameMode() {
@@ -613,6 +618,10 @@ public final class GameManagerService extends IGameManagerService.Stub {
return mUseAngle; return mUseAngle;
} }
public int getLoadingBoostDuration() {
return mLoadingBoostDuration;
}
public void setScaling(String scaling) { public void setScaling(String scaling) {
mScaling = scaling; mScaling = scaling;
} }
@@ -633,7 +642,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
*/ */
public String toString() { public String toString() {
return "[Game Mode:" + mGameMode + ",Scaling:" + mScaling + ",Use Angle:" return "[Game Mode:" + mGameMode + ",Scaling:" + mScaling + ",Use Angle:"
+ mUseAngle + ",Fps:" + mFps + "]"; + mUseAngle + ",Fps:" + mFps + ",Loading Boost Duration:"
+ mLoadingBoostDuration + "]";
} }
/** /**
@@ -967,6 +977,63 @@ public final class GameManagerService extends IGameManagerService.Stub {
} }
} }
/**
* If loading boost is applicable for the package for the currently enabled game mode, return
* the boost duration. If no configuration is available for the selected package or mode, the
* default is returned.
*/
@VisibleForTesting
public int getLoadingBoostDuration(String packageName, int userId)
throws SecurityException {
final int gameMode = getGameMode(packageName, userId);
if (gameMode == GameManager.GAME_MODE_UNSUPPORTED) {
return -1;
}
synchronized (mDeviceConfigLock) {
final GamePackageConfiguration config = mConfigs.get(packageName);
if (config == null) {
return -1;
}
GamePackageConfiguration.GameModeConfiguration gameModeConfiguration =
config.getGameModeConfiguration(gameMode);
if (gameModeConfiguration == null) {
return -1;
}
return gameModeConfiguration.getLoadingBoostDuration();
}
}
/**
* If loading boost is enabled, invoke it.
*/
@Override
@RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
@GameMode public void notifyGraphicsEnvironmentSetup(String packageName, int userId)
throws SecurityException {
userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
Binder.getCallingUid(), userId, false, true, "notifyGraphicsEnvironmentSetup",
"com.android.server.app.GameManagerService");
// Restrict to games only.
if (!isPackageGame(packageName, userId)) {
return;
}
if (!isValidPackageName(packageName, userId)) {
return;
}
final int gameMode = getGameMode(packageName, userId);
if (gameMode == GameManager.GAME_MODE_UNSUPPORTED) {
return;
}
final int loadingBoostDuration = getLoadingBoostDuration(packageName, userId);
if (loadingBoostDuration != -1) {
mPowerManagerInternal.setPowerBoost(Mode.GAME_LOADING, loadingBoostDuration);
}
}
/** /**
* Sets the game service provider to a given package, meant for testing. * Sets the game service provider to a given package, meant for testing.
* *

View File

@@ -231,6 +231,14 @@ public class GameManagerServiceTests {
.thenReturn(configString); .thenReturn(configString);
} }
// Loading boost will be disabled for most apps, so treat enabling loading boost as a special
// case.
private void mockDeviceConfigPerformanceEnableLoadingBoost() {
String configString = "mode=2,downscaleFactor=0.5,loadingBoost=0";
when(DeviceConfig.getProperty(anyString(), anyString()))
.thenReturn(configString);
}
private void mockDeviceConfigBattery() { private void mockDeviceConfigBattery() {
String configString = "mode=3,downscaleFactor=0.7,fps=30"; String configString = "mode=3,downscaleFactor=0.7,fps=30";
when(DeviceConfig.getProperty(anyString(), anyString())) when(DeviceConfig.getProperty(anyString(), anyString()))
@@ -566,6 +574,21 @@ public class GameManagerServiceTests {
assertEquals(gameManagerService.isAngleEnabled(mPackageName, USER_ID_1), angleEnabled); assertEquals(gameManagerService.isAngleEnabled(mPackageName, USER_ID_1), angleEnabled);
} }
private void checkLoadingBoost(GameManagerService gameManagerService, int gameMode,
int loadingBoost) {
gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName);
// Validate GamePackageConfiguration returns the correct value.
GameManagerService.GamePackageConfiguration config =
gameManagerService.getConfig(mPackageName);
assertEquals(
loadingBoost, config.getGameModeConfiguration(gameMode).getLoadingBoostDuration());
// Validate GameManagerService.getLoadingBoostDuration() returns the correct value.
assertEquals(
loadingBoost, gameManagerService.getLoadingBoostDuration(mPackageName, USER_ID_1));
}
private void checkFps(GameManagerService gameManagerService, int gameMode, int fps) { private void checkFps(GameManagerService gameManagerService, int gameMode, int fps) {
if (gameManagerService == null) { if (gameManagerService == null) {
gameManagerService = new GameManagerService(mMockContext, mTestLooper.getLooper()); gameManagerService = new GameManagerService(mMockContext, mTestLooper.getLooper());
@@ -921,6 +944,21 @@ public class GameManagerServiceTests {
checkAngleEnabled(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, false); checkAngleEnabled(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, false);
} }
/**
* PERFORMANCE game mode is configured through Phenotype. The app hasn't specified any
* metadata.
*/
@Test
public void testInterventionAllowLoadingBoostDefault() throws Exception {
GameManagerService gameManagerService = new GameManagerService(
mMockContext, mTestLooper.getLooper());
startUser(gameManagerService, USER_ID_1);
mockDeviceConfigPerformance();
mockModifyGameModeGranted();
checkLoadingBoost(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, -1);
}
/** /**
* PERFORMANCE game mode is configured through Phenotype. The app has opted-out of ANGLE. * PERFORMANCE game mode is configured through Phenotype. The app has opted-out of ANGLE.
*/ */
@@ -955,6 +993,25 @@ public class GameManagerServiceTests {
checkAngleEnabled(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, true); checkAngleEnabled(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, true);
} }
/**
* PERFORMANCE game mode is configured through Phenotype. The app has redundantly specified the
* Loading Boost metadata default value of "true".
*/
@Test
public void testInterventionAllowLoadingBoost() throws Exception {
mockDeviceConfigPerformanceEnableLoadingBoost();
GameManagerService gameManagerService =
new GameManagerService(mMockContext, mTestLooper.getLooper());
startUser(gameManagerService, USER_ID_1);
mockModifyGameModeGranted();
gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
assertEquals(GameManager.GAME_MODE_PERFORMANCE,
gameManagerService.getGameMode(mPackageName, USER_ID_1));
mockInterventionsEnabledFromXml();
checkLoadingBoost(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, 0);
}
@Test @Test
public void testGameModeConfigAllowFpsTrue() throws Exception { public void testGameModeConfigAllowFpsTrue() throws Exception {
mockDeviceConfigAll(); mockDeviceConfigAll();