summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/display/DisplayDeviceConfig.java2
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java85
-rw-r--r--services/tests/servicestests/src/com/android/server/display/TestUtils.java7
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)