Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6c764c7 authored by Chris Kuiper's avatar Chris Kuiper
Browse files

DisplayConfig: Add flag-protected option to select Fusion Proximity sensor.

This adds to capability to add a second Proximity Sensor
configuration that is selected based on an aconfig flag.

In detail:

1) Adds a new flag "useFusionProxSensor" that controls whether or not
   to use a Fusion Proximity sensor if configured.

2) Adds a new attribute "featureFlag" to the sensorDetails XML
   element that marks the element to be used if a corresponding
   aconfig flag is set.

3) Allows up to two "proxSensor" elements to be given instead of one.
   This allows to provide two different Proximity sensor
   configurations, one to be used if both the useFusionProxSensor
   flag and featureFlag attribute are set and matching, and another
   if not.

Bug: 306203895
Test: Pushing different XML config files, confirming via dumpsys and
      manual testing.

Change-Id: Icb7a1c93d38385b48ba27d9747cae9cd36c4dc03
parent f5a43e55
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -2140,7 +2140,7 @@ public class DisplayDeviceConfig {
                mAmbientLightSensor = SensorData.loadAmbientLightSensorConfig(config,
                mAmbientLightSensor = SensorData.loadAmbientLightSensorConfig(config,
                        mContext.getResources());
                        mContext.getResources());
                mScreenOffBrightnessSensor = SensorData.loadScreenOffBrightnessSensorConfig(config);
                mScreenOffBrightnessSensor = SensorData.loadScreenOffBrightnessSensorConfig(config);
                mProximitySensor = SensorData.loadProxSensorConfig(config);
                mProximitySensor = SensorData.loadProxSensorConfig(mFlags, config);
                mTempSensor = SensorData.loadTempSensorConfig(mFlags, config);
                mTempSensor = SensorData.loadTempSensorConfig(mFlags, config);
                loadAmbientHorizonFromDdc(config);
                loadAmbientHorizonFromDdc(config);
                loadBrightnessChangeThresholds(config);
                loadBrightnessChangeThresholds(config);
+36 −11
Original line number Original line Diff line number Diff line
@@ -129,21 +129,46 @@ public class SensorData {
     * Loads proximity sensor data from DisplayConfiguration
     * Loads proximity sensor data from DisplayConfiguration
     */
     */
    @Nullable
    @Nullable
    public static SensorData loadProxSensorConfig(DisplayConfiguration config) {
    public static SensorData loadProxSensorConfig(
        SensorDetails sensorDetails = config.getProxSensor();
            DisplayManagerFlags flags, DisplayConfiguration config) {
        if (sensorDetails != null) {
        SensorData DEFAULT_SENSOR = new SensorData();
            String name = sensorDetails.getName();
        List<SensorDetails> sensorDetailsList = config.getProxSensor();
            String type = sensorDetails.getType();
        if (sensorDetailsList.isEmpty()) {
            if ("".equals(name) && "".equals(type)) {
            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.
                // <proxSensor> with empty values to the config means no sensor should be used.
                // See also {@link com.android.server.display.utils.SensorUtils}
                // See also {@link com.android.server.display.utils.SensorUtils}
                return null;
                selectedSensor = null;
            } else {
                return loadSensorData(sensorDetails);
            }
            }
        } else {
            return new SensorData();
        }
        }

        return selectedSensor;
    }
    }


    /**
    /**
+17 −1
Original line number Original line Diff line number Diff line
@@ -144,12 +144,15 @@ public class DisplayManagerFlags {
            Flags::idleScreenRefreshRateTimeout
            Flags::idleScreenRefreshRateTimeout
    );
    );



    private final FlagState mRefactorDisplayPowerController = new FlagState(
    private final FlagState mRefactorDisplayPowerController = new FlagState(
            Flags.FLAG_REFACTOR_DISPLAY_POWER_CONTROLLER,
            Flags.FLAG_REFACTOR_DISPLAY_POWER_CONTROLLER,
            Flags::refactorDisplayPowerController
            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.
     * @return {@code true} if 'port' is allowed in display layout configuration file.
@@ -301,6 +304,14 @@ public class DisplayManagerFlags {
        return mRefactorDisplayPowerController.isEnabled();
        return mRefactorDisplayPowerController.isEnabled();
    }
    }


    public boolean isUseFusionProxSensorEnabled() {
        return mUseFusionProxSensor.isEnabled();
    }

    public String getUseFusionProxSensorFlagName() {
        return mUseFusionProxSensor.getName();
    }

    /**
    /**
     * dumps all flagstates
     * dumps all flagstates
     * @param pw printWriter
     * @param pw printWriter
@@ -331,6 +342,7 @@ public class DisplayManagerFlags {
        pw.println(" " + mIdleScreenRefreshRateTimeout);
        pw.println(" " + mIdleScreenRefreshRateTimeout);
        pw.println(" " + mRefactorDisplayPowerController);
        pw.println(" " + mRefactorDisplayPowerController);
        pw.println(" " + mResolutionBackupRestore);
        pw.println(" " + mResolutionBackupRestore);
        pw.println(" " + mUseFusionProxSensor);
    }
    }


    private static class FlagState {
    private static class FlagState {
@@ -346,6 +358,10 @@ public class DisplayManagerFlags {
            mFlagFunction = flagFunction;
            mFlagFunction = flagFunction;
        }
        }


        private String getName() {
            return mName;
        }

        private boolean isEnabled() {
        private boolean isEnabled() {
            if (mEnabledSet) {
            if (mEnabledSet) {
                if (DEBUG) {
                if (DEBUG) {
+8 −0
Original line number Original line Diff line number Diff line
@@ -235,3 +235,11 @@ flag {
    bug: "310026579"
    bug: "310026579"
    is_fixed_read_only: true
    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
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -114,7 +114,7 @@
                <xs:element type="sensorDetails" name="screenOffBrightnessSensor">
                <xs:element type="sensorDetails" name="screenOffBrightnessSensor">
                    <xs:annotation name="final"/>
                    <xs:annotation name="final"/>
                </xs:element>
                </xs:element>
                <xs:element type="sensorDetails" name="proxSensor">
                <xs:element type="sensorDetails" name="proxSensor" maxOccurs="2">
                    <xs:annotation name="final"/>
                    <xs:annotation name="final"/>
                </xs:element>
                </xs:element>
                <xs:element type="sensorDetails" name="tempSensor">
                <xs:element type="sensorDetails" name="tempSensor">
@@ -478,6 +478,7 @@
    </xs:simpleType>
    </xs:simpleType>


    <xs:complexType name="sensorDetails">
    <xs:complexType name="sensorDetails">
        <xs:attribute name="featureFlag" type="xs:string" use="optional"/>
        <xs:sequence>
        <xs:sequence>
            <xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1">
            <xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1">
                <xs:annotation name="nullable"/>
                <xs:annotation name="nullable"/>
Loading