// Signature format: 2.0
package com.android.server.display.config {

  public class AutoBrightness {
    ctor public AutoBrightness();
    method public final java.math.BigInteger getBrighteningLightDebounceMillis();
    method public final java.math.BigInteger getDarkeningLightDebounceMillis();
    method public final com.android.server.display.config.DisplayBrightnessMapping getDisplayBrightnessMapping();
    method public final void setBrighteningLightDebounceMillis(java.math.BigInteger);
    method public final void setDarkeningLightDebounceMillis(java.math.BigInteger);
    method public final void setDisplayBrightnessMapping(com.android.server.display.config.DisplayBrightnessMapping);
  }

  public class BrightnessThresholds {
    ctor public BrightnessThresholds();
    method @NonNull public final java.math.BigDecimal getMinimum();
    method public final void setMinimum(@NonNull java.math.BigDecimal);
  }

  public class BrightnessThrottlingMap {
    ctor public BrightnessThrottlingMap();
    method @NonNull public final java.util.List<com.android.server.display.config.BrightnessThrottlingPoint> getBrightnessThrottlingPoint();
  }

  public class BrightnessThrottlingPoint {
    ctor public BrightnessThrottlingPoint();
    method @NonNull public final java.math.BigDecimal getBrightness();
    method @NonNull public final com.android.server.display.config.ThermalStatus getThermalStatus();
    method public final void setBrightness(@NonNull java.math.BigDecimal);
    method public final void setThermalStatus(@NonNull com.android.server.display.config.ThermalStatus);
  }

  public class Density {
    ctor public Density();
    method @NonNull public final java.math.BigInteger getDensity();
    method @NonNull public final java.math.BigInteger getHeight();
    method @NonNull public final java.math.BigInteger getWidth();
    method public final void setDensity(@NonNull java.math.BigInteger);
    method public final void setHeight(@NonNull java.math.BigInteger);
    method public final void setWidth(@NonNull java.math.BigInteger);
  }

  public class DensityMapping {
    ctor public DensityMapping();
    method public java.util.List<com.android.server.display.config.Density> getDensity();
  }

  public class DisplayBrightnessMapping {
    ctor public DisplayBrightnessMapping();
    method public final java.util.List<com.android.server.display.config.DisplayBrightnessPoint> getDisplayBrightnessPoint();
  }

  public class DisplayBrightnessPoint {
    ctor public DisplayBrightnessPoint();
    method public final java.math.BigInteger getLux();
    method public final java.math.BigDecimal getNits();
    method public final void setLux(java.math.BigInteger);
    method public final void setNits(java.math.BigDecimal);
  }

  public class DisplayConfiguration {
    ctor public DisplayConfiguration();
    method @NonNull public final com.android.server.display.config.Thresholds getAmbientBrightnessChangeThresholds();
    method public final java.math.BigInteger getAmbientLightHorizonLong();
    method public final java.math.BigInteger getAmbientLightHorizonShort();
    method public com.android.server.display.config.AutoBrightness getAutoBrightness();
    method @Nullable public final com.android.server.display.config.DensityMapping getDensityMapping();
    method @NonNull public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholds();
    method public com.android.server.display.config.HighBrightnessMode getHighBrightnessMode();
    method public final com.android.server.display.config.SensorDetails getLightSensor();
    method public final com.android.server.display.config.SensorDetails getProxSensor();
    method public com.android.server.display.config.DisplayQuirks getQuirks();
    method @NonNull public final java.math.BigDecimal getScreenBrightnessDefault();
    method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap();
    method public final java.math.BigInteger getScreenBrightnessRampDecreaseMaxMillis();
    method public final java.math.BigDecimal getScreenBrightnessRampFastDecrease();
    method public final java.math.BigDecimal getScreenBrightnessRampFastIncrease();
    method public final java.math.BigInteger getScreenBrightnessRampIncreaseMaxMillis();
    method public final java.math.BigDecimal getScreenBrightnessRampSlowDecrease();
    method public final java.math.BigDecimal getScreenBrightnessRampSlowIncrease();
    method @NonNull public final com.android.server.display.config.ThermalThrottling getThermalThrottling();
    method public final void setAmbientBrightnessChangeThresholds(@NonNull com.android.server.display.config.Thresholds);
    method public final void setAmbientLightHorizonLong(java.math.BigInteger);
    method public final void setAmbientLightHorizonShort(java.math.BigInteger);
    method public void setAutoBrightness(com.android.server.display.config.AutoBrightness);
    method public final void setDensityMapping(@Nullable com.android.server.display.config.DensityMapping);
    method public final void setDisplayBrightnessChangeThresholds(@NonNull com.android.server.display.config.Thresholds);
    method public void setHighBrightnessMode(com.android.server.display.config.HighBrightnessMode);
    method public final void setLightSensor(com.android.server.display.config.SensorDetails);
    method public final void setProxSensor(com.android.server.display.config.SensorDetails);
    method public void setQuirks(com.android.server.display.config.DisplayQuirks);
    method public final void setScreenBrightnessDefault(@NonNull java.math.BigDecimal);
    method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap);
    method public final void setScreenBrightnessRampDecreaseMaxMillis(java.math.BigInteger);
    method public final void setScreenBrightnessRampFastDecrease(java.math.BigDecimal);
    method public final void setScreenBrightnessRampFastIncrease(java.math.BigDecimal);
    method public final void setScreenBrightnessRampIncreaseMaxMillis(java.math.BigInteger);
    method public final void setScreenBrightnessRampSlowDecrease(java.math.BigDecimal);
    method public final void setScreenBrightnessRampSlowIncrease(java.math.BigDecimal);
    method public final void setThermalThrottling(@NonNull com.android.server.display.config.ThermalThrottling);
  }

  public class DisplayQuirks {
    ctor public DisplayQuirks();
    method public java.util.List<java.lang.String> getQuirk();
  }

  public class HbmTiming {
    ctor public HbmTiming();
    method @NonNull public final java.math.BigInteger getTimeMaxSecs_all();
    method @NonNull public final java.math.BigInteger getTimeMinSecs_all();
    method @NonNull public final java.math.BigInteger getTimeWindowSecs_all();
    method public final void setTimeMaxSecs_all(@NonNull java.math.BigInteger);
    method public final void setTimeMinSecs_all(@NonNull java.math.BigInteger);
    method public final void setTimeWindowSecs_all(@NonNull java.math.BigInteger);
  }

  public class HighBrightnessMode {
    ctor public HighBrightnessMode();
    method @NonNull public final boolean getAllowInLowPowerMode_all();
    method public boolean getEnabled();
    method @Nullable public final java.math.BigDecimal getMinimumHdrPercentOfScreen_all();
    method @NonNull public final java.math.BigDecimal getMinimumLux_all();
    method @Nullable public final com.android.server.display.config.RefreshRateRange getRefreshRate_all();
    method @Nullable public final com.android.server.display.config.SdrHdrRatioMap getSdrHdrRatioMap_all();
    method @NonNull public final com.android.server.display.config.ThermalStatus getThermalStatusLimit_all();
    method public com.android.server.display.config.HbmTiming getTiming_all();
    method @NonNull public final java.math.BigDecimal getTransitionPoint_all();
    method public final void setAllowInLowPowerMode_all(@NonNull boolean);
    method public void setEnabled(boolean);
    method public final void setMinimumHdrPercentOfScreen_all(@Nullable java.math.BigDecimal);
    method public final void setMinimumLux_all(@NonNull java.math.BigDecimal);
    method public final void setRefreshRate_all(@Nullable com.android.server.display.config.RefreshRateRange);
    method public final void setSdrHdrRatioMap_all(@Nullable com.android.server.display.config.SdrHdrRatioMap);
    method public final void setThermalStatusLimit_all(@NonNull com.android.server.display.config.ThermalStatus);
    method public void setTiming_all(com.android.server.display.config.HbmTiming);
    method public final void setTransitionPoint_all(@NonNull java.math.BigDecimal);
  }

  public class NitsMap {
    ctor public NitsMap();
    method public String getInterpolation();
    method @NonNull public final java.util.List<com.android.server.display.config.Point> getPoint();
    method public void setInterpolation(String);
  }

  public class Point {
    ctor public Point();
    method @NonNull public final java.math.BigDecimal getNits();
    method @NonNull public final java.math.BigDecimal getValue();
    method public final void setNits(@NonNull java.math.BigDecimal);
    method public final void setValue(@NonNull java.math.BigDecimal);
  }

  public class RefreshRateRange {
    ctor public RefreshRateRange();
    method public final java.math.BigInteger getMaximum();
    method public final java.math.BigInteger getMinimum();
    method public final void setMaximum(java.math.BigInteger);
    method public final void setMinimum(java.math.BigInteger);
  }

  public class SdrHdrRatioMap {
    ctor public SdrHdrRatioMap();
    method @NonNull public final java.util.List<com.android.server.display.config.SdrHdrRatioPoint> getPoint();
  }

  public class SdrHdrRatioPoint {
    ctor public SdrHdrRatioPoint();
    method @NonNull public final java.math.BigDecimal getHdrRatio();
    method @NonNull public final java.math.BigDecimal getSdrNits();
    method public final void setHdrRatio(@NonNull java.math.BigDecimal);
    method public final void setSdrNits(@NonNull java.math.BigDecimal);
  }

  public class SensorDetails {
    ctor public SensorDetails();
    method @Nullable public final String getName();
    method @Nullable public final com.android.server.display.config.RefreshRateRange getRefreshRate();
    method @Nullable public final String getType();
    method public final void setName(@Nullable String);
    method public final void setRefreshRate(@Nullable com.android.server.display.config.RefreshRateRange);
    method public final void setType(@Nullable String);
  }

  public enum ThermalStatus {
    method public String getRawName();
    enum_constant public static final com.android.server.display.config.ThermalStatus critical;
    enum_constant public static final com.android.server.display.config.ThermalStatus emergency;
    enum_constant public static final com.android.server.display.config.ThermalStatus light;
    enum_constant public static final com.android.server.display.config.ThermalStatus moderate;
    enum_constant public static final com.android.server.display.config.ThermalStatus none;
    enum_constant public static final com.android.server.display.config.ThermalStatus severe;
    enum_constant public static final com.android.server.display.config.ThermalStatus shutdown;
  }

  public class ThermalThrottling {
    ctor public ThermalThrottling();
    method @NonNull public final com.android.server.display.config.BrightnessThrottlingMap getBrightnessThrottlingMap();
    method public final void setBrightnessThrottlingMap(@NonNull com.android.server.display.config.BrightnessThrottlingMap);
  }

  public class Thresholds {
    ctor public Thresholds();
    method @NonNull public final com.android.server.display.config.BrightnessThresholds getBrighteningThresholds();
    method @NonNull public final com.android.server.display.config.BrightnessThresholds getDarkeningThresholds();
    method public final void setBrighteningThresholds(@NonNull com.android.server.display.config.BrightnessThresholds);
    method public final void setDarkeningThresholds(@NonNull com.android.server.display.config.BrightnessThresholds);
  }

  public class XmlParser {
    ctor public XmlParser();
    method public static com.android.server.display.config.DisplayConfiguration read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
  }

}

