diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java index 905c7e371294e..407fad0c9fe88 100644 --- a/services/core/java/com/android/server/display/BrightnessTracker.java +++ b/services/core/java/com/android/server/display/BrightnessTracker.java @@ -282,13 +282,14 @@ public class BrightnessTracker { } Message m = mBgHandler.obtainMessage(MSG_BRIGHTNESS_CHANGED, userInitiated ? 1 : 0, 0 /*unused*/, new BrightnessChangeValues(brightness, - powerBrightnessFactor, isUserSetBrightness, isDefaultBrightnessConfig)); + powerBrightnessFactor, isUserSetBrightness, isDefaultBrightnessConfig, + mInjector.currentTimeMillis())); m.sendToTarget(); } private void handleBrightnessChanged(float brightness, boolean userInitiated, float powerBrightnessFactor, boolean isUserSetBrightness, - boolean isDefaultBrightnessConfig) { + boolean isDefaultBrightnessConfig, long timestamp) { BrightnessChangeEvent.Builder builder; synchronized (mDataCollectionLock) { @@ -309,7 +310,7 @@ public class BrightnessTracker { builder = new BrightnessChangeEvent.Builder(); builder.setBrightness(brightness); - builder.setTimeStamp(mInjector.currentTimeMillis()); + builder.setTimeStamp(timestamp); builder.setPowerBrightnessFactor(powerBrightnessFactor); builder.setUserBrightnessPoint(isUserSetBrightness); builder.setIsDefaultBrightnessConfig(isDefaultBrightnessConfig); @@ -813,7 +814,7 @@ public class BrightnessTracker { boolean userInitiatedChange = (msg.arg1 == 1); handleBrightnessChanged(values.brightness, userInitiatedChange, values.powerBrightnessFactor, values.isUserSetBrightness, - values.isDefaultBrightnessConfig); + values.isDefaultBrightnessConfig, values.timestamp); break; case MSG_START_SENSOR_LISTENER: startSensorListener(); @@ -830,13 +831,16 @@ public class BrightnessTracker { final float powerBrightnessFactor; final boolean isUserSetBrightness; final boolean isDefaultBrightnessConfig; + final long timestamp; BrightnessChangeValues(float brightness, float powerBrightnessFactor, - boolean isUserSetBrightness, boolean isDefaultBrightnessConfig) { + boolean isUserSetBrightness, boolean isDefaultBrightnessConfig, + long timestamp) { this.brightness = brightness; this.powerBrightnessFactor = powerBrightnessFactor; this.isUserSetBrightness = isUserSetBrightness; this.isDefaultBrightnessConfig = isDefaultBrightnessConfig; + this.timestamp = timestamp; } } diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java index 45bee6e89ddb7..75dc96f13da42 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import android.app.ActivityManager; import android.content.BroadcastReceiver; @@ -63,6 +64,7 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @SmallTest @@ -447,7 +449,7 @@ public class BrightnessTrackerTest { final long secondSensorTime = mInjector.currentTimeMillis(); mInjector.incrementTime(TimeUnit.SECONDS.toMillis(3)); notifyBrightnessChanged(mTracker, brightness, true /*userInitiated*/, - 0.5f /*powerPolicyDim(*/, true /*hasUserBrightnessPoints*/, + 0.5f /*powerBrightnessFactor*/, true /*hasUserBrightnessPoints*/, false /*isDefaultBrightnessConfig*/); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mTracker.writeEventsLocked(baos); @@ -586,6 +588,48 @@ public class BrightnessTrackerTest { assertTrue(slice.getList().isEmpty()); } + @Test + public void testBackgroundHandlerDelay() { + final int brightness = 20; + + // Setup tracker. + startTracker(mTracker); + mInjector.mSensorListener.onSensorChanged(createSensorEvent(1.0f)); + mInjector.incrementTime(TimeUnit.SECONDS.toMillis(2)); + + // Block handler from running. + final CountDownLatch latch = new CountDownLatch(1); + mInjector.mHandler.post( + () -> { + try { + latch.await(); + } catch (InterruptedException e) { + fail(e.getMessage()); + } + }); + + // Send an event. + long eventTime = mInjector.currentTimeMillis(); + mTracker.notifyBrightnessChanged(brightness, true /*userInitiated*/, + 1.0f /*powerBrightnessFactor*/, false /*isUserSetBrightness*/, + false /*isDefaultBrightnessConfig*/); + + // Time passes before handler can run. + mInjector.incrementTime(TimeUnit.SECONDS.toMillis(2)); + + // Let the handler run. + latch.countDown(); + mInjector.waitForHandler(); + + List events = mTracker.getEvents(0, true).getList(); + mTracker.stop(); + + // Check event was recorded with time it was sent rather than handler ran. + assertEquals(1, events.size()); + BrightnessChangeEvent event = events.get(0); + assertEquals(eventTime, event.timeStamp); + } + private InputStream getInputStream(String data) { return new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8)); }