Proximity sensor can be null, handling this case properly for DMS
Test: manual testing on device, atestDisplayManagerServiceTest Bug: b/287573309 Change-Id: Ib19afdc2aeabfce3e19facdf1faebaca2069d9f1
This commit is contained in:
committed by
Oleg Petšjonkin
parent
593e939a6e
commit
f7d8c79bdd
@@ -1340,7 +1340,7 @@ public class DisplayDeviceConfig {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
SensorData getProximitySensor() {
|
||||
public SensorData getProximitySensor() {
|
||||
return mProximitySensor;
|
||||
}
|
||||
|
||||
|
||||
@@ -4259,6 +4259,13 @@ public final class DisplayManagerService extends SystemService {
|
||||
return !Float.isNaN(refreshRate) && (refreshRate > 0.0f);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void overrideSensorManager(SensorManager sensorManager) {
|
||||
synchronized (mSyncRoot) {
|
||||
mSensorManager = sensorManager;
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
final class LocalService extends DisplayManagerInternal {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user