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.view;
18 
19 import static android.view.Surface.ROTATION_0;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.graphics.Rect;
24 import android.os.Parcelable;
25 
26 import com.android.internal.util.ArrayUtils;
27 import com.android.internal.util.DataClass;
28 
29 /**
30  * A class which manages the bounds of the privacy indicator
31  *
32  * @hide
33  */
34 @DataClass(
35         genEqualsHashCode = true,
36         genConstructor = false,
37         genAidl = false,
38         genGetters = false
39 )
40 public class PrivacyIndicatorBounds implements Parcelable {
41 
42     private final @NonNull Rect[] mStaticBounds;
43     private final int mRotation;
44 
PrivacyIndicatorBounds()45     public PrivacyIndicatorBounds() {
46         mStaticBounds = new Rect[4];
47         mRotation = ROTATION_0;
48     }
49 
PrivacyIndicatorBounds(@onNull Rect[] staticBounds, @Surface.Rotation int rotation)50     public PrivacyIndicatorBounds(@NonNull Rect[] staticBounds, @Surface.Rotation int rotation) {
51         mStaticBounds = staticBounds;
52         mRotation = rotation;
53     }
54 
55     /**
56      * Return a PrivacyIndicatorBounds with updated static bounds
57      */
updateStaticBounds(@onNull Rect[] staticPositions)58     public PrivacyIndicatorBounds updateStaticBounds(@NonNull Rect[] staticPositions) {
59         return new PrivacyIndicatorBounds(staticPositions, mRotation);
60     }
61 
62     /**
63      * Update the bounds of the indicator for a specific rotation, or ROTATION_0, if the provided
64      * rotation integer isn't found
65      */
updateBoundsForRotation(@ullable Rect bounds, @Surface.Rotation int rotation)66     public PrivacyIndicatorBounds updateBoundsForRotation(@Nullable Rect bounds,
67             @Surface.Rotation int rotation) {
68         if (rotation >= mStaticBounds.length || rotation < 0) {
69             return this;
70         }
71         Rect[] newBounds = ArrayUtils.cloneOrNull(mStaticBounds);
72         newBounds[rotation] = bounds;
73         return updateStaticBounds(newBounds);
74     }
75 
76     /**
77      * Return an inset PrivacyIndicatorBounds
78      */
inset(int insetLeft, int insetTop, int insetRight, int insetBottom)79     public PrivacyIndicatorBounds inset(int insetLeft, int insetTop, int insetRight,
80             int insetBottom) {
81         if (insetLeft == 0 && insetTop == 0 && insetRight == 0 && insetBottom == 0) {
82             return this;
83         }
84         Rect[] insetStaticBounds = new Rect[mStaticBounds.length];
85         for (int i = 0; i < mStaticBounds.length; i++) {
86             insetStaticBounds[i] =
87                     insetRect(mStaticBounds[i], insetLeft, insetTop, insetRight, insetBottom);
88         }
89         return updateStaticBounds(insetStaticBounds);
90     }
91 
insetRect(Rect orig, int insetLeft, int insetTop, int insetRight, int insetBottom)92     private static Rect insetRect(Rect orig, int insetLeft, int insetTop, int insetRight,
93             int insetBottom) {
94         if (orig == null) {
95             return null;
96         }
97         int left = Math.max(0, orig.left - insetLeft);
98         int top = Math.max(0, orig.top - insetTop);
99         int right = Math.max(left, orig.right - insetRight);
100         int bottom = Math.max(top, orig.bottom - insetBottom);
101         return new Rect(left, top, right, bottom);
102     }
103 
104     /**
105      * Return a PrivacyIndicatorBounds with the static position rotated.
106      */
rotate(@urface.Rotation int rotation)107     public PrivacyIndicatorBounds rotate(@Surface.Rotation int rotation) {
108         if (rotation == ROTATION_0) {
109             return this;
110         }
111         return new PrivacyIndicatorBounds(mStaticBounds, rotation);
112     }
113 
114     /**
115      * Returns a scaled PrivacyIndicatorBounds
116      */
scale(float scale)117     public PrivacyIndicatorBounds scale(float scale) {
118         if (scale == 1f) {
119             return this;
120         }
121 
122         Rect[] scaledStaticPos = new Rect[mStaticBounds.length];
123         for (int i = 0; i < mStaticBounds.length; i++) {
124             scaledStaticPos[i] = scaleRect(mStaticBounds[i], scale);
125         }
126         return new PrivacyIndicatorBounds(scaledStaticPos, mRotation);
127     }
128 
scaleRect(Rect orig, float scale)129     private static Rect scaleRect(Rect orig, float scale) {
130         if (orig == null) {
131             return null;
132         }
133 
134         Rect newRect = new Rect(orig);
135         newRect.scale(scale);
136         return newRect;
137     }
138 
getStaticPrivacyIndicatorBounds()139     public Rect getStaticPrivacyIndicatorBounds() {
140         return mStaticBounds[mRotation];
141     }
142 
143     @Override
toString()144     public String toString() {
145         return "PrivacyIndicatorBounds {static bounds=" + getStaticPrivacyIndicatorBounds()
146                 + " rotation=" + mRotation + "}";
147     }
148 
149 
150 
151     // Code below generated by codegen v1.0.23.
152     //
153     // DO NOT MODIFY!
154     // CHECKSTYLE:OFF Generated code
155     //
156     // To regenerate run:
157     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/view/PrivacyIndicatorBounds.java
158     //
159     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
160     //   Settings > Editor > Code Style > Formatter Control
161     //@formatter:off
162 
163 
164     @Override
165     @DataClass.Generated.Member
equals(@ullable Object o)166     public boolean equals(@Nullable Object o) {
167         // You can override field equality logic by defining either of the methods like:
168         // boolean fieldNameEquals(PrivacyIndicatorBounds other) { ... }
169         // boolean fieldNameEquals(FieldType otherValue) { ... }
170 
171         if (this == o) return true;
172         if (o == null || getClass() != o.getClass()) return false;
173         @SuppressWarnings("unchecked")
174         PrivacyIndicatorBounds that = (PrivacyIndicatorBounds) o;
175         //noinspection PointlessBooleanExpression
176         return true
177                 && java.util.Arrays.equals(mStaticBounds, that.mStaticBounds)
178                 && mRotation == that.mRotation;
179     }
180 
181     @Override
182     @DataClass.Generated.Member
hashCode()183     public int hashCode() {
184         // You can override field hashCode logic by defining methods like:
185         // int fieldNameHashCode() { ... }
186 
187         int _hash = 1;
188         _hash = 31 * _hash + java.util.Arrays.hashCode(mStaticBounds);
189         _hash = 31 * _hash + mRotation;
190         return _hash;
191     }
192 
193     @Override
194     @DataClass.Generated.Member
writeToParcel(@onNull android.os.Parcel dest, int flags)195     public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
196         // You can override field parcelling by defining methods like:
197         // void parcelFieldName(Parcel dest, int flags) { ... }
198 
199         dest.writeTypedArray(mStaticBounds, flags);
200         dest.writeInt(mRotation);
201     }
202 
203     @Override
204     @DataClass.Generated.Member
describeContents()205     public int describeContents() { return 0; }
206 
207     /** @hide */
208     @SuppressWarnings({"unchecked", "RedundantCast"})
209     @DataClass.Generated.Member
PrivacyIndicatorBounds(@onNull android.os.Parcel in)210     protected PrivacyIndicatorBounds(@NonNull android.os.Parcel in) {
211         // You can override field unparcelling by defining methods like:
212         // static FieldType unparcelFieldName(Parcel in) { ... }
213 
214         Rect[] staticBounds = (Rect[]) in.createTypedArray(Rect.CREATOR);
215         int rotation = in.readInt();
216 
217         this.mStaticBounds = staticBounds;
218         com.android.internal.util.AnnotationValidations.validate(
219                 NonNull.class, null, mStaticBounds);
220         this.mRotation = rotation;
221 
222         // onConstructed(); // You can define this method to get a callback
223     }
224 
225     @DataClass.Generated.Member
226     public static final @NonNull Parcelable.Creator<PrivacyIndicatorBounds> CREATOR
227             = new Parcelable.Creator<PrivacyIndicatorBounds>() {
228         @Override
229         public PrivacyIndicatorBounds[] newArray(int size) {
230             return new PrivacyIndicatorBounds[size];
231         }
232 
233         @Override
234         public PrivacyIndicatorBounds createFromParcel(@NonNull android.os.Parcel in) {
235             return new PrivacyIndicatorBounds(in);
236         }
237     };
238 
239     @DataClass.Generated(
240             time = 1621526273838L,
241             codegenVersion = "1.0.23",
242             sourceFile = "frameworks/base/core/java/android/view/PrivacyIndicatorBounds.java",
243             inputSignatures = "private final @android.annotation.NonNull android.graphics.Rect[] mStaticBounds\nprivate final  int mRotation\npublic  android.view.PrivacyIndicatorBounds updateStaticBounds(android.graphics.Rect[])\npublic  android.view.PrivacyIndicatorBounds updateBoundsForRotation(android.graphics.Rect,int)\npublic  android.view.PrivacyIndicatorBounds inset(int,int,int,int)\nprivate static  android.graphics.Rect insetRect(android.graphics.Rect,int,int,int,int)\npublic  android.view.PrivacyIndicatorBounds rotate(int)\npublic  android.view.PrivacyIndicatorBounds scale(float)\nprivate static  android.graphics.Rect scaleRect(android.graphics.Rect,float)\npublic  android.graphics.Rect getStaticPrivacyIndicatorBounds()\npublic @java.lang.Override java.lang.String toString()\nclass PrivacyIndicatorBounds extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genConstructor=false, genAidl=false, genGetters=false)")
244     @Deprecated
__metadata()245     private void __metadata() {}
246 
247 
248     //@formatter:on
249     // End of generated code
250 
251 }
252