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

Commit 439c2830 authored by Xiang Wang's avatar Xiang Wang
Browse files

Add timeout to loading boost on game state change

Bug: b/253455150
Test: atest GameManagerServiceTests
Change-Id: I5557bc3c7e9df34a5f4c759bf4a456410915ac9f
parent 1691b994
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -338,7 +338,18 @@ public final class GameManagerService extends IGameManagerService.Stub {
                                    + " and userId " + userId);
                            break;
                        }
                        if (mHandler.hasMessages(CANCEL_GAME_LOADING_MODE)) {
                            mHandler.removeMessages(CANCEL_GAME_LOADING_MODE);
                        }
                        mPowerManagerInternal.setPowerMode(Mode.GAME_LOADING, isLoading);
                        if (isLoading) {
                            int loadingBoostDuration = getLoadingBoostDuration(packageName, userId);
                            loadingBoostDuration = loadingBoostDuration > 0 ? loadingBoostDuration
                                    : LOADING_BOOST_MAX_DURATION;
                            mHandler.sendMessageDelayed(
                                    mHandler.obtainMessage(CANCEL_GAME_LOADING_MODE),
                                    loadingBoostDuration);
                        }
                    }
                    break;
                }
+55 −11
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.app;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.server.app.GameManagerService.CANCEL_GAME_LOADING_MODE;
import static com.android.server.app.GameManagerService.WRITE_SETTINGS;

import static org.junit.Assert.assertArrayEquals;
@@ -1454,35 +1455,78 @@ public class GameManagerServiceTests {
        verify(mMockPowerManager, never()).setPowerMode(anyInt(), anyBoolean());
    }

    private void setGameState(boolean isLoading) {
    @Test
    public void testSetGameStateLoading_withNoDeviceConfig() {
        mockDeviceConfigNone();
        mockModifyGameModeGranted();
        GameManagerService gameManagerService =
                new GameManagerService(mMockContext, mTestLooper.getLooper());
        startUser(gameManagerService, USER_ID_1);
        GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1);
        gameManagerService.setGameMode(
                mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
        int testMode = GameState.MODE_NONE;
        assertEquals(gameManagerService.getGameMode(mPackageName, USER_ID_1),
                GameManager.GAME_MODE_PERFORMANCE);
        int testMode = GameState.MODE_GAMEPLAY_INTERRUPTIBLE;
        int testLabel = 99;
        int testQuality = 123;
        GameState gameState = new GameState(isLoading, testMode, testLabel, testQuality);
        assertEquals(isLoading, gameState.isLoading());
        GameState gameState = new GameState(true, testMode, testLabel, testQuality);
        assertEquals(testMode, gameState.getMode());
        assertEquals(testLabel, gameState.getLabel());
        assertEquals(testQuality, gameState.getQuality());
        gameManagerService.setGameState(mPackageName, gameState, USER_ID_1);
        mTestLooper.dispatchAll();
        verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, isLoading);
        verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, true);
        reset(mMockPowerManager);
        assertTrue(
                gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE));
        verify(mMockPowerManager, never()).setPowerMode(Mode.GAME_LOADING, false);
        mTestLooper.moveTimeForward(GameManagerService.LOADING_BOOST_MAX_DURATION);
        mTestLooper.dispatchAll();
        verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false);
    }

    @Test
    public void testSetGameStateLoading() {
        setGameState(true);
    public void testSetGameStateLoading_withDeviceConfig() {
        String configString = "mode=2,loadingBoost=2000";
        when(DeviceConfig.getProperty(anyString(), anyString()))
                .thenReturn(configString);
        mockModifyGameModeGranted();
        GameManagerService gameManagerService = createServiceAndStartUser(USER_ID_1);
        gameManagerService.setGameMode(
                mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
        GameState gameState = new GameState(true, GameState.MODE_GAMEPLAY_INTERRUPTIBLE, 99, 123);
        gameManagerService.setGameState(mPackageName, gameState, USER_ID_1);
        mTestLooper.dispatchAll();
        verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, true);
        verify(mMockPowerManager, never()).setPowerMode(Mode.GAME_LOADING, false);
        reset(mMockPowerManager);
        assertTrue(
                gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE));
        mTestLooper.moveTimeForward(2000);
        mTestLooper.dispatchAll();
        verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false);
    }

    @Test
    public void testSetGameStateNotLoading() {
        setGameState(false);
        mockDeviceConfigNone();
        mockModifyGameModeGranted();
        GameManagerService gameManagerService =
                new GameManagerService(mMockContext, mTestLooper.getLooper());
        startUser(gameManagerService, USER_ID_1);
        gameManagerService.setGameMode(
                mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
        int testMode = GameState.MODE_GAMEPLAY_UNINTERRUPTIBLE;
        int testLabel = 99;
        int testQuality = 123;
        GameState gameState = new GameState(false, testMode, testLabel, testQuality);
        assertFalse(gameState.isLoading());
        assertEquals(testMode, gameState.getMode());
        assertEquals(testLabel, gameState.getLabel());
        assertEquals(testQuality, gameState.getQuality());
        gameManagerService.setGameState(mPackageName, gameState, USER_ID_1);
        mTestLooper.dispatchAll();
        verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, false);
        assertFalse(
                gameManagerService.mHandler.hasMessages(CANCEL_GAME_LOADING_MODE));
    }

    private List<String> readGameModeInterventionList() throws Exception {