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

Commit f4d3f123 authored by Andy Yu's avatar Andy Yu
Browse files

Add debug system property to guard Game Default Frame Rate

This patch adds a debug system property to disable Game Default
Frame Rate in run time.

Without setting UI implementation, toggleGameDefaultFrameRate() will
not be called to enable/disable Game Default Frame Rate. Here we guard
getGameDefaultFrameRate() to determine the frame rate value and further
diable this feature.

Bug: 286084594
Test: atest GameManagerServiceTests
Change-Id: I7744d8ac581ba1e1dc874143cad4d29ff97b35ec
parent cc01e6f2
Loading
Loading
Loading
Loading
+12 −16
Original line number Diff line number Diff line
@@ -142,8 +142,8 @@ public final class GameManagerService extends IGameManagerService.Stub {
    static final int WRITE_GAME_MODE_INTERVENTION_LIST_FILE = 6;
    static final int WRITE_DELAY_MILLIS = 10 * 1000;  // 10 seconds
    static final int LOADING_BOOST_MAX_DURATION = 5 * 1000;  // 5 seconds
    static final String PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED =
            "persist.graphics.game_default_frame_rate.enabled";
    static final String PROPERTY_DEBUG_GFX_GAME_DEFAULT_FRAME_RATE_DISABLED =
            "debug.graphics.game_default_frame_rate.disabled";
    static final String PROPERTY_RO_SURFACEFLINGER_GAME_DEFAULT_FRAME_RATE =
            "ro.surface_flinger.game_default_frame_rate_override";

@@ -2211,17 +2211,10 @@ public final class GameManagerService extends IGameManagerService.Stub {
        nativeSetGameDefaultFrameRateOverride(uid, frameRate);
    }

    private float getGameDefaultFrameRate() {
        final boolean isGameDefaultFrameRateEnabled;
    private float getGameDefaultFrameRate(boolean isEnabled) {
        float gameDefaultFrameRate = 0.0f;
        synchronized (mLock) {
            isGameDefaultFrameRateEnabled =
                    mSysProps.getBoolean(
                            PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED, true);
        }
        if (gameDefaultFrameRate()) {
            gameDefaultFrameRate = isGameDefaultFrameRateEnabled
                    ? mGameDefaultFrameRateValue : 0.0f;
            gameDefaultFrameRate = isEnabled ? mGameDefaultFrameRateValue : 0.0f;
        }
        return gameDefaultFrameRate;
    }
@@ -2237,24 +2230,23 @@ public final class GameManagerService extends IGameManagerService.Stub {
    }

    private void toggleGameDefaultFrameRateUnchecked(boolean isEnabled) {
        // Update system properties.
        // Here we only need to immediately update games that are in the foreground.
        // We will update game default frame rate when a game comes into foreground in
        // MyUidObserver.
        synchronized (mLock) {
            if (isEnabled) {
                mSysProps.set(
                        PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED, "true");
                        PROPERTY_DEBUG_GFX_GAME_DEFAULT_FRAME_RATE_DISABLED, "false");
            } else {
                mSysProps.set(
                        PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED, "false");
                        PROPERTY_DEBUG_GFX_GAME_DEFAULT_FRAME_RATE_DISABLED, "true");
            }
        }

        // Update all foreground games' frame rate.
        synchronized (mUidObserverLock) {
            for (int uid : mForegroundGameUids) {
                setGameDefaultFrameRateOverride(uid, getGameDefaultFrameRate());
                setGameDefaultFrameRateOverride(uid, getGameDefaultFrameRate(isEnabled));
            }
        }
    }
@@ -2296,7 +2288,11 @@ public final class GameManagerService extends IGameManagerService.Stub {
                    Slog.v(TAG, "Game power mode ON (process state was changed to foreground)");
                    mPowerManagerInternal.setPowerMode(Mode.GAME, true);
                }
                setGameDefaultFrameRateOverride(uid, getGameDefaultFrameRate());
                final boolean isGameDefaultFrameRateDisabled =
                        mSysProps.getBoolean(
                                PROPERTY_DEBUG_GFX_GAME_DEFAULT_FRAME_RATE_DISABLED, false);
                setGameDefaultFrameRateOverride(uid,
                        getGameDefaultFrameRate(!isGameDefaultFrameRateDisabled));
                mForegroundGameUids.add(uid);
            }
        }
+7 −32
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSess
import static com.android.server.app.GameManagerService.CANCEL_GAME_LOADING_MODE;
import static com.android.server.app.GameManagerService.Injector;
import static com.android.server.app.GameManagerService.LOADING_BOOST_MAX_DURATION;
import static com.android.server.app.GameManagerService.PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED;
import static com.android.server.app.GameManagerService.PROPERTY_DEBUG_GFX_GAME_DEFAULT_FRAME_RATE_DISABLED;
import static com.android.server.app.GameManagerService.PROPERTY_RO_SURFACEFLINGER_GAME_DEFAULT_FRAME_RATE;
import static com.android.server.app.GameManagerService.SET_GAME_STATE;
import static com.android.server.app.GameManagerService.WRITE_DELAY_MILLIS;
@@ -2427,8 +2427,8 @@ public class GameManagerServiceTests {
                ArgumentMatchers.eq(PROPERTY_RO_SURFACEFLINGER_GAME_DEFAULT_FRAME_RATE),
                anyInt())).thenReturn(60);
        when(mSysPropsMock.getBoolean(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                ArgumentMatchers.eq(true))).thenReturn(true);
                ArgumentMatchers.eq(PROPERTY_DEBUG_GFX_GAME_DEFAULT_FRAME_RATE_DISABLED),
                ArgumentMatchers.eq(false))).thenReturn(false);
        gameManagerService.onBootCompleted();

        // Set up a game in the foreground.
@@ -2441,11 +2441,7 @@ public class GameManagerServiceTests {
        gameManagerService.toggleGameDefaultFrameRate(true);

        // Verify that:
        // 1) The system property is set correctly
        // 2) setDefaultFrameRateOverride is called with correct arguments
        Mockito.verify(mSysPropsMock).set(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                ArgumentMatchers.eq("true"));
        // setDefaultFrameRateOverride is called with correct arguments
        Mockito.verify(gameManagerService, times(1))
                .setGameDefaultFrameRateOverride(ArgumentMatchers.eq(DEFAULT_PACKAGE_UID),
                                                 ArgumentMatchers.eq(60.0f));
@@ -2461,17 +2457,10 @@ public class GameManagerServiceTests {
                somePackageId, ActivityManager.PROCESS_STATE_TOP, 0, 0);

        // Toggle game default frame rate off.
        when(mSysPropsMock.getBoolean(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                ArgumentMatchers.eq(true))).thenReturn(false);
        gameManagerService.toggleGameDefaultFrameRate(false);

        // Verify that:
        // 1) The system property is set correctly
        // 2) setDefaultFrameRateOverride is called with correct arguments
        Mockito.verify(mSysPropsMock).set(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                ArgumentMatchers.eq("false"));
        // setDefaultFrameRateOverride is called with correct arguments
        Mockito.verify(gameManagerService).setGameDefaultFrameRateOverride(
                ArgumentMatchers.eq(DEFAULT_PACKAGE_UID), ArgumentMatchers.eq(0.0f));
        Mockito.verify(gameManagerService).setGameDefaultFrameRateOverride(
@@ -2504,18 +2493,11 @@ public class GameManagerServiceTests {
        when(mSysPropsMock.getInt(
                ArgumentMatchers.eq(PROPERTY_RO_SURFACEFLINGER_GAME_DEFAULT_FRAME_RATE),
                anyInt())).thenReturn(60);
        when(mSysPropsMock.getBoolean(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                ArgumentMatchers.eq(true))).thenReturn(true);

        gameManagerService.toggleGameDefaultFrameRate(true);

        // Verify that:
        // 1) System property is never set
        // 2) setGameDefaultFrameRateOverride() should never be called if the flag is disabled.
        Mockito.verify(mSysPropsMock, never()).set(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                anyString());
        // setGameDefaultFrameRateOverride() should never be called if the flag is disabled.
        Mockito.verify(gameManagerService, never())
                .setGameDefaultFrameRateOverride(anyInt(), anyFloat());

@@ -2529,17 +2511,10 @@ public class GameManagerServiceTests {
                somePackageId, ActivityManager.PROCESS_STATE_TOP, 0, 0);
        gameManagerService.mUidObserver.onUidStateChanged(
                somePackageId, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0, 0);
        when(mSysPropsMock.getBoolean(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                ArgumentMatchers.eq(true))).thenReturn(false);

        gameManagerService.toggleGameDefaultFrameRate(false);
        // Verify that:
        // 1) System property is never set
        // 2) setGameDefaultFrameRateOverride() should never be called if the flag is disabled.
        Mockito.verify(mSysPropsMock, never()).set(
                ArgumentMatchers.eq(PROPERTY_PERSISTENT_GFX_GAME_DEFAULT_FRAME_RATE_ENABLED),
                anyString());
        // setGameDefaultFrameRateOverride() should never be called if the flag is disabled.
        Mockito.verify(gameManagerService, never())
                .setGameDefaultFrameRateOverride(anyInt(), anyFloat());
    }