From f5913647bb9da45c64b5b52be9dee3c4d181c368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wilczy=C5=84ski?= Date: Fri, 10 Mar 2023 09:43:57 +0000 Subject: [PATCH] Create HighBrightnessModeMetadataMapper Bug: 266063224 Test: atest HighBrightnessModeMetadataMapperTest Change-Id: I86993476436015ed6d76475d3df881330eb921ba --- .../server/display/DisplayManagerService.java | 66 ++++++------------- .../HighBrightnessModeMetadataMapper.java | 56 ++++++++++++++++ .../HighBrightnessModeMetadataMapperTest.java | 66 +++++++++++++++++++ 3 files changed, 142 insertions(+), 46 deletions(-) create mode 100644 services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java create mode 100644 services/tests/mockingservicestests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 85b4034966452..5d92c7f8cf057 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -119,7 +119,6 @@ import android.os.UserManager; import android.provider.DeviceConfig; import android.provider.Settings; import android.text.TextUtils; -import android.util.ArrayMap; import android.util.ArraySet; import android.util.EventLog; import android.util.IntArray; @@ -298,11 +297,10 @@ public final class DisplayManagerService extends SystemService { mDisplayWindowPolicyControllers = new SparseArray<>(); /** - * Map of every internal primary display device {@link HighBrightnessModeMetadata}s indexed by - * {@link DisplayDevice#mUniqueId}. + * Provides {@link HighBrightnessModeMetadata}s for {@link DisplayDevice}s. */ - public final ArrayMap mHighBrightnessModeMetadataMap = - new ArrayMap<>(); + private final HighBrightnessModeMetadataMapper mHighBrightnessModeMetadataMapper = + new HighBrightnessModeMetadataMapper(); // List of all currently registered display adapters. private final ArrayList mDisplayAdapters = new ArrayList(); @@ -1823,19 +1821,14 @@ public final class DisplayManagerService extends SystemService { DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId); if (dpc != null) { - final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); - if (device == null) { - Slog.wtf(TAG, "Display Device is null in DisplayManagerService for display: " - + display.getDisplayIdLocked()); - return; - } - final int leadDisplayId = display.getLeadDisplayIdLocked(); updateDisplayPowerControllerLeaderLocked(dpc, leadDisplayId); - final String uniqueId = device.getUniqueId(); - HighBrightnessModeMetadata hbmMetadata = mHighBrightnessModeMetadataMap.get(uniqueId); - dpc.onDisplayChanged(hbmMetadata, leadDisplayId); + HighBrightnessModeMetadata hbmMetadata = + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); + if (hbmMetadata != null) { + dpc.onDisplayChanged(hbmMetadata, leadDisplayId); + } } } @@ -1922,19 +1915,14 @@ public final class DisplayManagerService extends SystemService { final int displayId = display.getDisplayIdLocked(); final DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId); if (dpc != null) { - final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); - if (device == null) { - Slog.wtf(TAG, "Display Device is null in DisplayManagerService for display: " - + display.getDisplayIdLocked()); - return; - } - final int leadDisplayId = display.getLeadDisplayIdLocked(); updateDisplayPowerControllerLeaderLocked(dpc, leadDisplayId); - final String uniqueId = device.getUniqueId(); - HighBrightnessModeMetadata hbmMetadata = mHighBrightnessModeMetadataMap.get(uniqueId); - dpc.onDisplayChanged(hbmMetadata, leadDisplayId); + HighBrightnessModeMetadata hbmMetadata = + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); + if (hbmMetadata != null) { + dpc.onDisplayChanged(hbmMetadata, leadDisplayId); + } } } @@ -3073,26 +3061,6 @@ public final class DisplayManagerService extends SystemService { 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; - } - - 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) private void addDisplayPowerControllerLocked(LogicalDisplay display) { if (mPowerHandler == null) { @@ -3113,7 +3081,13 @@ public final class DisplayManagerService extends SystemService { // 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); + HighBrightnessModeMetadata hbmMetadata = + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); + if (hbmMetadata == null) { + Slog.wtf(TAG, "High Brightness Mode Metadata is null in DisplayManagerService for " + + "display: " + display.getDisplayIdLocked()); + return; + } if (DeviceConfig.getBoolean("display_manager", "use_newly_structured_display_power_controller", true)) { displayPowerController = new DisplayPowerController2( diff --git a/services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java b/services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java new file mode 100644 index 0000000000000..76702d3f6f8ca --- /dev/null +++ b/services/core/java/com/android/server/display/HighBrightnessModeMetadataMapper.java @@ -0,0 +1,56 @@ +/* + * 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; + +import android.util.ArrayMap; +import android.util.Slog; + +/** + * Provides {@link HighBrightnessModeMetadata}s for {@link DisplayDevice}s. This class should only + * be accessed from the display thread. + */ +class HighBrightnessModeMetadataMapper { + + private static final String TAG = "HighBrightnessModeMetadataMapper"; + + /** + * Map of every internal primary display device {@link HighBrightnessModeMetadata}s indexed by + * {@link DisplayDevice#mUniqueId}. + */ + private final ArrayMap mHighBrightnessModeMetadataMap = + new ArrayMap<>(); + + HighBrightnessModeMetadata getHighBrightnessModeMetadataLocked(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; + } + + 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; + } +} diff --git a/services/tests/mockingservicestests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java b/services/tests/mockingservicestests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java new file mode 100644 index 0000000000000..d9fbba5b42744 --- /dev/null +++ b/services/tests/mockingservicestests/src/com/android/server/display/HighBrightnessModeMetadataMapperTest.java @@ -0,0 +1,66 @@ +/* + * 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; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.Before; +import org.junit.Test; + +public class HighBrightnessModeMetadataMapperTest { + + private HighBrightnessModeMetadataMapper mHighBrightnessModeMetadataMapper; + + @Before + public void setUp() { + mHighBrightnessModeMetadataMapper = new HighBrightnessModeMetadataMapper(); + } + + @Test + public void testGetHighBrightnessModeMetadata() { + // Display device is null + final LogicalDisplay display = mock(LogicalDisplay.class); + when(display.getPrimaryDisplayDeviceLocked()).thenReturn(null); + assertNull(mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display)); + + // No HBM metadata stored for this display yet + final DisplayDevice device = mock(DisplayDevice.class); + when(display.getPrimaryDisplayDeviceLocked()).thenReturn(device); + HighBrightnessModeMetadata hbmMetadata = + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); + assertTrue(hbmMetadata.getHbmEventQueue().isEmpty()); + assertTrue(hbmMetadata.getRunningStartTimeMillis() < 0); + + // Modify the metadata + long startTimeMillis = 100; + long endTimeMillis = 200; + long setTime = 300; + hbmMetadata.addHbmEvent(new HbmEvent(startTimeMillis, endTimeMillis)); + hbmMetadata.setRunningStartTimeMillis(setTime); + hbmMetadata = + mHighBrightnessModeMetadataMapper.getHighBrightnessModeMetadataLocked(display); + assertEquals(1, hbmMetadata.getHbmEventQueue().size()); + assertEquals(startTimeMillis, + hbmMetadata.getHbmEventQueue().getFirst().getStartTimeMillis()); + assertEquals(endTimeMillis, hbmMetadata.getHbmEventQueue().getFirst().getEndTimeMillis()); + assertEquals(setTime, hbmMetadata.getRunningStartTimeMillis()); + } +}