Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17803c42 authored by Saeid Farivar Asanjan's avatar Saeid Farivar Asanjan
Browse files

Move the scaling logic for gamemode

Bug: 295207384
Test: atest WmTests
Change-Id: Ibe6a0b4b4652bb2298313e156e2d7ca0fd5887c6
parent 9eabd67a
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -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() {
+13 −0
Original line number Diff line number Diff line
@@ -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);
}
+12 −0
Original line number Diff line number Diff line
@@ -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() {
+0 −14
Original line number Diff line number Diff line
@@ -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);
+15 −1
Original line number Diff line number Diff line
@@ -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);
    }