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 com.android.internal.statusbar;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.graphics.Rect;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 import android.view.InsetsFlags;
25 import android.view.ViewDebug;
26 import android.view.WindowInsetsController.Appearance;
27 
28 import com.android.internal.util.DataClass;
29 
30 /**
31  * Details about the letterbox state of an app.
32  */
33 @DataClass(
34         genParcelable = true,
35         genAidl = true,
36         genToString = true,
37         genGetters = false,
38         genEqualsHashCode = true
39 )
40 public class LetterboxDetails implements Parcelable {
41 
42     @NonNull
43     private final Rect mLetterboxInnerBounds;
44     @NonNull
45     private final Rect mLetterboxFullBounds;
46     private final int mAppAppearance;
47 
48     /**
49      * Returns the bounds of the inner letterbox (app content).
50      *
51      * <p>When an app is letterboxed, it is not using the full bounds of its window. Here we return
52      * the bounds that are being used for the app content.
53      *
54      * <pre>
55      * +-------+---------+-------+
56      * |       |         |       |
57      * |       |         |       |
58      * | Outer |  Inner  | Outer |
59      * |       |         |       |
60      * |       |         |       |
61      * +-------+-------- +-------+
62      * <pre>
63      */
64     @NonNull
getLetterboxInnerBounds()65     public Rect getLetterboxInnerBounds() {
66         return mLetterboxInnerBounds;
67     }
68 
69     /**
70      * Returns the full bounds of the letterbox.
71      *
72      * <p>These are the entire bounds of the window where the app is placed. We cannot assume that
73      * the full bounds are the bounds of the screen, as the app can be in split-screen, or can have
74      * some margin due to display cutouts.
75      *
76      * <pre>
77      * ---- Full bounds width ----
78      * +-------+---------+-------+ |
79      * |       |         |       | |
80      * |       |         |       | |
81      * | Outer |  Inner  | Outer | + Full bounds height
82      * |       |         |       | |
83      * |       |         |       | |
84      * +-------+-------- +-------+ |
85      * </pre>
86      */
87     @NonNull
getLetterboxFullBounds()88     public Rect getLetterboxFullBounds() {
89         return mLetterboxFullBounds;
90     }
91 
92     /**
93      * Returns the {@link Appearance} of the inner letterbox (app content).
94      */
95     @Appearance
getAppAppearance()96     public int getAppAppearance() {
97         return mAppAppearance;
98     }
99 
100     /** Returns a string representation of the {@link #getAppAppearance()} property. */
appAppearanceToString()101     public String appAppearanceToString() {
102         return ViewDebug.flagsToString(InsetsFlags.class, "appearance", mAppAppearance);
103     }
104 
105 
106 
107     // Code below generated by codegen v1.0.23.
108     //
109     // DO NOT MODIFY!
110     // CHECKSTYLE:OFF Generated code
111     //
112     // To regenerate run:
113     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/com/android/internal/statusbar/LetterboxDetails.java
114     //
115     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
116     //   Settings > Editor > Code Style > Formatter Control
117     //@formatter:off
118 
119 
120     @DataClass.Generated.Member
LetterboxDetails( @onNull Rect letterboxInnerBounds, @NonNull Rect letterboxFullBounds, int appAppearance)121     public LetterboxDetails(
122             @NonNull Rect letterboxInnerBounds,
123             @NonNull Rect letterboxFullBounds,
124             int appAppearance) {
125         this.mLetterboxInnerBounds = letterboxInnerBounds;
126         com.android.internal.util.AnnotationValidations.validate(
127                 NonNull.class, null, mLetterboxInnerBounds);
128         this.mLetterboxFullBounds = letterboxFullBounds;
129         com.android.internal.util.AnnotationValidations.validate(
130                 NonNull.class, null, mLetterboxFullBounds);
131         this.mAppAppearance = appAppearance;
132 
133         // onConstructed(); // You can define this method to get a callback
134     }
135 
136     @Override
137     @DataClass.Generated.Member
toString()138     public String toString() {
139         // You can override field toString logic by defining methods like:
140         // String fieldNameToString() { ... }
141 
142         return "LetterboxDetails { " +
143                 "letterboxInnerBounds = " + mLetterboxInnerBounds + ", " +
144                 "letterboxFullBounds = " + mLetterboxFullBounds + ", " +
145                 "appAppearance = " + appAppearanceToString() +
146         " }";
147     }
148 
149     @Override
150     @DataClass.Generated.Member
equals(@ullable Object o)151     public boolean equals(@Nullable Object o) {
152         // You can override field equality logic by defining either of the methods like:
153         // boolean fieldNameEquals(LetterboxDetails other) { ... }
154         // boolean fieldNameEquals(FieldType otherValue) { ... }
155 
156         if (this == o) return true;
157         if (o == null || getClass() != o.getClass()) return false;
158         @SuppressWarnings("unchecked")
159         LetterboxDetails that = (LetterboxDetails) o;
160         //noinspection PointlessBooleanExpression
161         return true
162                 && java.util.Objects.equals(mLetterboxInnerBounds, that.mLetterboxInnerBounds)
163                 && java.util.Objects.equals(mLetterboxFullBounds, that.mLetterboxFullBounds)
164                 && mAppAppearance == that.mAppAppearance;
165     }
166 
167     @Override
168     @DataClass.Generated.Member
hashCode()169     public int hashCode() {
170         // You can override field hashCode logic by defining methods like:
171         // int fieldNameHashCode() { ... }
172 
173         int _hash = 1;
174         _hash = 31 * _hash + java.util.Objects.hashCode(mLetterboxInnerBounds);
175         _hash = 31 * _hash + java.util.Objects.hashCode(mLetterboxFullBounds);
176         _hash = 31 * _hash + mAppAppearance;
177         return _hash;
178     }
179 
180     @Override
181     @DataClass.Generated.Member
writeToParcel(@onNull Parcel dest, int flags)182     public void writeToParcel(@NonNull Parcel dest, int flags) {
183         // You can override field parcelling by defining methods like:
184         // void parcelFieldName(Parcel dest, int flags) { ... }
185 
186         dest.writeTypedObject(mLetterboxInnerBounds, flags);
187         dest.writeTypedObject(mLetterboxFullBounds, flags);
188         dest.writeInt(mAppAppearance);
189     }
190 
191     @Override
192     @DataClass.Generated.Member
describeContents()193     public int describeContents() { return 0; }
194 
195     /** @hide */
196     @SuppressWarnings({"unchecked", "RedundantCast"})
197     @DataClass.Generated.Member
LetterboxDetails(@onNull Parcel in)198     protected LetterboxDetails(@NonNull Parcel in) {
199         // You can override field unparcelling by defining methods like:
200         // static FieldType unparcelFieldName(Parcel in) { ... }
201 
202         Rect letterboxInnerBounds = (Rect) in.readTypedObject(Rect.CREATOR);
203         Rect letterboxFullBounds = (Rect) in.readTypedObject(Rect.CREATOR);
204         int appAppearance = in.readInt();
205 
206         this.mLetterboxInnerBounds = letterboxInnerBounds;
207         com.android.internal.util.AnnotationValidations.validate(
208                 NonNull.class, null, mLetterboxInnerBounds);
209         this.mLetterboxFullBounds = letterboxFullBounds;
210         com.android.internal.util.AnnotationValidations.validate(
211                 NonNull.class, null, mLetterboxFullBounds);
212         this.mAppAppearance = appAppearance;
213 
214         // onConstructed(); // You can define this method to get a callback
215     }
216 
217     @DataClass.Generated.Member
218     public static final @NonNull Parcelable.Creator<LetterboxDetails> CREATOR
219             = new Parcelable.Creator<LetterboxDetails>() {
220         @Override
221         public LetterboxDetails[] newArray(int size) {
222             return new LetterboxDetails[size];
223         }
224 
225         @Override
226         public LetterboxDetails createFromParcel(@NonNull Parcel in) {
227             return new LetterboxDetails(in);
228         }
229     };
230 
231     @DataClass.Generated(
232             time = 1656941109526L,
233             codegenVersion = "1.0.23",
234             sourceFile = "frameworks/base/core/java/com/android/internal/statusbar/LetterboxDetails.java",
235             inputSignatures = "private final @android.annotation.NonNull android.graphics.Rect mLetterboxInnerBounds\nprivate final @android.annotation.NonNull android.graphics.Rect mLetterboxFullBounds\nprivate final  int mAppAppearance\npublic @android.annotation.NonNull android.graphics.Rect getLetterboxInnerBounds()\npublic @android.annotation.NonNull android.graphics.Rect getLetterboxFullBounds()\npublic @android.view.WindowInsetsController.Appearance int getAppAppearance()\npublic  java.lang.String appAppearanceToString()\nclass LetterboxDetails extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genParcelable=true, genAidl=true, genToString=true, genGetters=false, genEqualsHashCode=true)")
236     @Deprecated
__metadata()237     private void __metadata() {}
238 
239 
240     //@formatter:on
241     // End of generated code
242 
243 }
244