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

Commit d12050a4 authored by Paul Hobbs's avatar Paul Hobbs Committed by Android (Google) Code Review
Browse files

Merge "Revert "Revert "Revert "[hbm] Separate HBM times for multi-display devices.""""

parents 92bf392d 205b2c7b
Loading
Loading
Loading
Loading
+4 −60
Original line number Original line Diff line number Diff line
@@ -109,7 +109,6 @@ import android.os.UserManager;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.provider.Settings;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.EventLog;
import android.util.EventLog;
import android.util.IntArray;
import android.util.IntArray;
@@ -261,13 +260,6 @@ public final class DisplayManagerService extends SystemService {
    final SparseArray<Pair<IVirtualDevice, DisplayWindowPolicyController>>
    final SparseArray<Pair<IVirtualDevice, DisplayWindowPolicyController>>
            mDisplayWindowPolicyControllers = new SparseArray<>();
            mDisplayWindowPolicyControllers = new SparseArray<>();


    /**
     *  Map of every internal primary display device {@link HighBrightnessModeMetadata}s indexed by
     *  {@link DisplayDevice#mUniqueId}.
     */
    public final ArrayMap<String, HighBrightnessModeMetadata> mHighBrightnessModeMetadataMap =
            new ArrayMap<>();

    // List of all currently registered display adapters.
    // List of all currently registered display adapters.
    private final ArrayList<DisplayAdapter> mDisplayAdapters = new ArrayList<DisplayAdapter>();
    private final ArrayList<DisplayAdapter> mDisplayAdapters = new ArrayList<DisplayAdapter>();


@@ -1648,16 +1640,7 @@ public final class DisplayManagerService extends SystemService {


        DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
        DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
        if (dpc != null) {
        if (dpc != null) {
            final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
            dpc.onDisplayChanged();
            if (device == null) {
                Slog.wtf(TAG, "Display Device is null in DisplayManagerService for display: "
                        + display.getDisplayIdLocked());
                return;
            }

            final String uniqueId = device.getUniqueId();
            HighBrightnessModeMetadata hbmMetadata = mHighBrightnessModeMetadataMap.get(uniqueId);
            dpc.onDisplayChanged(hbmMetadata);
        }
        }
    }
    }


@@ -1715,15 +1698,7 @@ public final class DisplayManagerService extends SystemService {
        final int displayId = display.getDisplayIdLocked();
        final int displayId = display.getDisplayIdLocked();
        final DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
        final DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
        if (dpc != null) {
        if (dpc != null) {
            final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
            dpc.onDisplayChanged();
            if (device == null) {
                Slog.wtf(TAG, "Display Device is null in DisplayManagerService for display: "
                        + display.getDisplayIdLocked());
                return;
            }
            final String uniqueId = device.getUniqueId();
            HighBrightnessModeMetadata hbmMetadata = mHighBrightnessModeMetadataMap.get(uniqueId);
            dpc.onDisplayChanged(hbmMetadata);
        }
        }
    }
    }


@@ -2676,31 +2651,6 @@ public final class DisplayManagerService extends SystemService {
        mLogicalDisplayMapper.forEachLocked(this::addDisplayPowerControllerLocked);
        mLogicalDisplayMapper.forEachLocked(this::addDisplayPowerControllerLocked);
    }
    }


    private HighBrightnessModeMetadata getHighBrightnessModeMetadata(LogicalDisplay display) {
        final DisplayDevice device = display.getPrimaryDisplayDeviceLocked();
        if (device == null) {
            Slog.wtf(TAG, "Display Device is null in DisplayPowerController for display: "
                    + display.getDisplayIdLocked());
            return null;
        }

        // HBM brightness mode is only applicable to internal physical displays.
        if (display.getDisplayInfoLocked().type != Display.TYPE_INTERNAL) {
            return null;
        }

        final String uniqueId = device.getUniqueId();

        if (mHighBrightnessModeMetadataMap.containsKey(uniqueId)) {
            return mHighBrightnessModeMetadataMap.get(uniqueId);
        }

        // HBM Time info not present. Create a new one for this physical display.
        HighBrightnessModeMetadata hbmInfo = new HighBrightnessModeMetadata();
        mHighBrightnessModeMetadataMap.put(uniqueId, hbmInfo);
        return hbmInfo;
    }

    @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
    @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
    private void addDisplayPowerControllerLocked(LogicalDisplay display) {
    private void addDisplayPowerControllerLocked(LogicalDisplay display) {
        if (mPowerHandler == null) {
        if (mPowerHandler == null) {
@@ -2716,23 +2666,17 @@ public final class DisplayManagerService extends SystemService {
                display, mSyncRoot);
                display, mSyncRoot);
        final DisplayPowerControllerInterface displayPowerController;
        final DisplayPowerControllerInterface displayPowerController;


        // If display is internal and has a HighBrightnessModeMetadata mapping, use that.
        // Or create a new one and use that.
        // We also need to pass a mapping of the HighBrightnessModeTimeInfoMap to
        // displayPowerController, so the hbm info can be correctly associated
        // with the corresponding displaydevice.
        HighBrightnessModeMetadata hbmMetadata = getHighBrightnessModeMetadata(display);
        if (DeviceConfig.getBoolean("display_manager",
        if (DeviceConfig.getBoolean("display_manager",
                "use_newly_structured_display_power_controller", true)) {
                "use_newly_structured_display_power_controller", true)) {
            displayPowerController = new DisplayPowerController2(
            displayPowerController = new DisplayPowerController2(
                    mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
                    mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
                    mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
                    mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
                    () -> handleBrightnessChange(display), hbmMetadata);
                    () -> handleBrightnessChange(display));
        } else {
        } else {
            displayPowerController = new DisplayPowerController(
            displayPowerController = new DisplayPowerController(
                    mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
                    mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
                    mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
                    mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
                    () -> handleBrightnessChange(display), hbmMetadata);
                    () -> handleBrightnessChange(display));
        }
        }
        mDisplayPowerControllers.append(display.getDisplayIdLocked(), displayPowerController);
        mDisplayPowerControllers.append(display.getDisplayIdLocked(), displayPowerController);
    }
    }
+5 −9
Original line number Original line Diff line number Diff line
@@ -388,7 +388,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
    private float[] mNitsRange;
    private float[] mNitsRange;


    private final HighBrightnessModeController mHbmController;
    private final HighBrightnessModeController mHbmController;
    private final HighBrightnessModeMetadata mHighBrightnessModeMetadata;


    private final BrightnessThrottler mBrightnessThrottler;
    private final BrightnessThrottler mBrightnessThrottler;


@@ -506,14 +505,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            DisplayPowerCallbacks callbacks, Handler handler,
            DisplayPowerCallbacks callbacks, Handler handler,
            SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
            SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
            BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
            BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
            Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata) {
            Runnable onBrightnessChangeRunnable) {


        mInjector = injector != null ? injector : new Injector();
        mInjector = injector != null ? injector : new Injector();
        mClock = mInjector.getClock();
        mClock = mInjector.getClock();
        mLogicalDisplay = logicalDisplay;
        mLogicalDisplay = logicalDisplay;
        mDisplayId = mLogicalDisplay.getDisplayIdLocked();
        mDisplayId = mLogicalDisplay.getDisplayIdLocked();
        mTag = "DisplayPowerController[" + mDisplayId + "]";
        mTag = "DisplayPowerController[" + mDisplayId + "]";
        mHighBrightnessModeMetadata = hbmMetadata;
        mSuspendBlockerIdUnfinishedBusiness = getSuspendBlockerUnfinishedBusinessId(mDisplayId);
        mSuspendBlockerIdUnfinishedBusiness = getSuspendBlockerUnfinishedBusinessId(mDisplayId);
        mSuspendBlockerIdOnStateChanged = getSuspendBlockerOnStateChangedId(mDisplayId);
        mSuspendBlockerIdOnStateChanged = getSuspendBlockerOnStateChangedId(mDisplayId);
        mSuspendBlockerIdProxPositive = getSuspendBlockerProxPositiveId(mDisplayId);
        mSuspendBlockerIdProxPositive = getSuspendBlockerProxPositiveId(mDisplayId);
@@ -792,7 +790,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
     * Make sure DisplayManagerService.mSyncRoot is held when this is called
     * Make sure DisplayManagerService.mSyncRoot is held when this is called
     */
     */
    @Override
    @Override
    public void onDisplayChanged(HighBrightnessModeMetadata hbmMetadata) {
    public void onDisplayChanged() {
        final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        if (device == null) {
        if (device == null) {
            Slog.wtf(mTag, "Display Device is null in DisplayPowerController for display: "
            Slog.wtf(mTag, "Display Device is null in DisplayPowerController for display: "
@@ -814,7 +812,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                mUniqueDisplayId = uniqueId;
                mUniqueDisplayId = uniqueId;
                mDisplayStatsId = mUniqueDisplayId.hashCode();
                mDisplayStatsId = mUniqueDisplayId.hashCode();
                mDisplayDeviceConfig = config;
                mDisplayDeviceConfig = config;
                loadFromDisplayDeviceConfig(token, info, hbmMetadata);
                loadFromDisplayDeviceConfig(token, info);


                /// Since the underlying display-device changed, we really don't know the
                /// Since the underlying display-device changed, we really don't know the
                // last command that was sent to change it's state. Lets assume it is unknown so
                // last command that was sent to change it's state. Lets assume it is unknown so
@@ -866,8 +864,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        }
        }
    }
    }


    private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info,
    private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
                                             HighBrightnessModeMetadata hbmMetadata) {
        // All properties that depend on the associated DisplayDevice and the DDC must be
        // All properties that depend on the associated DisplayDevice and the DDC must be
        // updated here.
        // updated here.
        loadBrightnessRampRates();
        loadBrightnessRampRates();
@@ -880,7 +877,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                    mBrightnessRampIncreaseMaxTimeMillis,
                    mBrightnessRampIncreaseMaxTimeMillis,
                    mBrightnessRampDecreaseMaxTimeMillis);
                    mBrightnessRampDecreaseMaxTimeMillis);
        }
        }
        mHbmController.setHighBrightnessModeMetadata(hbmMetadata);
        mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
        mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
                mDisplayDeviceConfig.getHighBrightnessModeData(),
                mDisplayDeviceConfig.getHighBrightnessModeData(),
                new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
                new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
@@ -1965,7 +1961,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                    if (mAutomaticBrightnessController != null) {
                    if (mAutomaticBrightnessController != null) {
                        mAutomaticBrightnessController.update();
                        mAutomaticBrightnessController.update();
                    }
                    }
                }, mHighBrightnessModeMetadata, mContext);
                }, mContext);
    }
    }


    private BrightnessThrottler createBrightnessThrottlerLocked() {
    private BrightnessThrottler createBrightnessThrottlerLocked() {
+5 −10
Original line number Original line Diff line number Diff line
@@ -327,7 +327,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
    private float[] mNitsRange;
    private float[] mNitsRange;


    private final HighBrightnessModeController mHbmController;
    private final HighBrightnessModeController mHbmController;
    private final HighBrightnessModeMetadata mHighBrightnessModeMetadata;


    private final BrightnessThrottler mBrightnessThrottler;
    private final BrightnessThrottler mBrightnessThrottler;


@@ -416,7 +415,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
            DisplayPowerCallbacks callbacks, Handler handler,
            DisplayPowerCallbacks callbacks, Handler handler,
            SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
            SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
            BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
            BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
            Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata) {
            Runnable onBrightnessChangeRunnable) {


        mInjector = injector != null ? injector : new Injector();
        mInjector = injector != null ? injector : new Injector();
        mClock = mInjector.getClock();
        mClock = mInjector.getClock();
@@ -432,7 +431,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        mDisplayPowerProximityStateController = mInjector.getDisplayPowerProximityStateController(
        mDisplayPowerProximityStateController = mInjector.getDisplayPowerProximityStateController(
                mWakelockController, mDisplayDeviceConfig, mHandler.getLooper(),
                mWakelockController, mDisplayDeviceConfig, mHandler.getLooper(),
                () -> updatePowerState(), mDisplayId, mSensorManager);
                () -> updatePowerState(), mDisplayId, mSensorManager);
        mHighBrightnessModeMetadata = hbmMetadata;
        mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController);
        mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController);
        mTag = "DisplayPowerController2[" + mDisplayId + "]";
        mTag = "DisplayPowerController2[" + mDisplayId + "]";


@@ -683,7 +681,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
     * Make sure DisplayManagerService.mSyncRoot lock is held when this is called
     * Make sure DisplayManagerService.mSyncRoot lock is held when this is called
     */
     */
    @Override
    @Override
    public void onDisplayChanged(HighBrightnessModeMetadata hbmMetadata) {
    public void onDisplayChanged() {
        final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        if (device == null) {
        if (device == null) {
            Slog.wtf(mTag, "Display Device is null in DisplayPowerController2 for display: "
            Slog.wtf(mTag, "Display Device is null in DisplayPowerController2 for display: "
@@ -697,7 +695,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
        final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
        final boolean isEnabled = mLogicalDisplay.isEnabledLocked();
        final boolean isEnabled = mLogicalDisplay.isEnabledLocked();
        final boolean isInTransition = mLogicalDisplay.isInTransitionLocked();
        final boolean isInTransition = mLogicalDisplay.isInTransitionLocked();

        mHandler.post(() -> {
        mHandler.post(() -> {
            boolean changed = false;
            boolean changed = false;
            if (mDisplayDevice != device) {
            if (mDisplayDevice != device) {
@@ -706,7 +703,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                mUniqueDisplayId = uniqueId;
                mUniqueDisplayId = uniqueId;
                mDisplayStatsId = mUniqueDisplayId.hashCode();
                mDisplayStatsId = mUniqueDisplayId.hashCode();
                mDisplayDeviceConfig = config;
                mDisplayDeviceConfig = config;
                loadFromDisplayDeviceConfig(token, info, hbmMetadata);
                loadFromDisplayDeviceConfig(token, info);
                mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config);
                mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config);


                // Since the underlying display-device changed, we really don't know the
                // Since the underlying display-device changed, we really don't know the
@@ -753,8 +750,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        }
        }
    }
    }


    private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info,
    private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
                                             HighBrightnessModeMetadata hbmMetadata) {
        // All properties that depend on the associated DisplayDevice and the DDC must be
        // All properties that depend on the associated DisplayDevice and the DDC must be
        // updated here.
        // updated here.
        loadBrightnessRampRates();
        loadBrightnessRampRates();
@@ -766,7 +762,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                    mBrightnessRampIncreaseMaxTimeMillis,
                    mBrightnessRampIncreaseMaxTimeMillis,
                    mBrightnessRampDecreaseMaxTimeMillis);
                    mBrightnessRampDecreaseMaxTimeMillis);
        }
        }
        mHbmController.setHighBrightnessModeMetadata(hbmMetadata);
        mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
        mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
                mDisplayDeviceConfig.getHighBrightnessModeData(),
                mDisplayDeviceConfig.getHighBrightnessModeData(),
                new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
                new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
@@ -1723,7 +1718,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                    if (mAutomaticBrightnessController != null) {
                    if (mAutomaticBrightnessController != null) {
                        mAutomaticBrightnessController.update();
                        mAutomaticBrightnessController.update();
                    }
                    }
                }, mHighBrightnessModeMetadata, mContext);
                }, mContext);
    }
    }


    private BrightnessThrottler createBrightnessThrottlerLocked() {
    private BrightnessThrottler createBrightnessThrottlerLocked() {
+2 −6
Original line number Original line Diff line number Diff line
@@ -31,14 +31,10 @@ import java.io.PrintWriter;
public interface DisplayPowerControllerInterface {
public interface DisplayPowerControllerInterface {


    /**
    /**
     * Notified when the display is changed.
     * Notified when the display is changed. We use this to apply any changes that might be needed
     * We use this to apply any changes that might be needed
     * when displays get swapped on foldable devices.
     * when displays get swapped on foldable devices.
     * We also pass the High brightness mode metadata like
     * remaining time and hbm events for the corresponding
     * physical display, to update the values correctly.
     */
     */
    void onDisplayChanged(HighBrightnessModeMetadata hbmInfo);
    void onDisplayChanged();


    /**
    /**
     * Unregisters all listeners and interrupts all running threads; halting future work.
     * Unregisters all listeners and interrupts all running threads; halting future work.
+0 −46
Original line number Original line Diff line number Diff line
/*
 * 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.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.display;


/**
 * Represents an event in which High Brightness Mode was enabled.
 */
class HbmEvent {
    private long mStartTimeMillis;
    private long mEndTimeMillis;

    HbmEvent(long startTimeMillis, long endTimeMillis) {
        this.mStartTimeMillis = startTimeMillis;
        this.mEndTimeMillis = endTimeMillis;
    }

    public long getStartTimeMillis() {
        return mStartTimeMillis;
    }

    public long getEndTimeMillis() {
        return mEndTimeMillis;
    }

    @Override
    public String toString() {
        return "HbmEvent: {startTimeMillis:" + mStartTimeMillis + ", endTimeMillis: "
                + mEndTimeMillis + "}, total: "
                + ((mEndTimeMillis - mStartTimeMillis) / 1000) + "]";
    }
}
Loading