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

Commit 78bc4f4e authored by Piotr Wilczyński's avatar Piotr Wilczyński
Browse files

Make the brightness int scale match the slider

The brightness scale 0-255 will now match the slider, i.e. setting brighthess to 0.23 * 255 will set it to 23% on the slider.

This will work regardless of the brightness limits (e.g. HBM) - if HBM is on, 255 will still be the max value on the slider, so the max value allowed in HBM mode.

This only affects the int scale of the brightness setting. The brightness int values in config files will remain unchanged.

Bug: 183655602
Test: atest com.android.server.display
Test: atest android.display.cts
Change-Id: I8e8ede6fa4ee945899e33a2ba45a290bf704d166
parent f8e61cf3
Loading
Loading
Loading
Loading
+73 −4
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@

package com.android.internal.display;

import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.net.Uri;
@@ -54,8 +56,7 @@ public class BrightnessSynchronizer {
    private static final int MSG_RUN_UPDATE = 1;

    // The tolerance within which we consider brightness values approximately equal to eachother.
    // This value is approximately 1/3 of the smallest possible brightness value.
    public static final float EPSILON = 0.001f;
    public static final float EPSILON = 0.0001f;

    private static int sBrightnessUpdateCount = 1;

@@ -283,6 +284,74 @@ public class BrightnessSynchronizer {
        }
    }

    /**
     * Converts between the int brightness setting and the float brightness system. The int
     * brightness setting is between 0-255 and matches the brightness slider - e.g. 128 is 50% on
     * the slider. Accounts for special values such as OFF and invalid values. Accounts for
     * brightness limits; the maximum value here represents the max value allowed on the slider.
     */
    @VisibleForTesting
    @SuppressLint("AndroidFrameworkRequiresPermission")
    public float brightnessIntSettingToFloat(int brightnessInt) {
        if (brightnessInt == PowerManager.BRIGHTNESS_OFF) {
            return PowerManager.BRIGHTNESS_OFF_FLOAT;
        } else if (brightnessInt == PowerManager.BRIGHTNESS_INVALID) {
            return PowerManager.BRIGHTNESS_INVALID_FLOAT;
        } else {
            final float minInt = PowerManager.BRIGHTNESS_OFF + 1;
            final float maxInt = PowerManager.BRIGHTNESS_ON;

            // Normalize to the range [0, 1]
            float userPerceptionBrightness = MathUtils.norm(minInt, maxInt, brightnessInt);

            // Convert from user-perception to linear scale
            float linearBrightness = BrightnessUtils.convertGammaToLinear(userPerceptionBrightness);

            // Interpolate to the range [0, currentlyAllowedMax]
            final Display display = mContext.getDisplay();
            if (display == null) {
                return PowerManager.BRIGHTNESS_INVALID_FLOAT;
            }
            final BrightnessInfo info = display.getBrightnessInfo();
            return MathUtils.lerp(info.brightnessMinimum, info.brightnessMaximum, linearBrightness);
        }
    }

    /**
     * Translates specified value from the float brightness system to the setting int brightness
     * system. The value returned is between 0-255 and matches the brightness slider - e.g. 128 is
     * 50% on the slider. Accounts for special values such as OFF and invalid values. Accounts for
     * brightness limits; the maximum value here represents the max value currently allowed on
     * the slider.
     */
    @VisibleForTesting
    @SuppressLint("AndroidFrameworkRequiresPermission")
    public int brightnessFloatToIntSetting(float brightnessFloat) {
        if (floatEquals(brightnessFloat, PowerManager.BRIGHTNESS_OFF_FLOAT)) {
            return PowerManager.BRIGHTNESS_OFF;
        } else if (Float.isNaN(brightnessFloat)) {
            return PowerManager.BRIGHTNESS_INVALID;
        } else {
            // Normalize to the range [0, 1]
            final Display display = mContext.getDisplay();
            if (display == null) {
                return PowerManager.BRIGHTNESS_INVALID;
            }
            final BrightnessInfo info = display.getBrightnessInfo();
            float linearBrightness =
                    MathUtils.norm(info.brightnessMinimum, info.brightnessMaximum, brightnessFloat);

            // Convert from linear to user-perception scale
            float userPerceptionBrightness = BrightnessUtils.convertLinearToGamma(linearBrightness);

            // Interpolate to the range [0, 255]
            final float minInt = PowerManager.BRIGHTNESS_OFF + 1;
            final float maxInt = PowerManager.BRIGHTNESS_ON;
            float intBrightness = MathUtils.lerp(minInt, maxInt, userPerceptionBrightness);
            return Math.round(intBrightness);
        }
    }

    /**
     * Encapsulates a brightness change event and contains logic for synchronizing the appropriate
     * settings for the specified brightness change.
@@ -421,14 +490,14 @@ public class BrightnessSynchronizer {
            if (mSourceType == TYPE_INT) {
                return (int) mBrightness;
            }
            return brightnessFloatToInt(mBrightness);
            return brightnessFloatToIntSetting(mBrightness);
        }

        private float getBrightnessAsFloat() {
            if (mSourceType == TYPE_FLOAT) {
                return mBrightness;
            }
            return brightnessIntToFloat((int) mBrightness);
            return brightnessIntSettingToFloat((int) mBrightness);
        }

        private String toStringLabel(int type, float brightness) {
+2 −2
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

package com.android.server.display;
package com.android.internal.display;

import android.util.MathUtils;

+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.util.Spline;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.display.BrightnessSynchronizer;
import com.android.internal.display.BrightnessUtils;
import com.android.internal.util.Preconditions;
import com.android.server.display.utils.Plog;
import com.android.server.display.whitebalance.DisplayWhiteBalanceController;
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import android.animation.ValueAnimator;
import android.util.FloatProperty;
import android.view.Choreographer;

import com.android.internal.display.BrightnessUtils;

/**
 * A custom animator that progressively updates a property value at
 * a given variable rate until it reaches a particular target value.
+1 −1
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ import com.android.internal.accessibility.util.AccessibilityStatsLogUtils;
import com.android.internal.accessibility.util.AccessibilityUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AssistUtils;
import com.android.internal.display.BrightnessUtils;
import com.android.internal.inputmethod.SoftInputShowHideReason;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
@@ -217,7 +218,6 @@ import com.android.server.GestureLauncherService;
import com.android.server.LocalServices;
import com.android.server.SystemServiceManager;
import com.android.server.UiThread;
import com.android.server.display.BrightnessUtils;
import com.android.server.input.InputManagerInternal;
import com.android.server.input.KeyboardMetricsCollector;
import com.android.server.input.KeyboardMetricsCollector.KeyboardLogEvent;
Loading