1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.hardware.display; 18 19 import android.annotation.IntDef; 20 import android.os.Parcel; 21 import android.os.Parcelable; 22 23 import java.lang.annotation.Retention; 24 import java.lang.annotation.RetentionPolicy; 25 26 /** 27 * Data about the current brightness state. 28 * {@see android.view.Display.getBrightnessInfo()} 29 * 30 * @hide 31 */ 32 public final class BrightnessInfo implements Parcelable { 33 34 @IntDef(prefix = {"HIGH_BRIGHTNESS_MODE_"}, value = { 35 HIGH_BRIGHTNESS_MODE_OFF, 36 HIGH_BRIGHTNESS_MODE_SUNLIGHT, 37 HIGH_BRIGHTNESS_MODE_HDR 38 }) 39 @Retention(RetentionPolicy.SOURCE) 40 public @interface HighBrightnessMode {} 41 42 /** 43 * High brightness mode is OFF. The high brightness range is not currently accessible to the 44 * user. 45 */ 46 public static final int HIGH_BRIGHTNESS_MODE_OFF = 0; 47 48 /** 49 * High brightness mode is ON due to high ambient light (sunlight). The high brightness range is 50 * currently accessible to the user. 51 */ 52 public static final int HIGH_BRIGHTNESS_MODE_SUNLIGHT = 1; 53 54 /** 55 * High brightness mode is ON due to high ambient light (sunlight). The high brightness range is 56 * currently accessible to the user. 57 */ 58 public static final int HIGH_BRIGHTNESS_MODE_HDR = 2; 59 60 @IntDef(prefix = {"BRIGHTNESS_MAX_REASON_"}, value = { 61 BRIGHTNESS_MAX_REASON_NONE, 62 BRIGHTNESS_MAX_REASON_THERMAL, 63 BRIGHTNESS_MAX_REASON_POWER_IC, 64 BRIGHTNESS_MAX_REASON_WEAR_BEDTIME_MODE 65 }) 66 @Retention(RetentionPolicy.SOURCE) 67 public @interface BrightnessMaxReason {} 68 69 /** 70 * Maximum brightness is unrestricted. 71 */ 72 public static final int BRIGHTNESS_MAX_REASON_NONE = 0; 73 74 /** 75 * Maximum brightness is restricted due to thermal throttling. 76 */ 77 public static final int BRIGHTNESS_MAX_REASON_THERMAL = 1; 78 79 /** 80 * Maximum brightness is restricted due to power throttling. 81 */ 82 public static final int BRIGHTNESS_MAX_REASON_POWER_IC = 2; 83 84 /** 85 * Maximum brightness is restricted due to the Wear bedtime mode. 86 */ 87 public static final int BRIGHTNESS_MAX_REASON_WEAR_BEDTIME_MODE = 3; 88 89 /** Brightness */ 90 public final float brightness; 91 92 /** Brightness after {@link DisplayPowerController} adjustments */ 93 public final float adjustedBrightness; 94 95 /** Current minimum supported brightness. */ 96 public final float brightnessMinimum; 97 98 /** Current maximum supported brightness. */ 99 public final float brightnessMaximum; 100 101 /** Brightness values greater than this point are only used in High Brightness Mode. */ 102 public final float highBrightnessTransitionPoint; 103 104 /** 105 * Current state of high brightness mode. 106 * Can be any of HIGH_BRIGHTNESS_MODE_* values. 107 */ 108 public final int highBrightnessMode; 109 110 /** 111 * The current reason for restricting maximum brightness. 112 * Can be any of BRIGHTNESS_MAX_REASON_* values. 113 */ 114 public final int brightnessMaxReason; 115 116 /** 117 * Whether the current brightness value is overridden by the application window via 118 * {@link android.view.WindowManager.LayoutParams#screenBrightness}. 119 */ 120 public final boolean isBrightnessOverrideByWindow; 121 BrightnessInfo(float brightness, float brightnessMinimum, float brightnessMaximum, @HighBrightnessMode int highBrightnessMode, float highBrightnessTransitionPoint, @BrightnessMaxReason int brightnessMaxReason)122 public BrightnessInfo(float brightness, float brightnessMinimum, float brightnessMaximum, 123 @HighBrightnessMode int highBrightnessMode, float highBrightnessTransitionPoint, 124 @BrightnessMaxReason int brightnessMaxReason) { 125 this(brightness, brightness, brightnessMinimum, brightnessMaximum, highBrightnessMode, 126 highBrightnessTransitionPoint, brightnessMaxReason, 127 false /* isBrightnessOverrideByWindow */); 128 } 129 BrightnessInfo(float brightness, float adjustedBrightness, float brightnessMinimum, float brightnessMaximum, @HighBrightnessMode int highBrightnessMode, float highBrightnessTransitionPoint, @BrightnessMaxReason int brightnessMaxReason, boolean isBrightnessOverrideByWindow)130 public BrightnessInfo(float brightness, float adjustedBrightness, float brightnessMinimum, 131 float brightnessMaximum, @HighBrightnessMode int highBrightnessMode, 132 float highBrightnessTransitionPoint, @BrightnessMaxReason int brightnessMaxReason, 133 boolean isBrightnessOverrideByWindow) { 134 this.brightness = brightness; 135 this.adjustedBrightness = adjustedBrightness; 136 this.brightnessMinimum = brightnessMinimum; 137 this.brightnessMaximum = brightnessMaximum; 138 this.highBrightnessMode = highBrightnessMode; 139 this.highBrightnessTransitionPoint = highBrightnessTransitionPoint; 140 this.brightnessMaxReason = brightnessMaxReason; 141 this.isBrightnessOverrideByWindow = isBrightnessOverrideByWindow; 142 } 143 144 /** 145 * @return User-friendly string for specified {@link HighBrightnessMode} parameter. 146 */ hbmToString(@ighBrightnessMode int highBrightnessMode)147 public static String hbmToString(@HighBrightnessMode int highBrightnessMode) { 148 switch (highBrightnessMode) { 149 case HIGH_BRIGHTNESS_MODE_OFF: 150 return "off"; 151 case HIGH_BRIGHTNESS_MODE_HDR: 152 return "hdr"; 153 case HIGH_BRIGHTNESS_MODE_SUNLIGHT: 154 return "sunlight"; 155 } 156 return "invalid"; 157 } 158 159 /** 160 * @return User-friendly string for specified {@link BrightnessMaxReason} parameter. 161 */ briMaxReasonToString(@rightnessMaxReason int reason)162 public static String briMaxReasonToString(@BrightnessMaxReason int reason) { 163 switch (reason) { 164 case BRIGHTNESS_MAX_REASON_NONE: 165 return "none"; 166 case BRIGHTNESS_MAX_REASON_THERMAL: 167 return "thermal"; 168 case BRIGHTNESS_MAX_REASON_POWER_IC: 169 return "power IC"; 170 case BRIGHTNESS_MAX_REASON_WEAR_BEDTIME_MODE: 171 return "wear bedtime"; 172 } 173 return "invalid"; 174 } 175 176 @Override describeContents()177 public int describeContents() { 178 return 0; 179 } 180 181 @Override writeToParcel(Parcel dest, int flags)182 public void writeToParcel(Parcel dest, int flags) { 183 dest.writeFloat(brightness); 184 dest.writeFloat(adjustedBrightness); 185 dest.writeFloat(brightnessMinimum); 186 dest.writeFloat(brightnessMaximum); 187 dest.writeInt(highBrightnessMode); 188 dest.writeFloat(highBrightnessTransitionPoint); 189 dest.writeInt(brightnessMaxReason); 190 dest.writeBoolean(isBrightnessOverrideByWindow); 191 } 192 193 public static final @android.annotation.NonNull Creator<BrightnessInfo> CREATOR = 194 new Creator<BrightnessInfo>() { 195 @Override 196 public BrightnessInfo createFromParcel(Parcel source) { 197 return new BrightnessInfo(source); 198 } 199 200 @Override 201 public BrightnessInfo[] newArray(int size) { 202 return new BrightnessInfo[size]; 203 } 204 }; 205 BrightnessInfo(Parcel source)206 private BrightnessInfo(Parcel source) { 207 brightness = source.readFloat(); 208 adjustedBrightness = source.readFloat(); 209 brightnessMinimum = source.readFloat(); 210 brightnessMaximum = source.readFloat(); 211 highBrightnessMode = source.readInt(); 212 highBrightnessTransitionPoint = source.readFloat(); 213 brightnessMaxReason = source.readInt(); 214 isBrightnessOverrideByWindow = source.readBoolean(); 215 } 216 217 } 218