diff options
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayModeDirector.java | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/display/utils/AmbientFilter.java (renamed from services/core/java/com/android/server/display/whitebalance/AmbientFilter.java) | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/display/utils/AmbientFilterFactory.java | 105 | ||||
| -rw-r--r-- | services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java | 40 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/display/utils/AmbientFilterTest.java (renamed from services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterTest.java) | 7 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java | 27 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java | 24 |
8 files changed, 160 insertions, 54 deletions
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 1fc0db3ff7cb..d24bd1aad1b1 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -49,8 +49,9 @@ import android.view.DisplayInfo; import com.android.internal.os.BackgroundThread; import com.android.internal.R; +import com.android.server.display.utils.AmbientFilter; +import com.android.server.display.utils.AmbientFilterFactory; import com.android.server.display.whitebalance.DisplayWhiteBalanceFactory; -import com.android.server.display.whitebalance.AmbientFilter; import java.io.PrintWriter; import java.util.ArrayList; @@ -970,7 +971,7 @@ public class DisplayModeDirector { if (lightSensor != null) { final Resources res = mContext.getResources(); - mAmbientFilter = DisplayWhiteBalanceFactory.createBrightnessFilter(res); + mAmbientFilter = AmbientFilterFactory.createBrightnessFilter(TAG, res); mLightSensor = lightSensor; onScreenOn(isDefaultDisplayOn()); diff --git a/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java b/services/core/java/com/android/server/display/utils/AmbientFilter.java index 35808974b9e4..1a8412180c27 100644 --- a/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java +++ b/services/core/java/com/android/server/display/utils/AmbientFilter.java @@ -14,13 +14,10 @@ * limitations under the License. */ -package com.android.server.display.whitebalance; +package com.android.server.display.utils; import android.util.Slog; -import com.android.internal.annotations.VisibleForTesting; -import com.android.server.display.utils.RollingBuffer; - import java.io.PrintWriter; import java.util.Arrays; diff --git a/services/core/java/com/android/server/display/utils/AmbientFilterFactory.java b/services/core/java/com/android/server/display/utils/AmbientFilterFactory.java new file mode 100644 index 000000000000..dfa1ddc67528 --- /dev/null +++ b/services/core/java/com/android/server/display/utils/AmbientFilterFactory.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.display.utils; + +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.util.TypedValue; + +public class AmbientFilterFactory { + /** + * Creates a temporal filter which functions as a weighted moving average buffer for recent + * sensor values. + * @param tag + * The tag used for dumping and logging. + * @param horizon + * How long ambient value changes are kept and taken into consideration. + * @param intercept + * Recent changes are prioritised by integrating their duration over y = x + intercept + * (the higher it is, the less prioritised recent changes are). + * + * @return + * An AmbientFiler. + * + * @throws IllegalArgumentException + * - Horizon is not positive. + * - Intercept not configured. + */ + public static AmbientFilter createAmbientFilter(String tag, int horizon, float intercept) { + if (!Float.isNaN(intercept)) { + return new AmbientFilter.WeightedMovingAverageAmbientFilter(tag, horizon, intercept); + } + throw new IllegalArgumentException("missing configurations: " + + "expected config_displayWhiteBalanceBrightnessFilterIntercept"); + } + + /** + * Helper to create a default BrightnessFilter which has configuration in the resource file. + * @param tag + * The tag used for dumping and logging. + * @param resources + * The resources used to configure the various components. + * + * @return + * An AmbientFilter. + */ + public static AmbientFilter createBrightnessFilter(String tag, Resources resources) { + final int horizon = resources.getInteger( + com.android.internal.R.integer.config_displayWhiteBalanceBrightnessFilterHorizon); + final float intercept = getFloat(resources, + com.android.internal.R.dimen.config_displayWhiteBalanceBrightnessFilterIntercept); + + return createAmbientFilter(tag, horizon, intercept); + } + + /** + * Helper to creates a default ColorTemperatureFilter which has configuration in the resource + * file. + * @param tag + * The tag used for dumping and logging. + * @param resources + * The resources used to configure the various components. + * + * @return + * An AmbientFilter. + */ + public static AmbientFilter createColorTemperatureFilter(String tag, Resources resources) { + final int horizon = resources.getInteger( + com.android.internal.R.integer + .config_displayWhiteBalanceColorTemperatureFilterHorizon); + final float intercept = getFloat(resources, + com.android.internal.R.dimen + .config_displayWhiteBalanceColorTemperatureFilterIntercept); + + return createAmbientFilter(tag, horizon, intercept); + } + + // Instantiation is disabled. + private AmbientFilterFactory() { } + + private static float getFloat(Resources resources, int id) { + TypedValue value = new TypedValue(); + + resources.getValue(id, value, true /* resolveRefs */); + if (value.type != TypedValue.TYPE_FLOAT) { + return Float.NaN; + } + + return value.getFloat(); + } +} + diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java index 02ec10e2d49d..c2e5614b887e 100644 --- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java +++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java @@ -24,6 +24,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal; +import com.android.server.display.utils.AmbientFilter; import com.android.server.display.utils.History; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java index bf0a1d16219d..a72b1ed8f3ec 100644 --- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java +++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java @@ -23,6 +23,8 @@ import android.os.Handler; import android.util.TypedValue; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.display.utils.AmbientFilter; +import com.android.server.display.utils.AmbientFilterFactory; /** * The DisplayWhiteBalanceFactory creates and configures an DisplayWhiteBalanceController. @@ -58,10 +60,12 @@ public class DisplayWhiteBalanceFactory { SensorManager sensorManager, Resources resources) { final AmbientSensor.AmbientBrightnessSensor brightnessSensor = createBrightnessSensor(handler, sensorManager, resources); - final AmbientFilter brightnessFilter = createBrightnessFilter(resources); + final AmbientFilter brightnessFilter = + AmbientFilterFactory.createBrightnessFilter(BRIGHTNESS_FILTER_TAG, resources); final AmbientSensor.AmbientColorTemperatureSensor colorTemperatureSensor = createColorTemperatureSensor(handler, sensorManager, resources); - final AmbientFilter colorTemperatureFilter = createColorTemperatureFilter(resources); + final AmbientFilter colorTemperatureFilter = AmbientFilterFactory + .createColorTemperatureFilter(COLOR_TEMPERATURE_FILTER_TAG, resources); final DisplayWhiteBalanceThrottler throttler = createThrottler(resources); final float[] displayWhiteBalanceLowLightAmbientBrightnesses = getFloatArray(resources, com.android.internal.R.array @@ -112,23 +116,6 @@ public class DisplayWhiteBalanceFactory { } /** - * Creates a BrightnessFilter which functions as a weighted moving average buffer for recent - * brightness values. - */ - public static AmbientFilter createBrightnessFilter(Resources resources) { - final int horizon = resources.getInteger( - com.android.internal.R.integer.config_displayWhiteBalanceBrightnessFilterHorizon); - final float intercept = getFloat(resources, - com.android.internal.R.dimen.config_displayWhiteBalanceBrightnessFilterIntercept); - if (!Float.isNaN(intercept)) { - return new AmbientFilter.WeightedMovingAverageAmbientFilter( - BRIGHTNESS_FILTER_TAG, horizon, intercept); - } - throw new IllegalArgumentException("missing configurations: " - + "expected config_displayWhiteBalanceBrightnessFilterIntercept"); - } - - /** * Creates an ambient color sensor instance to redirect sensor data to callbacks. */ @VisibleForTesting @@ -143,21 +130,6 @@ public class DisplayWhiteBalanceFactory { return new AmbientSensor.AmbientColorTemperatureSensor(handler, sensorManager, name, rate); } - private static AmbientFilter createColorTemperatureFilter(Resources resources) { - final int horizon = resources.getInteger( - com.android.internal.R.integer - .config_displayWhiteBalanceColorTemperatureFilterHorizon); - final float intercept = getFloat(resources, - com.android.internal.R.dimen - .config_displayWhiteBalanceColorTemperatureFilterIntercept); - if (!Float.isNaN(intercept)) { - return new AmbientFilter.WeightedMovingAverageAmbientFilter( - COLOR_TEMPERATURE_FILTER_TAG, horizon, intercept); - } - throw new IllegalArgumentException("missing configurations: " - + "expected config_displayWhiteBalanceColorTemperatureFilterIntercept"); - } - private static DisplayWhiteBalanceThrottler createThrottler(Resources resources) { final int increaseDebounce = resources.getInteger( com.android.internal.R.integer.config_displayWhiteBalanceDecreaseDebounce); diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterTest.java b/services/tests/servicestests/src/com/android/server/display/utils/AmbientFilterTest.java index 78164939aa49..9b76b13d2ede 100644 --- a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterTest.java +++ b/services/tests/servicestests/src/com/android/server/display/utils/AmbientFilterTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.display.whitebalance; +package com.android.server.display.utils; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -38,6 +38,7 @@ import org.junit.runners.JUnit4; public final class AmbientFilterTest { private ContextWrapper mContextSpy; private Resources mResourcesSpy; + private static String TAG = "AmbientFilterTest"; @Before public void setUp() throws Exception { @@ -54,7 +55,7 @@ public final class AmbientFilterTest { final int prediction_time = 100; // Hardcoded in AmbientFilter: prediction of how long the // latest prediction will last before a new prediction. setMockValues(mResourcesSpy, horizon, intercept); - AmbientFilter filter = DisplayWhiteBalanceFactory.createBrightnessFilter(mResourcesSpy); + AmbientFilter filter = AmbientFilterFactory.createBrightnessFilter(TAG, mResourcesSpy); // Add first value and verify filter.addValue(time_start, 30); @@ -85,7 +86,7 @@ public final class AmbientFilterTest { final int prediction_time = 100; setMockValues(mResourcesSpy, horizon, intercept); - AmbientFilter filter = DisplayWhiteBalanceFactory.createBrightnessFilter(mResourcesSpy); + AmbientFilter filter = AmbientFilterFactory.createBrightnessFilter(TAG, mResourcesSpy); // Add first value and verify filter.addValue(time_start, 30); diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java new file mode 100644 index 000000000000..4d2551087c59 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterStubber.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.display.utils; + +public class AmbientFilterStubber extends AmbientFilter { + public AmbientFilterStubber() { + super(null, 1); + } + + protected float filter(long time, RollingBuffer buffer) { + return 0f; + } +} diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java index 6b0798bdce22..0d5a7d6c1952 100644 --- a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java +++ b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java @@ -17,6 +17,8 @@ package com.android.server.display.whitebalance; import com.android.internal.R; +import com.android.server.display.utils.AmbientFilter; +import com.android.server.display.utils.AmbientFilterStubber; import com.google.common.collect.ImmutableList; import static org.junit.Assert.assertEquals; @@ -132,7 +134,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { setEstimatedBrightnessAndUpdate(controller, luxOverride); @@ -152,7 +154,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float t = 0.0f; t <= 1.0f; t += 0.1f) { setEstimatedBrightnessAndUpdate(controller, @@ -184,7 +186,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float t = 0.0f; t <= 1.0f; t += 0.1f) { float luxOverride = mix(brightness0, brightness1, t); @@ -221,7 +223,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); setEstimatedBrightnessAndUpdate(controller, 0.0f); assertEquals(controller.mPendingAmbientColorTemperature, @@ -240,7 +242,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { setEstimatedBrightnessAndUpdate(controller, luxOverride); @@ -258,7 +260,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { setEstimatedBrightnessAndUpdate(controller, luxOverride); @@ -278,7 +280,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float t = 0.0f; t <= 1.0f; t += 0.1f) { setEstimatedBrightnessAndUpdate(controller, @@ -311,7 +313,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 6000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float t = 0.0f; t <= 1.0f; t += 0.1f) { float luxOverride = mix(brightness0, brightness1, t); @@ -350,7 +352,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = 8000.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { setEstimatedBrightnessAndUpdate(controller, luxOverride); @@ -370,7 +372,7 @@ public final class AmbientLuxTest { DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); final float ambientColorTemperature = -1.0f; setEstimatedColorTemperature(controller, ambientColorTemperature); - controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + controller.mBrightnessFilter = spy(new AmbientFilterStubber()); for (float t = 0.0f; t <= 1.0f; t += 0.1f) { setEstimatedBrightnessAndUpdate(controller, @@ -426,7 +428,7 @@ public final class AmbientLuxTest { private void setEstimatedColorTemperature(DisplayWhiteBalanceController controller, float ambientColorTemperature) { - AmbientFilter colorTemperatureFilter = spy(controller.mColorTemperatureFilter); + AmbientFilter colorTemperatureFilter = spy(new AmbientFilterStubber()); controller.mColorTemperatureFilter = colorTemperatureFilter; when(colorTemperatureFilter.getEstimate(anyLong())).thenReturn(ambientColorTemperature); } |