Merge "Add loading boost intervention for games." into tm-dev
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user