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

Commit 5fc7cd8f authored by Fiona Campbell's avatar Fiona Campbell
Browse files

Clamp brightness before setting it

- Screen brightness requests of "0" (int) = OFF, this is clamped to
  PowerManager.BRIGHTNESS_MIN and PowerManager.BRIGHTNESS_MAX

Test: manual, atest DisplayServiceTests
Flag: EXEMPT trivial bug fix
Bug: 364835795

Change-Id: Ic21ea10108122925a85adf7cac1afc85c68334e0
parent 61dfb4a0
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -134,6 +134,7 @@ import android.util.ArraySet;
import android.util.EventLog;
import android.util.IndentingPrintWriter;
import android.util.IntArray;
import android.util.MathUtils;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
@@ -3090,6 +3091,7 @@ public final class DisplayManagerService extends SystemService {

    /**
     * Get internal or external viewport. Create it if does not currently exist.
     *
     * @param viewportType - either INTERNAL or EXTERNAL
     * @return the viewport with the requested type
     */
@@ -4379,7 +4381,6 @@ public final class DisplayManagerService extends SystemService {
        }



        @Override // Binder call
        public BrightnessConfiguration getBrightnessConfigurationForUser(int userId) {
            final String uniqueId;
@@ -4458,10 +4459,12 @@ public final class DisplayManagerService extends SystemService {
        @Override // Binder call
        public void setBrightness(int displayId, float brightness) {
            setBrightness_enforcePermission();
            if (!isValidBrightness(brightness)) {
                Slog.w(TAG, "Attempted to set invalid brightness" + brightness);
            if (Float.isNaN(brightness)) {
                Slog.w(TAG, "Attempted to set invalid brightness: " + brightness);
                return;
            }
            MathUtils.constrain(brightness, PowerManager.BRIGHTNESS_MIN,
                    PowerManager.BRIGHTNESS_MAX);
            final long token = Binder.clearCallingIdentity();
            try {
                synchronized (mSyncRoot) {
@@ -4757,12 +4760,6 @@ public final class DisplayManagerService extends SystemService {
        }
    }

    private static boolean isValidBrightness(float brightness) {
        return !Float.isNaN(brightness)
                && (brightness >= PowerManager.BRIGHTNESS_MIN)
                && (brightness <= PowerManager.BRIGHTNESS_MAX);
    }

    @VisibleForTesting
    void overrideSensorManager(SensorManager sensorManager) {
        synchronized (mSyncRoot) {
+69 −0
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemProperties;
@@ -3048,6 +3049,74 @@ public class DisplayManagerServiceTest {
        }
    }

    @Test
    public void testBrightnessUpdates() {
        DisplayManagerService displayManager =
                new DisplayManagerService(mContext, mShortMockedInjector);
        DisplayManagerInternal localService = displayManager.new LocalService();
        DisplayManagerService.BinderService displayManagerBinderService =
                displayManager.new BinderService();
        registerDefaultDisplays(displayManager);
        initDisplayPowerController(localService);

        final float invalidBrightness = -0.3f;
        final float brightnessOff = -1.0f;
        final float minimumBrightness = 0.0f;
        final float validBrightness = 0.5f;

        Settings.System.putInt(mContext.getContentResolver(),
                Settings.System.SCREEN_BRIGHTNESS_MODE,
                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);

        // set and check valid brightness
        waitForIdleHandler(mPowerHandler);
        displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, validBrightness);
        waitForIdleHandler(mPowerHandler);
        assertEquals(validBrightness,
                displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
                FLOAT_TOLERANCE);

        // set and check invalid brightness
        waitForIdleHandler(mPowerHandler);
        displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, invalidBrightness);
        waitForIdleHandler(mPowerHandler);
        assertEquals(PowerManager.BRIGHTNESS_MIN,
                displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
                FLOAT_TOLERANCE);

        // reset and check valid brightness
        waitForIdleHandler(mPowerHandler);
        displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, validBrightness);
        waitForIdleHandler(mPowerHandler);
        assertEquals(validBrightness,
                displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
                FLOAT_TOLERANCE);

        // set and check brightness off
        waitForIdleHandler(mPowerHandler);
        displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, brightnessOff);
        waitForIdleHandler(mPowerHandler);
        assertEquals(PowerManager.BRIGHTNESS_MIN,
                displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
                FLOAT_TOLERANCE);

        // reset and check valid brightness
        waitForIdleHandler(mPowerHandler);
        displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, validBrightness);
        waitForIdleHandler(mPowerHandler);
        assertEquals(validBrightness,
                displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
                FLOAT_TOLERANCE);

        // set and check minimum brightness
        waitForIdleHandler(mPowerHandler);
        displayManagerBinderService.setBrightness(Display.DEFAULT_DISPLAY, minimumBrightness);
        waitForIdleHandler(mPowerHandler);
        assertEquals(PowerManager.BRIGHTNESS_MIN,
                displayManagerBinderService.getBrightness(Display.DEFAULT_DISPLAY),
                FLOAT_TOLERANCE);
    }

    @Test
    public void testResolutionChangeGetsBackedUp() throws Exception {
        when(mMockFlags.isResolutionBackupRestoreEnabled()).thenReturn(true);