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

Commit 67927b8a authored by Fiona Campbell's avatar Fiona Campbell
Browse files

Stop RBC affecting brightness so drastically

This change resets the brightness short term model when RBC is turned
off or the strength is changed. We add a singular interaction when RBC is turned on, and add
interactions in RBC as normal.

Since users turning RBC in a bright environment could want any
brightness between the given one and MAX, but turning RBC off will often result in
a MAX interaction being logged, if the slider is already at MAX (given
RBC) which is not necessarily what we want.

In order to prevent unwanted changes to the brightness curve, we ignore
interactions that turn RBC off. Turning RBC on seems like a valid
indicator that the user wants the brightness darker, and at a specific
brightness, however turning RBC off is less of an indicator. Changing
the strength of RBC is also a good time to reset the short term model,
however after resetting, we still add an interaction after this.

Bug: 199187829
Test: manual
Change-Id: I6512d9642f2da634aa60af6b5573c792c0a116d5
parent 8e2e404d
Loading
Loading
Loading
Loading
+46 −18
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
    private static final int MSG_IGNORE_PROXIMITY = 8;
    private static final int MSG_STOP = 9;
    private static final int MSG_UPDATE_BRIGHTNESS = 10;
    private static final int MSG_UPDATE_RBC = 11;

    private static final int PROXIMITY_UNKNOWN = -1;
    private static final int PROXIMITY_NEGATIVE = 0;
@@ -422,13 +423,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
    // PowerManager.BRIGHTNESS_INVALID_FLOAT when there's no temporary adjustment set.
    private float mTemporaryAutoBrightnessAdjustment;

    // Whether a reduce bright colors (rbc) change has been initiated by the user. We want to
    // retain the current backlight level when rbc is toggled, since rbc additionally makes the
    // screen appear dimmer using screen colors rather than backlight levels, and therefore we
    // don't actually want to compensate for this by then in/decreasing the backlight when
    // toggling this feature.
    // Whether reduce bright colors (rbc) has been turned on, or a change in strength has been
    // requested. We want to retain the current backlight level when rbc is toggled, since rbc
    // additionally makes the screen appear dimmer using screen colors rather than backlight levels,
    // and therefore we don't actually want to compensate for this by then in/decreasing the
    // backlight when toggling this feature.
    // This should be false during system start up.
    private boolean mPendingUserRbcChange;
    private boolean mPendingRbcOnOrChanged = false;

    // Animators.
    private ObjectAnimator mColorFadeOnAnimator;
@@ -564,23 +565,35 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                @Override
                public void onReduceBrightColorsActivationChanged(boolean activated,
                        boolean userInitiated) {
                    applyReduceBrightColorsSplineAdjustment(userInitiated);
                    applyReduceBrightColorsSplineAdjustment(
                            /* rbcStrengthChanged= */ false, activated);

                }

                @Override
                public void onReduceBrightColorsStrengthChanged(int strength) {
                    applyReduceBrightColorsSplineAdjustment(/*userInitiated*/ false);
                    applyReduceBrightColorsSplineAdjustment(
                            /* rbcStrengthChanged= */ true, /* justActivated= */ false);
                }
            });
            if (active) {
                applyReduceBrightColorsSplineAdjustment(/*userInitiated*/ false);
                applyReduceBrightColorsSplineAdjustment(
                        /* rbcStrengthChanged= */ false,  /* justActivated= */ false);
            }
        } else {
            mCdsi = null;
        }
    }

    private void applyReduceBrightColorsSplineAdjustment(boolean userInitiated) {
    private void applyReduceBrightColorsSplineAdjustment(
            boolean rbcStrengthChanged, boolean justActivated) {
        final int strengthChanged = rbcStrengthChanged ? 1 : 0;
        final int activated = justActivated ? 1 : 0;
        mHandler.obtainMessage(MSG_UPDATE_RBC, strengthChanged, activated).sendToTarget();
        sendUpdatePowerState();
    }

    private void handleRbcChanged(boolean strengthChanged, boolean justActivated) {
        if (mBrightnessMapper == null) {
            Log.w(TAG, "No brightness mapping available to recalculate splines");
            return;
@@ -591,8 +604,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            adjustedNits[i] = mCdsi.getReduceBrightColorsAdjustedBrightnessNits(mNitsRange[i]);
        }
        mBrightnessMapper.recalculateSplines(mCdsi.isReduceBrightColorsActivated(), adjustedNits);
        mPendingUserRbcChange = userInitiated;
        sendUpdatePowerState();

        mPendingRbcOnOrChanged = strengthChanged || justActivated;

        // Reset model if strength changed OR rbc is turned off
        if (strengthChanged || !justActivated && mAutomaticBrightnessController != null) {
            mAutomaticBrightnessController.resetShortTermModel();
        }
    }

    /**
@@ -926,7 +944,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call

    private void reloadReduceBrightColours() {
        if (mCdsi != null && mCdsi.isReduceBrightColorsActivated()) {
            applyReduceBrightColorsSplineAdjustment(/*userInitiated*/ false);
            applyReduceBrightColorsSplineAdjustment(
                    /* rbcStrengthChanged= */ false, /* justActivated= */ false);
        }
    }

@@ -2062,21 +2081,24 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        return true;
    }

    // We want to return true if the user has set the screen brightness.
    // If they have just turned RBC on (and therefore added that interaction to the curve),
    // or changed the brightness another way, then we should return true.
    private boolean updateUserSetScreenBrightness() {
        final boolean brightnessSplineChanged = mPendingUserRbcChange;
        if (mPendingUserRbcChange && !Float.isNaN(mCurrentScreenBrightnessSetting)) {
        final boolean treatAsIfUserChanged = mPendingRbcOnOrChanged;
        if (treatAsIfUserChanged && !Float.isNaN(mCurrentScreenBrightnessSetting)) {
            mLastUserSetScreenBrightness = mCurrentScreenBrightnessSetting;
        }
        mPendingUserRbcChange = false;
        mPendingRbcOnOrChanged = false;

        if ((Float.isNaN(mPendingScreenBrightnessSetting)
                || mPendingScreenBrightnessSetting < 0.0f)) {
            return brightnessSplineChanged;
            return treatAsIfUserChanged;
        }
        if (mCurrentScreenBrightnessSetting == mPendingScreenBrightnessSetting) {
            mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT;
            mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
            return brightnessSplineChanged;
            return treatAsIfUserChanged;
        }
        setCurrentScreenBrightness(mPendingScreenBrightnessSetting);
        mLastUserSetScreenBrightness = mPendingScreenBrightnessSetting;
@@ -2406,6 +2428,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                    }
                    handleSettingsChange(false /*userSwitch*/);
                    break;

                case MSG_UPDATE_RBC:
                    final int strengthChanged = msg.arg1;
                    final int justActivated = msg.arg2;
                    handleRbcChanged(strengthChanged == 1, justActivated == 1);
                    break;
            }
        }
    }