Move AmbientFilter from whitebalance to utils
AmbientFilter is now used not only by whitebalance but also by DisplayModeDirector.
Bug: 137368719
Exempt-From-Owner-Approval: Santos is designated by Michael
Test: atest AmbientLuxTest AmbientSensorTest
Change-Id: Ib377be5cc7ccbae25607d37a7de93d6564c0d184
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
index 1fc0db3..d24bd1a 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 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 @@
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
similarity index 97%
rename from services/core/java/com/android/server/display/whitebalance/AmbientFilter.java
rename to services/core/java/com/android/server/display/utils/AmbientFilter.java
index 3580897..1a84121 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 0000000..dfa1ddc
--- /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 02ec10e..c2e5614 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.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 bf0a1d1..a72b1ed 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.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 @@
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 @@
}
/**
- * 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 @@
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
similarity index 94%
rename from services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientFilterTest.java
rename to services/tests/servicestests/src/com/android/server/display/utils/AmbientFilterTest.java
index 7816493..9b76b13 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 @@
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 @@
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 @@
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 0000000..4d25510
--- /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 6b0798b..0d5a7d6 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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);
}