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

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

Call onDisplayChanged even if hbmMetadata is null

Bug: 350972658
Test: atest DisplayManagerServiceTest
Flag: EXEMPT bugfix
Change-Id: I007de54dc85b2728dd17e9be8377e7719a9b9d7b
parent 3af109a0
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


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


import android.annotation.Nullable;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.BrightnessInfo;
import android.os.Handler;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
@@ -92,7 +93,7 @@ class BrightnessRangeController {
        return mHbmController.getNormalBrightnessMax();
        return mHbmController.getNormalBrightnessMax();
    }
    }


    void loadFromConfig(HighBrightnessModeMetadata hbmMetadata, IBinder token,
    void loadFromConfig(@Nullable HighBrightnessModeMetadata hbmMetadata, IBinder token,
            DisplayDeviceInfo info, DisplayDeviceConfig displayDeviceConfig) {
            DisplayDeviceInfo info, DisplayDeviceConfig displayDeviceConfig) {
        applyChanges(
        applyChanges(
                () -> mNormalBrightnessModeController.resetNbmData(
                () -> mNormalBrightnessModeController.resetNbmData(
+15 −7
Original line number Original line Diff line number Diff line
@@ -2158,11 +2158,9 @@ public final class DisplayManagerService extends SystemService {


            HighBrightnessModeMetadata hbmMetadata =
            HighBrightnessModeMetadata hbmMetadata =
                    mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display);
                    mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display);
            if (hbmMetadata != null) {
            dpc.onDisplayChanged(hbmMetadata, leadDisplayId);
            dpc.onDisplayChanged(hbmMetadata, leadDisplayId);
        }
        }
    }
    }
    }


    private void updateDisplayPowerControllerLeaderLocked(
    private void updateDisplayPowerControllerLeaderLocked(
            @NonNull DisplayPowerController dpc, int leadDisplayId) {
            @NonNull DisplayPowerController dpc, int leadDisplayId) {
@@ -2278,11 +2276,9 @@ public final class DisplayManagerService extends SystemService {


            HighBrightnessModeMetadata hbmMetadata =
            HighBrightnessModeMetadata hbmMetadata =
                    mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display);
                    mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display);
            if (hbmMetadata != null) {
            dpc.onDisplayChanged(hbmMetadata, leadDisplayId);
            dpc.onDisplayChanged(hbmMetadata, leadDisplayId);
        }
        }
    }
    }
    }


    private Runnable updateDisplayStateLocked(DisplayDevice device) {
    private Runnable updateDisplayStateLocked(DisplayDevice device) {
        // Blank or unblank the display immediately to match the state requested
        // Blank or unblank the display immediately to match the state requested
@@ -3542,6 +3538,18 @@ public final class DisplayManagerService extends SystemService {
        DisplayManagerFlags getFlags() {
        DisplayManagerFlags getFlags() {
            return new DisplayManagerFlags();
            return new DisplayManagerFlags();
        }
        }

        DisplayPowerController getDisplayPowerController(Context context,
                DisplayPowerController.Injector injector,
                DisplayManagerInternal.DisplayPowerCallbacks callbacks, Handler handler,
                SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
                BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
                Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata,
                boolean bootCompleted, DisplayManagerFlags flags) {
            return new DisplayPowerController(context, injector, callbacks, handler, sensorManager,
                    blanker, logicalDisplay, brightnessTracker, brightnessSetting,
                    onBrightnessChangeRunnable, hbmMetadata, bootCompleted, flags);
        }
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -3594,7 +3602,7 @@ public final class DisplayManagerService extends SystemService {
        // with the corresponding displaydevice.
        // with the corresponding displaydevice.
        HighBrightnessModeMetadata hbmMetadata =
        HighBrightnessModeMetadata hbmMetadata =
                mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display);
                mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display);
        displayPowerController = new DisplayPowerController(
        displayPowerController = mInjector.getDisplayPowerController(
                mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
                mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
                mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
                mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
                () -> handleBrightnessChange(display), hbmMetadata, mBootCompleted, mFlags);
                () -> handleBrightnessChange(display), hbmMetadata, mBootCompleted, mFlags);
+3 −2
Original line number Original line Diff line number Diff line
@@ -849,7 +849,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
     *
     *
     * Make sure DisplayManagerService.mSyncRoot lock is held when this is called
     * Make sure DisplayManagerService.mSyncRoot lock is held when this is called
     */
     */
    public void onDisplayChanged(HighBrightnessModeMetadata hbmMetadata, int leadDisplayId) {
    public void onDisplayChanged(@Nullable HighBrightnessModeMetadata hbmMetadata,
            int leadDisplayId) {
        mLeadDisplayId = leadDisplayId;
        mLeadDisplayId = leadDisplayId;
        final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
        if (device == null) {
        if (device == null) {
@@ -949,7 +950,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
    }
    }


    private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info,
    private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info,
            HighBrightnessModeMetadata hbmMetadata) {
            @Nullable 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.
        mScreenBrightnessDozeConfig = BrightnessUtils.clampAbsoluteBrightness(
        mScreenBrightnessDozeConfig = BrightnessUtils.clampAbsoluteBrightness(
+1 −1
Original line number Original line Diff line number Diff line
@@ -266,7 +266,7 @@ class HighBrightnessModeController {
        mSettingsObserver.stopObserving();
        mSettingsObserver.stopObserving();
    }
    }


    void setHighBrightnessModeMetadata(HighBrightnessModeMetadata hbmInfo) {
    void setHighBrightnessModeMetadata(@Nullable HighBrightnessModeMetadata hbmInfo) {
        mHighBrightnessModeMetadata = hbmInfo;
        mHighBrightnessModeMetadata = hbmInfo;
    }
    }


+40 −0
Original line number Original line Diff line number Diff line
@@ -141,6 +141,7 @@ import com.android.server.display.DisplayManagerService.DeviceStateListener;
import com.android.server.display.DisplayManagerService.SyncRoot;
import com.android.server.display.DisplayManagerService.SyncRoot;
import com.android.server.display.config.SensorData;
import com.android.server.display.config.SensorData;
import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.layout.Layout;
import com.android.server.display.notifications.DisplayNotificationManager;
import com.android.server.display.notifications.DisplayNotificationManager;
import com.android.server.input.InputManagerInternal;
import com.android.server.input.InputManagerInternal;
import com.android.server.lights.LightsManager;
import com.android.server.lights.LightsManager;
@@ -3128,6 +3129,45 @@ public class DisplayManagerServiceTest {
                argThat(matchesFilter));
                argThat(matchesFilter));
    }
    }


    @Test
    public void testOnDisplayChanged_HbmMetadataNull() {
        DisplayPowerController dpc = mock(DisplayPowerController.class);
        DisplayManagerService.Injector injector = new BasicInjector() {
            @Override
            DisplayPowerController getDisplayPowerController(Context context,
                    DisplayPowerController.Injector injector,
                    DisplayManagerInternal.DisplayPowerCallbacks callbacks, Handler handler,
                    SensorManager sensorManager, DisplayBlanker blanker,
                    LogicalDisplay logicalDisplay, BrightnessTracker brightnessTracker,
                    BrightnessSetting brightnessSetting, Runnable onBrightnessChangeRunnable,
                    HighBrightnessModeMetadata hbmMetadata, boolean bootCompleted,
                    DisplayManagerFlags flags) {
                return dpc;
            }
        };
        DisplayManagerService displayManager = new DisplayManagerService(mContext, injector);
        DisplayManagerInternal localService = displayManager.new LocalService();
        registerDefaultDisplays(displayManager);
        displayManager.onBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

        // Add the FakeDisplayDevice
        FakeDisplayDevice displayDevice = new FakeDisplayDevice();
        DisplayDeviceInfo displayDeviceInfo = new DisplayDeviceInfo();
        displayDeviceInfo.state = Display.STATE_ON;
        displayDevice.setDisplayDeviceInfo(displayDeviceInfo);
        displayManager.getDisplayDeviceRepository()
                .onDisplayDeviceEvent(displayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED);
        initDisplayPowerController(localService);

        // Simulate DisplayDevice change
        DisplayDeviceInfo displayDeviceInfo2 = new DisplayDeviceInfo();
        displayDeviceInfo2.copyFrom(displayDeviceInfo);
        displayDeviceInfo2.state = Display.STATE_DOZE;
        updateDisplayDeviceInfo(displayManager, displayDevice, displayDeviceInfo2);

        verify(dpc).onDisplayChanged(/* hbmMetadata= */ null, Layout.NO_LEAD_DISPLAY);
    }

    private void initDisplayPowerController(DisplayManagerInternal localService) {
    private void initDisplayPowerController(DisplayManagerInternal localService) {
        localService.initPowerManagement(new DisplayManagerInternal.DisplayPowerCallbacks() {
        localService.initPowerManagement(new DisplayManagerInternal.DisplayPowerCallbacks() {
            @Override
            @Override