Merge "DisplayConfig: Add flag-protected option to select Fusion Proximity sensor." into main
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 61ecb93..70668cb 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -2139,7 +2139,7 @@
                 mAmbientLightSensor = SensorData.loadAmbientLightSensorConfig(config,
                         mContext.getResources());
                 mScreenOffBrightnessSensor = SensorData.loadScreenOffBrightnessSensorConfig(config);
-                mProximitySensor = SensorData.loadProxSensorConfig(config);
+                mProximitySensor = SensorData.loadProxSensorConfig(mFlags, config);
                 mTempSensor = SensorData.loadTempSensorConfig(mFlags, config);
                 loadAmbientHorizonFromDdc(config);
                 loadBrightnessChangeThresholds(config);
diff --git a/services/core/java/com/android/server/display/config/SensorData.java b/services/core/java/com/android/server/display/config/SensorData.java
index 8e716f8..6ad13c3 100644
--- a/services/core/java/com/android/server/display/config/SensorData.java
+++ b/services/core/java/com/android/server/display/config/SensorData.java
@@ -129,21 +129,46 @@
      * Loads proximity sensor data from DisplayConfiguration
      */
     @Nullable
-    public static SensorData loadProxSensorConfig(DisplayConfiguration config) {
-        SensorDetails sensorDetails = config.getProxSensor();
-        if (sensorDetails != null) {
-            String name = sensorDetails.getName();
-            String type = sensorDetails.getType();
-            if ("".equals(name) && "".equals(type)) {
+    public static SensorData loadProxSensorConfig(
+            DisplayManagerFlags flags, DisplayConfiguration config) {
+        SensorData DEFAULT_SENSOR = new SensorData();
+        List<SensorDetails> sensorDetailsList = config.getProxSensor();
+        if (sensorDetailsList.isEmpty()) {
+            return DEFAULT_SENSOR;
+        }
+
+        SensorData selectedSensor = DEFAULT_SENSOR;
+        // Prioritize flagged sensors.
+        for (SensorDetails sensorDetails : sensorDetailsList) {
+            String flagStr = sensorDetails.getFeatureFlag();
+            if (flags.isUseFusionProxSensorEnabled() &&
+                flags.getUseFusionProxSensorFlagName().equals(flagStr)) {
+                selectedSensor = loadSensorData(sensorDetails);
+                break;
+            }
+        }
+
+        // Check for normal un-flagged sensor if a flagged one wasn't found.
+        if (DEFAULT_SENSOR == selectedSensor) {
+            for (SensorDetails sensorDetails : sensorDetailsList) {
+                if (sensorDetails.getFeatureFlag() != null) {
+                    continue;
+                }
+                selectedSensor = loadSensorData(sensorDetails);
+                break;
+            }
+        }
+
+        // Check if we shouldn't use a sensor at all.
+        if (DEFAULT_SENSOR != selectedSensor) {
+            if ("".equals(selectedSensor.name) && "".equals(selectedSensor.type)) {
                 // <proxSensor> with empty values to the config means no sensor should be used.
                 // See also {@link com.android.server.display.utils.SensorUtils}
-                return null;
-            } else {
-                return loadSensorData(sensorDetails);
+                selectedSensor = null;
             }
-        } else {
-            return new SensorData();
         }
+
+        return selectedSensor;
     }
 
     /**
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index 81f824e..50b1464 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -144,12 +144,15 @@
             Flags::idleScreenRefreshRateTimeout
     );
 
-
     private final FlagState mRefactorDisplayPowerController = new FlagState(
             Flags.FLAG_REFACTOR_DISPLAY_POWER_CONTROLLER,
             Flags::refactorDisplayPowerController
     );
 
+    private final FlagState mUseFusionProxSensor = new FlagState(
+            Flags.FLAG_USE_FUSION_PROX_SENSOR,
+            Flags::useFusionProxSensor
+    );
 
     /**
      * @return {@code true} if 'port' is allowed in display layout configuration file.
@@ -301,6 +304,14 @@
         return mRefactorDisplayPowerController.isEnabled();
     }
 
+    public boolean isUseFusionProxSensorEnabled() {
+        return mUseFusionProxSensor.isEnabled();
+    }
+
+    public String getUseFusionProxSensorFlagName() {
+        return mUseFusionProxSensor.getName();
+    }
+
     /**
      * dumps all flagstates
      * @param pw printWriter
@@ -331,6 +342,7 @@
         pw.println(" " + mIdleScreenRefreshRateTimeout);
         pw.println(" " + mRefactorDisplayPowerController);
         pw.println(" " + mResolutionBackupRestore);
+        pw.println(" " + mUseFusionProxSensor);
     }
 
     private static class FlagState {
@@ -346,6 +358,10 @@
             mFlagFunction = flagFunction;
         }
 
+        private String getName() {
+            return mName;
+        }
+
         private boolean isEnabled() {
             if (mEnabledSet) {
                 if (DEBUG) {
diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig
index 49a8553..d4319cc 100644
--- a/services/core/java/com/android/server/display/feature/display_flags.aconfig
+++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig
@@ -235,3 +235,11 @@
     bug: "310026579"
     is_fixed_read_only: true
 }
+
+flag {
+    name: "use_fusion_prox_sensor"
+    namespace: "display_manager"
+    description: "Feature flag to control usage of a Fusion Proximity sensor if configued."
+    bug: "306203895"
+    is_fixed_read_only: true
+}
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index 755a7f8..8598023 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -114,7 +114,7 @@
                 <xs:element type="sensorDetails" name="screenOffBrightnessSensor">
                     <xs:annotation name="final"/>
                 </xs:element>
-                <xs:element type="sensorDetails" name="proxSensor">
+                <xs:element type="sensorDetails" name="proxSensor" maxOccurs="2">
                     <xs:annotation name="final"/>
                 </xs:element>
                 <xs:element type="sensorDetails" name="tempSensor">
@@ -478,6 +478,7 @@
     </xs:simpleType>
 
     <xs:complexType name="sensorDetails">
+        <xs:attribute name="featureFlag" type="xs:string" use="optional"/>
         <xs:sequence>
             <xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1">
                 <xs:annotation name="nullable"/>
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index 4fa77d9..4ce4cc3 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -117,7 +117,7 @@
     method public com.android.server.display.config.LuxThrottling getLuxThrottling();
     method @Nullable public final String getName();
     method public com.android.server.display.config.PowerThrottlingConfig getPowerThrottlingConfig();
-    method public final com.android.server.display.config.SensorDetails getProxSensor();
+    method public final java.util.List<com.android.server.display.config.SensorDetails> getProxSensor();
     method public com.android.server.display.config.DisplayQuirks getQuirks();
     method public com.android.server.display.config.RefreshRateConfigs getRefreshRate();
     method public final java.math.BigDecimal getScreenBrightnessCapForWearBedtimeMode();
@@ -154,7 +154,6 @@
     method public void setLuxThrottling(com.android.server.display.config.LuxThrottling);
     method public final void setName(@Nullable String);
     method public void setPowerThrottlingConfig(com.android.server.display.config.PowerThrottlingConfig);
-    method public final void setProxSensor(com.android.server.display.config.SensorDetails);
     method public void setQuirks(com.android.server.display.config.DisplayQuirks);
     method public void setRefreshRate(com.android.server.display.config.RefreshRateConfigs);
     method public final void setScreenBrightnessCapForWearBedtimeMode(java.math.BigDecimal);
@@ -405,10 +404,12 @@
 
   public class SensorDetails {
     ctor public SensorDetails();
+    method public String getFeatureFlag();
     method @Nullable public final String getName();
     method @Nullable public final com.android.server.display.config.RefreshRateRange getRefreshRate();
     method @Nullable public final com.android.server.display.config.NonNegativeFloatToFloatMap getSupportedModes();
     method @Nullable public final String getType();
+    method public void setFeatureFlag(String);
     method public final void setName(@Nullable String);
     method public final void setRefreshRate(@Nullable com.android.server.display.config.RefreshRateRange);
     method public final void setSupportedModes(@Nullable com.android.server.display.config.NonNegativeFloatToFloatMap);