summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Saeid Farivar Asanjan <farivar@google.com> 2024-01-11 17:58:29 +0000
committer Saeid Farivar Asanjan <farivar@google.com> 2024-01-19 17:28:45 +0000
commit17803c42e197e30c44ae28125c83c386475f9549 (patch)
tree48b6f94a9bb0942857cbcc2c77a6aceb28ff8a67
parent9eabd67a5c84bb823bbdad23f9ba9b6b04912006 (diff)
Move the scaling logic for gamemode
Bug: 295207384 Test: atest WmTests Change-Id: Ibe6a0b4b4652bb2298313e156e2d7ca0fd5887c6
-rw-r--r--services/core/java/com/android/server/app/GameManagerService.java27
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java13
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java12
-rw-r--r--services/core/java/com/android/server/wm/CompatModePackages.java14
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/CompatModePackagesTests.java16
5 files changed, 65 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index 8b7e56ec410d..f6df60f736e8 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -28,6 +28,7 @@ import static com.android.internal.R.styleable.GameModeConfig_allowGameFpsOverri
import static com.android.internal.R.styleable.GameModeConfig_supportsBatteryGameMode;
import static com.android.internal.R.styleable.GameModeConfig_supportsPerformanceGameMode;
import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
+import static com.android.server.wm.CompatScaleProvider.COMPAT_SCALE_MODE_GAME;
import android.Manifest;
import android.annotation.EnforcePermission;
@@ -56,6 +57,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
+import android.content.res.CompatibilityInfo.CompatScale;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
@@ -76,6 +78,7 @@ import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.SystemProperties;
+import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties;
@@ -97,6 +100,8 @@ import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
import com.android.server.SystemService.TargetUser;
+import com.android.server.wm.ActivityTaskManagerInternal;
+import com.android.server.wm.CompatScaleProvider;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -927,12 +932,24 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
}
- private final class LocalService extends GameManagerInternal {
+ private final class LocalService extends GameManagerInternal implements CompatScaleProvider {
@Override
public float getResolutionScalingFactor(String packageName, int userId) {
final int gameMode = getGameModeFromSettingsUnchecked(packageName, userId);
return getResolutionScalingFactorInternal(packageName, gameMode, userId);
}
+
+ @Nullable
+ @Override
+ public CompatScale getCompatScale(@NonNull String packageName, int uid) {
+ UserHandle userHandle = UserHandle.getUserHandleForUid(uid);
+ int userId = userHandle.getIdentifier();
+ float scalingFactor = getResolutionScalingFactor(packageName, userId);
+ if (scalingFactor > 0) {
+ return new CompatScale(1f / scalingFactor);
+ }
+ return null;
+ }
}
/**
@@ -2080,7 +2097,13 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
private void publishLocalService() {
- LocalServices.addService(GameManagerInternal.class, new LocalService());
+ LocalService localService = new LocalService();
+
+ ActivityTaskManagerInternal atmi =
+ LocalServices.getService(ActivityTaskManagerInternal.class);
+ atmi.registerCompatScaleProvider(COMPAT_SCALE_MODE_GAME, localService);
+
+ LocalServices.addService(GameManagerInternal.class, localService);
}
private void registerStatsCallbacks() {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index 5604b1a6aa39..ed556a55010e 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -796,4 +796,17 @@ public abstract class ActivityTaskManagerInternal {
* @param token The activity token.
*/
public abstract int getDisplayId(IBinder token);
+
+ /**
+ * Register a {@link CompatScaleProvider}.
+ */
+ public abstract void registerCompatScaleProvider(
+ @CompatScaleProvider.CompatScaleModeOrderId int id,
+ @NonNull CompatScaleProvider provider);
+
+ /**
+ * Unregister a {@link CompatScaleProvider}.
+ */
+ public abstract void unregisterCompatScaleProvider(
+ @CompatScaleProvider.CompatScaleModeOrderId int id);
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 3959a5e54cbf..3397a3dd2290 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -7277,6 +7277,18 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
public void unregisterTaskStackListener(ITaskStackListener listener) {
ActivityTaskManagerService.this.unregisterTaskStackListener(listener);
}
+
+ @Override
+ public void registerCompatScaleProvider(@CompatScaleProvider.CompatScaleModeOrderId int id,
+ @NonNull CompatScaleProvider provider) {
+ ActivityTaskManagerService.this.registerCompatScaleProvider(id, provider);
+ }
+
+ @Override
+ public void unregisterCompatScaleProvider(
+ @CompatScaleProvider.CompatScaleModeOrderId int id) {
+ ActivityTaskManagerService.this.unregisterCompatScaleProvider(id);
+ }
}
static boolean isPip2ExperimentEnabled() {
diff --git a/services/core/java/com/android/server/wm/CompatModePackages.java b/services/core/java/com/android/server/wm/CompatModePackages.java
index 1a8927ecf564..b795987f1d11 100644
--- a/services/core/java/com/android/server/wm/CompatModePackages.java
+++ b/services/core/java/com/android/server/wm/CompatModePackages.java
@@ -25,7 +25,6 @@ import static com.android.server.wm.CompatScaleProvider.COMPAT_SCALE_MODE_SYSTEM
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.AppGlobals;
-import android.app.GameManagerInternal;
import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
import android.compat.annotation.Disabled;
@@ -52,7 +51,6 @@ import android.util.Xml;
import com.android.internal.protolog.common.ProtoLog;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
-import com.android.server.LocalServices;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -345,7 +343,6 @@ public final class CompatModePackages {
}
private final ActivityTaskManagerService mService;
- private GameManagerInternal mGameManager;
private final AtomicFile mFile;
private final HashMap<String, Integer> mPackages = new HashMap<>();
private final SparseBooleanArray mLegacyScreenCompatPackages = new SparseBooleanArray();
@@ -517,17 +514,6 @@ public final class CompatModePackages {
}
}
final UserHandle userHandle = UserHandle.getUserHandleForUid(uid);
- if (mGameManager == null) {
- mGameManager = LocalServices.getService(GameManagerInternal.class);
- }
- if (mGameManager != null) {
- final int userId = userHandle.getIdentifier();
- final float scalingFactor = mGameManager.getResolutionScalingFactor(packageName,
- userId);
- if (scalingFactor > 0) {
- return 1f / scalingFactor;
- }
- }
final boolean isDownscaledEnabled = CompatChanges.isChangeEnabled(
DOWNSCALED, packageName, userHandle);
diff --git a/services/tests/wmtests/src/com/android/server/wm/CompatModePackagesTests.java b/services/tests/wmtests/src/com/android/server/wm/CompatModePackagesTests.java
index c18726350d81..91375940226a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/CompatModePackagesTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/CompatModePackagesTests.java
@@ -18,6 +18,7 @@ package com.android.server.wm;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
+import static com.android.server.wm.CompatScaleProvider.COMPAT_SCALE_MODE_GAME;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -27,6 +28,8 @@ import static org.mockito.ArgumentMatchers.anyString;
import android.app.GameManagerInternal;
import android.content.pm.ApplicationInfo;
+import android.content.res.CompatibilityInfo.CompatScale;
+import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -55,6 +58,17 @@ public class CompatModePackagesTests extends SystemServiceTestsBase {
public void setUp() {
mAtm = mSystemServicesTestRule.getActivityTaskManagerService();
mGm = mock(GameManagerInternal.class);
+ mAtm.registerCompatScaleProvider(COMPAT_SCALE_MODE_GAME, new CompatScaleProvider() {
+ @Override
+ public CompatScale getCompatScale(String packageName, int uid) {
+ int userId = UserHandle.getUserHandleForUid(uid).getIdentifier();
+ float scalingFactor = mGm.getResolutionScalingFactor(packageName, userId);
+ if (scalingFactor > 0) {
+ return new CompatScale(1f / scalingFactor);
+ }
+ return null;
+ }
+ });
}
@After
@@ -67,7 +81,7 @@ public class CompatModePackagesTests extends SystemServiceTestsBase {
LocalServices.addService(GameManagerInternal.class, mGm);
float scale = 0.25f;
doReturn(scale).when(mGm).getResolutionScalingFactor(anyString(), anyInt());
- assertEquals(mAtm.mCompatModePackages.getCompatScale(TEST_PACKAGE, TEST_USER_ID), 1 / scale,
+ assertEquals(1 / scale, mAtm.mCompatModePackages.getCompatScale(TEST_PACKAGE, TEST_USER_ID),
0.01f);
}