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

Commit 4b4c826a authored by Saeid Farivar Asanjan's avatar Saeid Farivar Asanjan Committed by Android (Google) Code Review
Browse files

Merge "Move the scaling logic for gamemode" into main

parents 3b694623 17803c42
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);
    }