diff options
| author | 2024-01-11 17:58:29 +0000 | |
|---|---|---|
| committer | 2024-01-19 17:28:45 +0000 | |
| commit | 17803c42e197e30c44ae28125c83c386475f9549 (patch) | |
| tree | 48b6f94a9bb0942857cbcc2c77a6aceb28ff8a67 | |
| parent | 9eabd67a5c84bb823bbdad23f9ba9b6b04912006 (diff) | |
Move the scaling logic for gamemode
Bug: 295207384
Test: atest WmTests
Change-Id: Ibe6a0b4b4652bb2298313e156e2d7ca0fd5887c6
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); } |