diff options
4 files changed, 97 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index bfb77b2e9c25..d9cb299db69f 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -1340,7 +1340,7 @@ public class DisplayDeviceConfig { } @Nullable - SensorData getProximitySensor() { + public SensorData getProximitySensor() { return mProximitySensor; } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 3832e6e372c5..858800a82151 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -4260,6 +4260,13 @@ public final class DisplayManagerService extends SystemService { } @VisibleForTesting + void overrideSensorManager(SensorManager sensorManager) { + synchronized (mSyncRoot) { + mSensorManager = sensorManager; + } + } + + @VisibleForTesting final class LocalService extends DisplayManagerInternal { @Override @@ -4512,7 +4519,7 @@ public final class DisplayManagerService extends SystemService { } final DisplayDeviceConfig config = device.getDisplayDeviceConfig(); SensorData sensorData = config.getProximitySensor(); - if (sensorData.matches(sensorName, sensorType)) { + if (sensorData != null && sensorData.matches(sensorName, sensorType)) { return new RefreshRateRange(sensorData.minRefreshRate, sensorData.maxRefreshRate); } diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java index 0e775d57bbd7..5db9d1f6f5bd 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -32,6 +32,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -60,6 +61,8 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Insets; import android.graphics.Rect; +import android.hardware.Sensor; +import android.hardware.SensorManager; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.Curve; import android.hardware.display.DisplayManager; @@ -109,8 +112,6 @@ import com.android.server.wm.WindowManagerInternal; import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges; import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; -import com.google.common.collect.ImmutableMap; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -125,6 +126,7 @@ import org.mockito.MockitoAnnotations; import java.time.Duration; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; @@ -136,6 +138,9 @@ import java.util.stream.LongStream; public class DisplayManagerServiceTest { private static final int MSG_REGISTER_DEFAULT_DISPLAY_ADAPTERS = 1; private static final long SHORT_DEFAULT_DISPLAY_TIMEOUT_MILLIS = 10; + + private static final float FLOAT_TOLERANCE = 0.01f; + private static final String VIRTUAL_DISPLAY_NAME = "Test Virtual Display"; private static final String PACKAGE_NAME = "com.android.frameworks.servicestests"; private static final long STANDARD_DISPLAY_EVENTS = DisplayManager.EVENT_FLAG_DISPLAY_ADDED @@ -250,6 +255,10 @@ public class DisplayManagerServiceTest { @Mock IBinder mMockDisplayToken; @Mock SensorManagerInternal mMockSensorManagerInternal; + @Mock SensorManager mSensorManager; + + @Mock DisplayDeviceConfig mMockDisplayDeviceConfig; + @Captor ArgumentCaptor<ContentRecordingSession> mContentRecordingSessionCaptor; @Before @@ -267,7 +276,7 @@ public class DisplayManagerServiceTest { LocalServices.removeServiceForTest(VirtualDeviceManagerInternal.class); LocalServices.addService( VirtualDeviceManagerInternal.class, mMockVirtualDeviceManagerInternal); - + // TODO: b/287945043 mContext = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); VirtualDeviceManager vdm = new VirtualDeviceManager(mIVirtualDeviceManager, mContext); @@ -396,7 +405,7 @@ public class DisplayManagerServiceTest { final int size = displayIds.length; assertTrue(size > 0); - Map<Integer, Integer> expectedDisplayTypeToViewPortTypeMapping = ImmutableMap.of( + Map<Integer, Integer> expectedDisplayTypeToViewPortTypeMapping = Map.of( Display.TYPE_INTERNAL, DisplayViewport.VIEWPORT_INTERNAL, Display.TYPE_EXTERNAL, DisplayViewport.VIEWPORT_EXTERNAL ); @@ -1934,6 +1943,74 @@ public class DisplayManagerServiceTest { assertEquals(mode, displayManager.getHdrConversionModeInternal()); } + @Test + public void testReturnsRefreshRateForDisplayAndSensor_proximitySensorSet() { + DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector); + DisplayManagerInternal localService = displayManager.new LocalService(); + DisplayManagerService.BinderService displayManagerBinderService = + displayManager.new BinderService(); + displayManager.overrideSensorManager(mSensorManager); + + FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, new float[]{60f}); + displayDevice.mDisplayDeviceConfig = mMockDisplayDeviceConfig; + int displayId = getDisplayIdForDisplayDevice(displayManager, displayManagerBinderService, + displayDevice); + + String testSensorName = "testName"; + String testSensorType = "testType"; + Sensor testSensor = TestUtils.createSensor(testSensorType, testSensorName); + + DisplayDeviceConfig.SensorData sensorData = new DisplayDeviceConfig.SensorData(); + sensorData.type = testSensorType; + sensorData.name = testSensorName; + sensorData.minRefreshRate = 10f; + sensorData.maxRefreshRate = 100f; + + when(mMockDisplayDeviceConfig.getProximitySensor()).thenReturn(sensorData); + when(mSensorManager.getSensorList(Sensor.TYPE_ALL)).thenReturn(Collections.singletonList( + testSensor)); + + SurfaceControl.RefreshRateRange result = localService.getRefreshRateForDisplayAndSensor( + displayId, testSensorName, testSensorType); + + assertNotNull(result); + assertEquals(result.min, sensorData.minRefreshRate, FLOAT_TOLERANCE); + assertEquals(result.max, sensorData.maxRefreshRate, FLOAT_TOLERANCE); + } + + @Test + public void testReturnsRefreshRateForDisplayAndSensor_proximitySensorNotSet() { + DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector); + DisplayManagerInternal localService = displayManager.new LocalService(); + DisplayManagerService.BinderService displayManagerBinderService = + displayManager.new BinderService(); + displayManager.overrideSensorManager(mSensorManager); + + FakeDisplayDevice displayDevice = createFakeDisplayDevice(displayManager, new float[]{60f}); + displayDevice.mDisplayDeviceConfig = mMockDisplayDeviceConfig; + int displayId = getDisplayIdForDisplayDevice(displayManager, displayManagerBinderService, + displayDevice); + + String testSensorName = "testName"; + String testSensorType = "testType"; + Sensor testSensor = TestUtils.createSensor(testSensorType, testSensorName); + + DisplayDeviceConfig.SensorData sensorData = new DisplayDeviceConfig.SensorData(); + sensorData.type = testSensorType; + sensorData.name = testSensorName; + sensorData.minRefreshRate = 10f; + sensorData.maxRefreshRate = 100f; + + when(mMockDisplayDeviceConfig.getProximitySensor()).thenReturn(null); + when(mSensorManager.getSensorList(Sensor.TYPE_ALL)).thenReturn(Collections.singletonList( + testSensor)); + + SurfaceControl.RefreshRateRange result = localService.getRefreshRateForDisplayAndSensor( + displayId, testSensorName, testSensorType); + + assertNull(result); + } + private void testDisplayInfoFrameRateOverrideModeCompat(boolean compatChangeEnabled) throws Exception { DisplayManagerService displayManager = diff --git a/services/tests/servicestests/src/com/android/server/display/TestUtils.java b/services/tests/servicestests/src/com/android/server/display/TestUtils.java index 90d9baed53d7..8b45145b160f 100644 --- a/services/tests/servicestests/src/com/android/server/display/TestUtils.java +++ b/services/tests/servicestests/src/com/android/server/display/TestUtils.java @@ -18,6 +18,7 @@ package com.android.server.display; import android.hardware.Sensor; import android.hardware.SensorEvent; +import android.hardware.input.InputSensorInfo; import android.os.Parcel; import android.os.SystemClock; import android.view.DisplayAddress; @@ -75,6 +76,12 @@ public final class TestUtils { return sensor; } + public static Sensor createSensor(String type, String name) { + return new Sensor(new InputSensorInfo( + name, "vendor", 0, 0, 0, 1f, 1f, 1, 1, 1, 1, + type, "", 0, 0, 0)); + } + /** * Create a custom {@link DisplayAddress} to ensure we're not relying on any specific * display-address implementation in our code. Intentionally uses default object (reference) |