From 273a19830549889f14bc473c84d04700af564132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wilczy=C5=84ski?= Date: Wed, 25 Jan 2023 16:30:49 +0000 Subject: [PATCH] Only load the prox sensor for the default display Bug: b/241308597 Test: adb shell dumpsys display | grep mProximitySensor Test: atest DisplayPowerProximityStateControllerTest Test: atest DisplayPowerControllerTest Test: atest DisplayPowerController2Test Change-Id: I04fa643d38784976ff86602c5e50f375567ddd6b --- .../display/DisplayPowerController.java | 6 +- .../DisplayPowerProximityStateController.java | 6 +- .../display/DisplayPowerController2Test.java | 56 ++++++++++++++++++- .../display/DisplayPowerControllerTest.java | 56 ++++++++++++++++++- 4 files changed, 110 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index dbd2ab0cbe60d..439f80624e9a9 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -2192,15 +2192,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } private void loadProximitySensor() { - if (DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) { + if (DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT || mDisplayId != Display.DEFAULT_DISPLAY) { return; } final DisplayDeviceConfig.SensorData proxSensor = mDisplayDeviceConfig.getProximitySensor(); - final int fallbackType = mDisplayId == Display.DEFAULT_DISPLAY - ? Sensor.TYPE_PROXIMITY : SensorUtils.NO_FALLBACK; mProximitySensor = SensorUtils.findSensor(mSensorManager, proxSensor.type, proxSensor.name, - fallbackType); + Sensor.TYPE_PROXIMITY); if (mProximitySensor != null) { mProximityThreshold = Math.min(mProximitySensor.getMaximumRange(), TYPICAL_PROXIMITY_THRESHOLD); diff --git a/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java b/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java index a3433d9570a4f..5bb3e6bf1c36f 100644 --- a/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java +++ b/services/core/java/com/android/server/display/DisplayPowerProximityStateController.java @@ -346,15 +346,13 @@ public final class DisplayPowerProximityStateController { } private void loadProximitySensor() { - if (DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) { + if (DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT || mDisplayId != Display.DEFAULT_DISPLAY) { return; } final DisplayDeviceConfig.SensorData proxSensor = mDisplayDeviceConfig.getProximitySensor(); - final int fallbackType = mDisplayId == Display.DEFAULT_DISPLAY - ? Sensor.TYPE_PROXIMITY : SensorUtils.NO_FALLBACK; mProximitySensor = SensorUtils.findSensor(mSensorManager, proxSensor.type, proxSensor.name, - fallbackType); + Sensor.TYPE_PROXIMITY); if (mProximitySensor != null) { mProximityThreshold = Math.min(mProximitySensor.getMaximumRange(), TYPICAL_PROXIMITY_THRESHOLD); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index 3d36c1c16338b..57e873d434ed5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -16,13 +16,17 @@ package com.android.server.display; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -46,8 +50,11 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.server.LocalServices; +import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; +import com.android.server.display.color.ColorDisplayService; import com.android.server.policy.WindowManagerPolicy; import com.android.server.testutils.OffsettableClock; @@ -58,7 +65,9 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.MockitoSession; +import org.mockito.quality.Strictness; +import org.mockito.stubbing.Answer; import java.util.List; @@ -67,8 +76,9 @@ import java.util.List; @RunWith(AndroidJUnit4.class) public final class DisplayPowerController2Test { private static final String UNIQUE_DISPLAY_ID = "unique_id_test123"; - private static final int DISPLAY_ID = 42; + private static final int DISPLAY_ID = Display.DEFAULT_DISPLAY; + private MockitoSession mSession; private OffsettableClock mClock; private TestLooper mTestLooper; private Handler mHandler; @@ -105,13 +115,20 @@ public final class DisplayPowerController2Test { private DualRampAnimator mDualRampAnimatorMock; @Mock private WakelockController mWakelockController; + @Mock + private ColorDisplayService.ColorDisplayServiceInternal mCdsiMock; @Captor private ArgumentCaptor mSensorEventListenerCaptor; @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); + mSession = ExtendedMockito.mockitoSession() + .initMocks(this) + .strictness(Strictness.LENIENT) + .spyStatic(LocalServices.class) + .spyStatic(BatteryStatsService.class) + .startMocking(); mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); mClock = new OffsettableClock.Stopped(); mTestLooper = new TestLooper(mClock::now); @@ -156,10 +173,17 @@ public final class DisplayPowerController2Test { when(mContextSpy.getSystemService(eq(PowerManager.class))).thenReturn(mPowerManagerMock); when(mContextSpy.getResources()).thenReturn(mResourcesMock); + + doAnswer((Answer) invocationOnMock -> + mCdsiMock).when(() -> LocalServices.getService( + ColorDisplayService.ColorDisplayServiceInternal.class)); + doAnswer((Answer) invocationOnMock -> null).when(() -> + BatteryStatsService.getService()); } @After public void tearDown() { + mSession.finishMocking(); LocalServices.removeServiceForTest(WindowManagerPolicy.class); } @@ -207,6 +231,32 @@ public final class DisplayPowerController2Test { WakelockController.WAKE_LOCK_PROXIMITY_DEBOUNCE); } + @Test + public void testProximitySensorListenerNotRegisteredForNonDefaultDisplay() throws Exception { + setUpDisplay(1, UNIQUE_DISPLAY_ID); + + Sensor proxSensor = setUpProxSensor(); + + DisplayPowerController2 dpc = new DisplayPowerController2( + mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler, + mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock, + mBrightnessTrackerMock, mBrightnessSettingMock, () -> { + }, mHighBrightnessModeMetadataMock); + + when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON); + // send a display power request + DisplayPowerRequest dpr = new DisplayPowerRequest(); + dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; + dpr.useProximitySensor = true; + dpc.requestPowerState(dpr, false /* waitForNegativeProximity */); + + // Run updatePowerState + advanceTime(1); + + verify(mSensorManagerMock, never()).registerListener(any(SensorEventListener.class), + eq(proxSensor), anyInt(), any(Handler.class)); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index b6388ccbc653f..6bf5b62ee8d69 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -16,14 +16,18 @@ package com.android.server.display; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -46,8 +50,11 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.server.LocalServices; +import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; +import com.android.server.display.color.ColorDisplayService; import com.android.server.policy.WindowManagerPolicy; import com.android.server.testutils.OffsettableClock; @@ -58,7 +65,9 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.MockitoSession; +import org.mockito.quality.Strictness; +import org.mockito.stubbing.Answer; import java.util.List; @@ -67,8 +76,9 @@ import java.util.List; @RunWith(AndroidJUnit4.class) public final class DisplayPowerControllerTest { private static final String UNIQUE_DISPLAY_ID = "unique_id_test123"; - private static final int DISPLAY_ID = 42; + private static final int DISPLAY_ID = Display.DEFAULT_DISPLAY; + private MockitoSession mSession; private OffsettableClock mClock; private TestLooper mTestLooper; private Handler mHandler; @@ -103,13 +113,20 @@ public final class DisplayPowerControllerTest { private DisplayPowerState mDisplayPowerStateMock; @Mock private DualRampAnimator mDualRampAnimatorMock; + @Mock + private ColorDisplayService.ColorDisplayServiceInternal mCdsiMock; @Captor private ArgumentCaptor mSensorEventListenerCaptor; @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); + mSession = ExtendedMockito.mockitoSession() + .initMocks(this) + .strictness(Strictness.LENIENT) + .spyStatic(LocalServices.class) + .spyStatic(BatteryStatsService.class) + .startMocking(); mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); mClock = new OffsettableClock.Stopped(); mTestLooper = new TestLooper(mClock::now); @@ -138,10 +155,17 @@ public final class DisplayPowerControllerTest { when(mContextSpy.getSystemService(eq(PowerManager.class))).thenReturn(mPowerManagerMock); when(mContextSpy.getResources()).thenReturn(mResourcesMock); + + doAnswer((Answer) invocationOnMock -> + mCdsiMock).when(() -> LocalServices.getService( + ColorDisplayService.ColorDisplayServiceInternal.class)); + doAnswer((Answer) invocationOnMock -> null).when(() -> + BatteryStatsService.getService()); } @After public void tearDown() { + mSession.finishMocking(); LocalServices.removeServiceForTest(WindowManagerPolicy.class); } @@ -189,6 +213,32 @@ public final class DisplayPowerControllerTest { dpc.getSuspendBlockerProxDebounceId(DISPLAY_ID)); } + @Test + public void testProximitySensorListenerNotRegisteredForNonDefaultDisplay() throws Exception { + setUpDisplay(1, UNIQUE_DISPLAY_ID); + + Sensor proxSensor = setUpProxSensor(); + + DisplayPowerController dpc = new DisplayPowerController( + mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler, + mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock, + mBrightnessTrackerMock, mBrightnessSettingMock, () -> { + }, mHighBrightnessModeMetadataMock); + + when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON); + // send a display power request + DisplayPowerRequest dpr = new DisplayPowerRequest(); + dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; + dpr.useProximitySensor = true; + dpc.requestPowerState(dpr, false /* waitForNegativeProximity */); + + // Run updatePowerState + advanceTime(1); + + verify(mSensorManagerMock, never()).registerListener(any(SensorEventListener.class), + eq(proxSensor), anyInt(), any(Handler.class)); + } + /** * Creates a mock and registers it to {@link LocalServices}. */