summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/app/GameManagerService.java29
-rw-r--r--services/tests/mockingservicestests/res/xml/game_manager_service_metadata_config_interventions_enabled_all_opt_in.xml9
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java87
3 files changed, 113 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index 558364f1461a..efa2f25bf3e3 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -1336,7 +1336,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
try {
final float fps = 0.0f;
final int uid = mPackageManager.getPackageUidAsUser(packageName, userId);
- nativeSetOverrideFrameRate(uid, fps);
+ setOverrideFrameRate(uid, fps);
} catch (PackageManager.NameNotFoundException e) {
return;
}
@@ -1368,7 +1368,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
try {
final float fps = modeConfig.getFps();
final int uid = mPackageManager.getPackageUidAsUser(packageName, userId);
- nativeSetOverrideFrameRate(uid, fps);
+ setOverrideFrameRate(uid, fps);
} catch (PackageManager.NameNotFoundException e) {
return;
}
@@ -1377,18 +1377,18 @@ public final class GameManagerService extends IGameManagerService.Stub {
private void updateInterventions(String packageName,
@GameMode int gameMode, @UserIdInt int userId) {
+ final GamePackageConfiguration packageConfig = getConfig(packageName, userId);
if (gameMode == GameManager.GAME_MODE_STANDARD
- || gameMode == GameManager.GAME_MODE_UNSUPPORTED) {
+ || gameMode == GameManager.GAME_MODE_UNSUPPORTED || packageConfig == null
+ || packageConfig.willGamePerformOptimizations(gameMode)) {
resetFps(packageName, userId);
- return;
- }
- final GamePackageConfiguration packageConfig = getConfig(packageName, userId);
- if (packageConfig == null) {
- Slog.v(TAG, "Package configuration not found for " + packageName);
- return;
- }
- if (packageConfig.willGamePerformOptimizations(gameMode)) {
- return;
+ // resolution scaling does not need to be reset as it's now read dynamically on game
+ // restart, see #getResolutionScalingFactor and CompatModePackages#getCompatScale.
+ // TODO: reset Angle intervention here once implemented
+ if (packageConfig == null) {
+ Slog.v(TAG, "Package configuration not found for " + packageName);
+ return;
+ }
}
updateFps(packageConfig, packageName, gameMode, userId);
updateUseAngle(packageName, gameMode);
@@ -1809,6 +1809,11 @@ public final class GameManagerService extends IGameManagerService.Stub {
return handlerThread;
}
+ @VisibleForTesting
+ void setOverrideFrameRate(int uid, float frameRate) {
+ nativeSetOverrideFrameRate(uid, frameRate);
+ }
+
/**
* load dynamic library for frame rate overriding JNI calls
*/
diff --git a/services/tests/mockingservicestests/res/xml/game_manager_service_metadata_config_interventions_enabled_all_opt_in.xml b/services/tests/mockingservicestests/res/xml/game_manager_service_metadata_config_interventions_enabled_all_opt_in.xml
new file mode 100644
index 000000000000..96d28785ba0a
--- /dev/null
+++ b/services/tests/mockingservicestests/res/xml/game_manager_service_metadata_config_interventions_enabled_all_opt_in.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<game-mode-config
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:supportsPerformanceGameMode="true"
+ android:supportsBatteryGameMode="true"
+ android:allowGameAngleDriver="true"
+ android:allowGameDownscaling="true"
+ android:allowGameFpsOverride="true"
+/> \ No newline at end of file
diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
index c7f8e54b99b1..d78f6d83d0ab 100644
--- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java
@@ -73,7 +73,9 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;
@@ -93,6 +95,7 @@ public class GameManagerServiceTests {
private static final String PACKAGE_NAME_INVALID = "com.android.app";
private static final int USER_ID_1 = 1001;
private static final int USER_ID_2 = 1002;
+ private static final int DEFAULT_PACKAGE_UID = 12345;
private MockitoSession mMockingSession;
private String mPackageName;
@@ -207,6 +210,8 @@ public class GameManagerServiceTests {
.thenReturn(packages);
when(mMockPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
.thenReturn(applicationInfo);
+ when(mMockPackageManager.getPackageUidAsUser(mPackageName, USER_ID_1)).thenReturn(
+ DEFAULT_PACKAGE_UID);
LocalServices.addService(PowerManagerInternal.class, mMockPowerManager);
}
@@ -387,6 +392,12 @@ public class GameManagerServiceTests {
"res/xml/game_manager_service_metadata_config_interventions_enabled_no_opt_in.xml");
}
+ private void mockInterventionsEnabledAllOptInFromXml() throws Exception {
+ seedGameManagerServiceMetaDataFromFile(mPackageName, 123,
+ "res/xml/game_manager_service_metadata_config_interventions_enabled_all_opt_in"
+ + ".xml");
+ }
+
private void mockInterventionsDisabledNoOptInFromXml() throws Exception {
seedGameManagerServiceMetaDataFromFile(mPackageName, 123,
"res/xml/game_manager_service_metadata_config_interventions_disabled_no_opt_in"
@@ -1623,6 +1634,82 @@ public class GameManagerServiceTests {
assertFalse(gameManagerService.mHandler.hasEqualMessages(WRITE_SETTINGS, USER_ID_1));
}
+ @Test
+ public void testResetInterventions_onDeviceConfigReset() throws Exception {
+ mockModifyGameModeGranted();
+ String configStringBefore =
+ "mode=2,downscaleFactor=1.0,fps=90";
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configStringBefore);
+ mockInterventionsEnabledNoOptInFromXml();
+ GameManagerService gameManagerService = Mockito.spy(new GameManagerService(mMockContext,
+ mTestLooper.getLooper()));
+ startUser(gameManagerService, USER_ID_1);
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
+ Mockito.verify(gameManagerService).setOverrideFrameRate(
+ ArgumentMatchers.eq(DEFAULT_PACKAGE_UID),
+ ArgumentMatchers.eq(90.0f));
+ checkFps(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, 90);
+
+ String configStringAfter = "";
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configStringAfter);
+ gameManagerService.updateConfigsForUser(USER_ID_1, false, mPackageName);
+ Mockito.verify(gameManagerService).setOverrideFrameRate(
+ ArgumentMatchers.eq(DEFAULT_PACKAGE_UID),
+ ArgumentMatchers.eq(0.0f));
+ }
+
+ @Test
+ public void testResetInterventions_onInterventionsDisabled() throws Exception {
+ mockModifyGameModeGranted();
+ String configStringBefore =
+ "mode=2,downscaleFactor=1.0,fps=90";
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configStringBefore);
+ mockInterventionsEnabledNoOptInFromXml();
+ GameManagerService gameManagerService = Mockito.spy(new GameManagerService(mMockContext,
+ mTestLooper.getLooper()));
+ startUser(gameManagerService, USER_ID_1);
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
+ Mockito.verify(gameManagerService).setOverrideFrameRate(
+ ArgumentMatchers.eq(DEFAULT_PACKAGE_UID),
+ ArgumentMatchers.eq(90.0f));
+ checkFps(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, 90);
+
+ mockInterventionsDisabledNoOptInFromXml();
+ gameManagerService.updateConfigsForUser(USER_ID_1, false, mPackageName);
+ Mockito.verify(gameManagerService).setOverrideFrameRate(
+ ArgumentMatchers.eq(DEFAULT_PACKAGE_UID),
+ ArgumentMatchers.eq(0.0f));
+ checkFps(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, 0);
+ }
+
+ @Test
+ public void testResetInterventions_onGameModeOptedIn() throws Exception {
+ mockModifyGameModeGranted();
+ String configStringBefore =
+ "mode=2,downscaleFactor=1.0,fps=90";
+ when(DeviceConfig.getProperty(anyString(), anyString()))
+ .thenReturn(configStringBefore);
+ mockInterventionsEnabledNoOptInFromXml();
+ GameManagerService gameManagerService = Mockito.spy(new GameManagerService(mMockContext,
+ mTestLooper.getLooper()));
+ startUser(gameManagerService, USER_ID_1);
+
+ gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
+ Mockito.verify(gameManagerService).setOverrideFrameRate(
+ ArgumentMatchers.eq(DEFAULT_PACKAGE_UID),
+ ArgumentMatchers.eq(90.0f));
+ checkFps(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, 90);
+
+ mockInterventionsEnabledAllOptInFromXml();
+ gameManagerService.updateConfigsForUser(USER_ID_1, false, mPackageName);
+ Mockito.verify(gameManagerService).setOverrideFrameRate(
+ ArgumentMatchers.eq(DEFAULT_PACKAGE_UID),
+ ArgumentMatchers.eq(0.0f));
+ }
+
private static void deleteFolder(File folder) {
File[] files = folder.listFiles();
if (files != null) {