Merge "Fix the ambient lux which did not update for blocking zone" into rvc-qpr-dev

This commit is contained in:
TreeHugger Robot
2021-01-12 21:45:48 +00:00
committed by Android (Google) Code Review
2 changed files with 67 additions and 10 deletions

View File

@@ -52,9 +52,12 @@ import com.android.server.display.utils.AmbientFilterFactory;
import com.android.server.utils.DeviceConfigInterface; import com.android.server.utils.DeviceConfigInterface;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -1160,7 +1163,8 @@ public class DisplayModeDirector {
// mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate
// changeable and low power mode off. After initialization, these states will // changeable and low power mode off. After initialization, these states will
// be updated from the same handler thread. // 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 mRefreshRateChangeable = false;
private boolean mLowPowerModeEnabled = false; private boolean mLowPowerModeEnabled = false;
@@ -1341,7 +1345,8 @@ public class DisplayModeDirector {
pw.println(" BrightnessObserver"); pw.println(" BrightnessObserver");
pw.println(" mAmbientLux: " + mAmbientLux); pw.println(" mAmbientLux: " + mAmbientLux);
pw.println(" mBrightness: " + mBrightness); pw.println(" mBrightness: " + mBrightness);
pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); pw.println(" mDefaultDisplayState: " + mDefaultDisplayState);
pw.println(" mIsDeviceActive: " + mIsDeviceActive);
pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled);
pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable);
pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange);
@@ -1567,14 +1572,17 @@ public class DisplayModeDirector {
private void updateDefaultDisplayState() { private void updateDefaultDisplayState() {
Display display = mContext.getSystemService(DisplayManager.class) Display display = mContext.getSystemService(DisplayManager.class)
.getDisplay(Display.DEFAULT_DISPLAY); .getDisplay(Display.DEFAULT_DISPLAY);
boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; if (display == null) {
setDefaultDisplayState(defaultDisplayOn); return;
}
setDefaultDisplayState(display.getState());
} }
@VisibleForTesting @VisibleForTesting
public void setDefaultDisplayState(boolean on) { public void setDefaultDisplayState(int state) {
if (mDefaultDisplayOn != on) { if (mDefaultDisplayState != state) {
mDefaultDisplayOn = on; mDefaultDisplayState = state;
updateSensorStatus(); updateSensorStatus();
} }
} }
@@ -1595,15 +1603,19 @@ public class DisplayModeDirector {
} }
private boolean isDeviceActive() { private boolean isDeviceActive() {
return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); mIsDeviceActive = mInjector.isDeviceInteractive(mContext);
return (mDefaultDisplayState == Display.STATE_ON)
&& mIsDeviceActive;
} }
private final class LightSensorEventListener implements SensorEventListener { private final class LightSensorEventListener implements SensorEventListener {
final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS;
private float mLastSensorData; private float mLastSensorData;
private long mTimestamp;
public void dumpLocked(PrintWriter pw) { public void dumpLocked(PrintWriter pw) {
pw.println(" mLastSensorData: " + mLastSensorData); pw.println(" mLastSensorData: " + mLastSensorData);
pw.println(" mTimestamp: " + formatTimestamp(mTimestamp));
} }
@Override @Override
@@ -1627,6 +1639,7 @@ public class DisplayModeDirector {
} }
long now = SystemClock.uptimeMillis(); long now = SystemClock.uptimeMillis();
mTimestamp = System.currentTimeMillis();
if (mAmbientFilter != null) { if (mAmbientFilter != null) {
mAmbientFilter.addValue(now, mLastSensorData); mAmbientFilter.addValue(now, mLastSensorData);
} }
@@ -1653,6 +1666,12 @@ public class DisplayModeDirector {
mHandler.removeCallbacks(mInjectSensorEventRunnable); 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) { private void processSensorData(long now) {
if (mAmbientFilter != null) { if (mAmbientFilter != null) {
mAmbientLux = mAmbientFilter.getEstimate(now); mAmbientLux = mAmbientFilter.getEstimate(now);

View File

@@ -34,6 +34,7 @@ import static org.mockito.Mockito.any;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.mockito.internal.verification.VerificationModeFactory.times;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.content.ContentResolver; import android.content.ContentResolver;
@@ -410,7 +411,7 @@ public class DisplayModeDirectorTest {
createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
setPeakRefreshRate(90); setPeakRefreshRate(90);
director.getSettingsObserver().setDefaultRefreshRate(90); director.getSettingsObserver().setDefaultRefreshRate(90);
director.getBrightnessObserver().setDefaultDisplayState(true); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
final FakeDeviceConfig config = mInjector.getDeviceConfig(); final FakeDeviceConfig config = mInjector.getDeviceConfig();
config.setRefreshRateInLowZone(90); config.setRefreshRateInLowZone(90);
@@ -453,7 +454,7 @@ public class DisplayModeDirectorTest {
createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
setPeakRefreshRate(90 /*fps*/); setPeakRefreshRate(90 /*fps*/);
director.getSettingsObserver().setDefaultRefreshRate(90); director.getSettingsObserver().setDefaultRefreshRate(90);
director.getBrightnessObserver().setDefaultDisplayState(true); director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
final FakeDeviceConfig config = mInjector.getDeviceConfig(); final FakeDeviceConfig config = mInjector.getDeviceConfig();
config.setRefreshRateInHighZone(60); config.setRefreshRateInHighZone(60);
@@ -490,6 +491,43 @@ public class DisplayModeDirectorTest {
assertVoteForRefreshRateLocked(vote, 60 /*fps*/); 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) { private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) {
assertThat(vote).isNotNull(); assertThat(vote).isNotNull();
final DisplayModeDirector.RefreshRateRange expectedRange = final DisplayModeDirector.RefreshRateRange expectedRange =