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);
     }