1 /*
2  * Copyright (C) 2022 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.annotation.NonNull;
21 import android.annotation.Nullable;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 import android.view.Display;
25 
26 import java.lang.annotation.Retention;
27 import java.lang.annotation.RetentionPolicy;
28 
29 /**
30  * Describes the HDR conversion mode for a device.
31  *
32  * HDR conversion mode has a conversionMode and preferredHdrOutputType. </p><p>
33  * The conversionMode can be one of:
34  * {@link HdrConversionMode#HDR_CONVERSION_UNSUPPORTED} : HDR conversion is unsupported. In this
35  * mode, preferredHdrOutputType should not be set.
36  * {@link HdrConversionMode#HDR_CONVERSION_PASSTHROUGH} : HDR conversion is disabled. The output HDR
37  * type will change dynamically to match the content. In this mode, preferredHdrOutputType should
38  * not be set.
39  * {@link HdrConversionMode#HDR_CONVERSION_SYSTEM}: The output HDR type is selected by the
40  * implementation. In this mode, preferredHdrOutputType will be the mode preferred by the system
41  * when querying. However, it should be set to HDR_TYPE_INVALID when setting the mode.
42  * {@link HdrConversionMode#HDR_CONVERSION_FORCE}: The implementation converts all content to this
43  * HDR type, when possible.
44  * In this mode, preferredHdrOutputType should be set.
45  * </p>
46  */
47 public final class HdrConversionMode implements Parcelable {
48     /** HDR output conversion is unsupported */
49     public static final int HDR_CONVERSION_UNSUPPORTED = 0;
50     /** HDR output conversion is disabled */
51     public static final int HDR_CONVERSION_PASSTHROUGH = 1;
52     /** HDR output conversion is managed by the device manufacturer's implementation. */
53     public static final int HDR_CONVERSION_SYSTEM = 2;
54     /**
55      * HDR output conversion is set by the user. The preferred output type must be
56      * set in this case.
57      */
58     public static final int HDR_CONVERSION_FORCE = 3;
59 
60     /** @hide */
61     @IntDef(prefix = {"HDR_CONVERSION"}, value = {
62             HDR_CONVERSION_PASSTHROUGH,
63             HDR_CONVERSION_SYSTEM,
64             HDR_CONVERSION_FORCE
65     })
66     @Retention(RetentionPolicy.SOURCE)
67     public @interface ConversionMode {}
68 
69     public static final @NonNull
70             Parcelable.Creator<HdrConversionMode> CREATOR =
71             new Parcelable.Creator<>() {
72                 @Override
73                 public HdrConversionMode createFromParcel(Parcel source) {
74                     return new HdrConversionMode(source);
75                 }
76 
77                 @Override
78                 public HdrConversionMode[] newArray(int size) {
79                     return new HdrConversionMode[size];
80                 }
81             };
82 
83     private final @ConversionMode int mConversionMode;
84     private @Display.HdrCapabilities.HdrType int mPreferredHdrOutputType;
85 
HdrConversionMode(@onversionMode int conversionMode, @Display.HdrCapabilities.HdrType int preferredHdrOutputType)86     public HdrConversionMode(@ConversionMode int conversionMode,
87             @Display.HdrCapabilities.HdrType int preferredHdrOutputType) {
88         if ((conversionMode == HdrConversionMode.HDR_CONVERSION_PASSTHROUGH
89                 || conversionMode == HDR_CONVERSION_UNSUPPORTED)
90                 && preferredHdrOutputType != Display.HdrCapabilities.HDR_TYPE_INVALID) {
91             throw new IllegalArgumentException("preferredHdrOutputType must not be set if"
92                     + " the conversion mode is " + hdrConversionModeString(conversionMode));
93         }
94 
95         mConversionMode = conversionMode;
96         mPreferredHdrOutputType = preferredHdrOutputType;
97     }
98 
HdrConversionMode(@onversionMode int conversionMode)99     public HdrConversionMode(@ConversionMode int conversionMode) {
100         mConversionMode = conversionMode;
101         mPreferredHdrOutputType = Display.HdrCapabilities.HDR_TYPE_INVALID;
102     }
103 
HdrConversionMode(Parcel source)104     private HdrConversionMode(Parcel source) {
105         this(source.readInt(), source.readInt());
106     }
107 
108     @ConversionMode
getConversionMode()109     public int getConversionMode() {
110         return mConversionMode;
111     }
112 
113     @Display.HdrCapabilities.HdrType
getPreferredHdrOutputType()114     public int getPreferredHdrOutputType() {
115         return mPreferredHdrOutputType;
116     }
117 
118     @Override
describeContents()119     public int describeContents() {
120         return 0;
121     }
122 
123     @Override
writeToParcel(@onNull Parcel dest, int flags)124     public void writeToParcel(@NonNull Parcel dest, int flags) {
125         dest.writeInt(mConversionMode);
126         dest.writeInt(mPreferredHdrOutputType);
127     }
128 
129     @Override
equals(@ullable Object o)130     public boolean equals(@Nullable Object o) {
131         return o instanceof HdrConversionMode && equals((HdrConversionMode) o);
132     }
133 
134     @Override
hashCode()135     public int hashCode() {
136         return 0; // don't care
137     }
138 
139     @Override
toString()140     public String toString() {
141         return "HdrConversionMode{ConversionMode=" + hdrConversionModeString(getConversionMode())
142                 + ", PreferredHdrOutputType="
143                 + Display.HdrCapabilities.hdrTypeToString(getPreferredHdrOutputType()) + "}";
144     }
145 
equals(HdrConversionMode other)146     private boolean equals(HdrConversionMode other) {
147         return other != null
148                 && mConversionMode == other.getConversionMode()
149                 && mPreferredHdrOutputType == other.getPreferredHdrOutputType();
150     }
151 
hdrConversionModeString(@onversionMode int hdrConversionMode)152     private static String hdrConversionModeString(@ConversionMode int hdrConversionMode) {
153         switch (hdrConversionMode) {
154             case HDR_CONVERSION_PASSTHROUGH:
155                 return "HDR_CONVERSION_PASSTHROUGH";
156             case HDR_CONVERSION_SYSTEM:
157                 return "HDR_CONVERSION_SYSTEM";
158             case HDR_CONVERSION_FORCE:
159                 return "HDR_CONVERSION_FORCE";
160             default:
161                 return "HDR_CONVERSION_UNSUPPORTED";
162         }
163     }
164 }