Loading services/core/java/com/android/server/display/DisplayModeDirector.java +27 −8 Original line number Diff line number Diff line Loading @@ -52,9 +52,12 @@ import com.android.server.display.utils.AmbientFilterFactory; import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Objects; /** Loading Loading @@ -1160,7 +1163,8 @@ public class DisplayModeDirector { // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate // changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. private boolean mDefaultDisplayOn = false; private int mDefaultDisplayState = Display.STATE_UNKNOWN; private boolean mIsDeviceActive = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; Loading Loading @@ -1341,7 +1345,8 @@ public class DisplayModeDirector { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); pw.println(" mBrightness: " + mBrightness); pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); pw.println(" mDefaultDisplayState: " + mDefaultDisplayState); pw.println(" mIsDeviceActive: " + mIsDeviceActive); pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); Loading Loading @@ -1567,14 +1572,17 @@ public class DisplayModeDirector { private void updateDefaultDisplayState() { Display display = mContext.getSystemService(DisplayManager.class) .getDisplay(Display.DEFAULT_DISPLAY); boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; setDefaultDisplayState(defaultDisplayOn); if (display == null) { return; } setDefaultDisplayState(display.getState()); } @VisibleForTesting public void setDefaultDisplayState(boolean on) { if (mDefaultDisplayOn != on) { mDefaultDisplayOn = on; public void setDefaultDisplayState(int state) { if (mDefaultDisplayState != state) { mDefaultDisplayState = state; updateSensorStatus(); } } Loading @@ -1595,15 +1603,19 @@ public class DisplayModeDirector { } private boolean isDeviceActive() { return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); mIsDeviceActive = mInjector.isDeviceInteractive(mContext); return (mDefaultDisplayState == Display.STATE_ON) && mIsDeviceActive; } private final class LightSensorEventListener implements SensorEventListener { final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; private float mLastSensorData; private long mTimestamp; public void dumpLocked(PrintWriter pw) { pw.println(" mLastSensorData: " + mLastSensorData); pw.println(" mTimestamp: " + formatTimestamp(mTimestamp)); } @Override Loading @@ -1627,6 +1639,7 @@ public class DisplayModeDirector { } long now = SystemClock.uptimeMillis(); mTimestamp = System.currentTimeMillis(); if (mAmbientFilter != null) { mAmbientFilter.addValue(now, mLastSensorData); } Loading @@ -1653,6 +1666,12 @@ public class DisplayModeDirector { mHandler.removeCallbacks(mInjectSensorEventRunnable); } private String formatTimestamp(long time) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); return dateFormat.format(new Date(time)); } private void processSensorData(long now) { if (mAmbientFilter != null) { mAmbientLux = mAmbientFilter.getEstimate(now); Loading services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +40 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.internal.verification.VerificationModeFactory.times; import android.annotation.NonNull; import android.content.ContentResolver; Loading Loading @@ -410,7 +411,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(true); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInLowZone(90); Loading Loading @@ -453,7 +454,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(true); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInHighZone(60); Loading Loading @@ -490,6 +491,43 @@ public class DisplayModeDirectorTest { assertVoteForRefreshRateLocked(vote, 60 /*fps*/); } @Test public void testSensorRegistration() { DisplayModeDirector director = createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Sensor lightSensor = createLightSensor(); SensorManager sensorManager = createMockSensorManager(lightSensor); director.start(sensorManager); ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) .registerListener( listenerCaptor.capture(), eq(lightSensor), anyInt(), any(Handler.class)); // Dispaly state changed from On to Doze director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_DOZE); Mockito.verify(sensorManager) .unregisterListener(listenerCaptor.capture()); // Dispaly state changed from Doze to On director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Mockito.verify(sensorManager, times(2)) .registerListener( listenerCaptor.capture(), eq(lightSensor), anyInt(), any(Handler.class)); } private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) { assertThat(vote).isNotNull(); final DisplayModeDirector.RefreshRateRange expectedRange = Loading Loading
services/core/java/com/android/server/display/DisplayModeDirector.java +27 −8 Original line number Diff line number Diff line Loading @@ -52,9 +52,12 @@ import com.android.server.display.utils.AmbientFilterFactory; import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Objects; /** Loading Loading @@ -1160,7 +1163,8 @@ public class DisplayModeDirector { // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate // changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. private boolean mDefaultDisplayOn = false; private int mDefaultDisplayState = Display.STATE_UNKNOWN; private boolean mIsDeviceActive = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; Loading Loading @@ -1341,7 +1345,8 @@ public class DisplayModeDirector { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); pw.println(" mBrightness: " + mBrightness); pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); pw.println(" mDefaultDisplayState: " + mDefaultDisplayState); pw.println(" mIsDeviceActive: " + mIsDeviceActive); pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); Loading Loading @@ -1567,14 +1572,17 @@ public class DisplayModeDirector { private void updateDefaultDisplayState() { Display display = mContext.getSystemService(DisplayManager.class) .getDisplay(Display.DEFAULT_DISPLAY); boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; setDefaultDisplayState(defaultDisplayOn); if (display == null) { return; } setDefaultDisplayState(display.getState()); } @VisibleForTesting public void setDefaultDisplayState(boolean on) { if (mDefaultDisplayOn != on) { mDefaultDisplayOn = on; public void setDefaultDisplayState(int state) { if (mDefaultDisplayState != state) { mDefaultDisplayState = state; updateSensorStatus(); } } Loading @@ -1595,15 +1603,19 @@ public class DisplayModeDirector { } private boolean isDeviceActive() { return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); mIsDeviceActive = mInjector.isDeviceInteractive(mContext); return (mDefaultDisplayState == Display.STATE_ON) && mIsDeviceActive; } private final class LightSensorEventListener implements SensorEventListener { final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; private float mLastSensorData; private long mTimestamp; public void dumpLocked(PrintWriter pw) { pw.println(" mLastSensorData: " + mLastSensorData); pw.println(" mTimestamp: " + formatTimestamp(mTimestamp)); } @Override Loading @@ -1627,6 +1639,7 @@ public class DisplayModeDirector { } long now = SystemClock.uptimeMillis(); mTimestamp = System.currentTimeMillis(); if (mAmbientFilter != null) { mAmbientFilter.addValue(now, mLastSensorData); } Loading @@ -1653,6 +1666,12 @@ public class DisplayModeDirector { mHandler.removeCallbacks(mInjectSensorEventRunnable); } private String formatTimestamp(long time) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); return dateFormat.format(new Date(time)); } private void processSensorData(long now) { if (mAmbientFilter != null) { mAmbientLux = mAmbientFilter.getEstimate(now); Loading
services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +40 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.internal.verification.VerificationModeFactory.times; import android.annotation.NonNull; import android.content.ContentResolver; Loading Loading @@ -410,7 +411,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(true); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInLowZone(90); Loading Loading @@ -453,7 +454,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(true); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInHighZone(60); Loading Loading @@ -490,6 +491,43 @@ public class DisplayModeDirectorTest { assertVoteForRefreshRateLocked(vote, 60 /*fps*/); } @Test public void testSensorRegistration() { DisplayModeDirector director = createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Sensor lightSensor = createLightSensor(); SensorManager sensorManager = createMockSensorManager(lightSensor); director.start(sensorManager); ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) .registerListener( listenerCaptor.capture(), eq(lightSensor), anyInt(), any(Handler.class)); // Dispaly state changed from On to Doze director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_DOZE); Mockito.verify(sensorManager) .unregisterListener(listenerCaptor.capture()); // Dispaly state changed from Doze to On director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); Mockito.verify(sensorManager, times(2)) .registerListener( listenerCaptor.capture(), eq(lightSensor), anyInt(), any(Handler.class)); } private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) { assertThat(vote).isNotNull(); final DisplayModeDirector.RefreshRateRange expectedRange = Loading