1 /*
2  * Copyright 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 androidx.wear.watchface.data;
18 
19 import android.annotation.SuppressLint;
20 import android.content.ComponentName;
21 import android.graphics.RectF;
22 import android.os.Bundle;
23 import android.os.Parcel;
24 import android.os.Parcelable;
25 import android.support.wearable.complications.ComplicationData;
26 
27 import androidx.annotation.RestrictTo;
28 import androidx.versionedparcelable.ParcelField;
29 import androidx.versionedparcelable.ParcelUtils;
30 import androidx.versionedparcelable.VersionedParcelable;
31 import androidx.versionedparcelable.VersionedParcelize;
32 import androidx.wear.watchface.complications.data.ComplicationExperimental;
33 
34 import org.jspecify.annotations.NonNull;
35 import org.jspecify.annotations.Nullable;
36 
37 import java.util.List;
38 
39 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
40 @VersionedParcelize
41 @SuppressLint("BanParcelableUsage") // TODO(b/169214666): Remove Parcelable
42 public final class ComplicationSlotMetadataWireFormat implements VersionedParcelable, Parcelable {
43 
44     @ParcelField(1)
45     int mId;
46 
47     @ParcelField(2)
48     int @NonNull [] mComplicationBoundsType = new int[0];
49 
50     @ParcelField(3)
51     RectF @NonNull [] mComplicationBounds = new RectF[0];
52 
53     @ParcelField(4)
54     int mBoundsType;
55 
56     @ParcelField(5)
57     @ComplicationData.ComplicationType
58     int @NonNull [] mSupportedTypes = new int[0];
59 
60     @ParcelField(6)
61     @Nullable List<ComponentName> mDefaultDataSourcesToTry;
62 
63     @ParcelField(7)
64     int mFallbackSystemDataSource;
65 
66     @ParcelField(8)
67     @ComplicationData.ComplicationType
68     int mDefaultType;
69 
70     @ParcelField(9)
71     boolean mIsInitiallyEnabled;
72 
73     @ParcelField(10)
74     boolean mFixedComplicationDataSource;
75 
76     @ParcelField(11)
77     @NonNull Bundle mComplicationConfigExtras;
78 
79     // Not supported in library v1.0.
80     @ParcelField(12)
81     @ComplicationData.ComplicationType
82     int mPrimaryDataSourceDefaultType = ComplicationData.TYPE_NOT_CONFIGURED;
83 
84     // Not supported in library v1.0.
85     @ParcelField(13)
86     @ComplicationData.ComplicationType
87     int mSecondaryDataSourceDefaultType = ComplicationData.TYPE_NOT_CONFIGURED;
88 
89     // Only valid for edge complications. Not supported in library v1.0.
90     @ParcelField(14)
91     @Nullable BoundingArcWireFormat mBoundingArc;
92 
93     // This needs to be a list because VersionedParcelable appears not to be backwards compatible
94     // when introducing new arrays.
95     @ParcelField(value = 15, defaultValue = "null")
96     @Nullable List<RectF> mComplicationMargins;
97 
98     /** Used by VersionedParcelable. */
ComplicationSlotMetadataWireFormat()99     ComplicationSlotMetadataWireFormat() {}
100 
101     @ComplicationExperimental
ComplicationSlotMetadataWireFormat( int id, int @NonNull [] complicationBoundsType, RectF @NonNull [] complicationBounds, @NonNull List<RectF> complicationMargins, int boundsType, @ComplicationData.ComplicationType int @NonNull [] supportedTypes, @Nullable List<ComponentName> defaultDataSourcesToTry, int fallbackSystemDataSource, @ComplicationData.ComplicationType int defaultDataSourceType, @ComplicationData.ComplicationType int primaryDataSourceDefaultType, @ComplicationData.ComplicationType int secondaryDataSourceDefaultType, boolean isInitiallyEnabled, boolean fixedComplicationDataSource, @NonNull Bundle complicationConfigExtras, @Nullable BoundingArcWireFormat boundingArc)102     public ComplicationSlotMetadataWireFormat(
103             int id,
104             int @NonNull [] complicationBoundsType,
105             RectF @NonNull [] complicationBounds,
106             @NonNull List<RectF> complicationMargins,
107             int boundsType,
108             @ComplicationData.ComplicationType int @NonNull [] supportedTypes,
109             @Nullable List<ComponentName> defaultDataSourcesToTry,
110             int fallbackSystemDataSource,
111             @ComplicationData.ComplicationType int defaultDataSourceType,
112             @ComplicationData.ComplicationType int primaryDataSourceDefaultType,
113             @ComplicationData.ComplicationType int secondaryDataSourceDefaultType,
114             boolean isInitiallyEnabled,
115             boolean fixedComplicationDataSource,
116             @NonNull Bundle complicationConfigExtras,
117             @Nullable BoundingArcWireFormat boundingArc) {
118         mId = id;
119         mComplicationBoundsType = complicationBoundsType;
120         mComplicationBounds = complicationBounds;
121         mComplicationMargins = complicationMargins;
122         mBoundsType = boundsType;
123         mSupportedTypes = supportedTypes;
124         mDefaultDataSourcesToTry = defaultDataSourcesToTry;
125         mPrimaryDataSourceDefaultType = primaryDataSourceDefaultType;
126         mSecondaryDataSourceDefaultType = secondaryDataSourceDefaultType;
127         mFallbackSystemDataSource = fallbackSystemDataSource;
128         mDefaultType = defaultDataSourceType;
129         mIsInitiallyEnabled = isInitiallyEnabled;
130         mFixedComplicationDataSource = fixedComplicationDataSource;
131         mComplicationConfigExtras = complicationConfigExtras;
132         mBoundingArc = boundingArc;
133     }
134 
135     // TODO(b/230364881): Deprecate when BoundingArc is no longer experimental.
ComplicationSlotMetadataWireFormat( int id, int @NonNull [] complicationBoundsType, RectF @NonNull [] complicationBounds, int boundsType, @ComplicationData.ComplicationType int @NonNull [] supportedTypes, @Nullable List<ComponentName> defaultDataSourcesToTry, int fallbackSystemDataSource, @ComplicationData.ComplicationType int defaultDataSourceType, @ComplicationData.ComplicationType int primaryDataSourceDefaultType, @ComplicationData.ComplicationType int secondaryDataSourceDefaultType, boolean isInitiallyEnabled, boolean fixedComplicationDataSource, @NonNull Bundle complicationConfigExtras)136     public ComplicationSlotMetadataWireFormat(
137             int id,
138             int @NonNull [] complicationBoundsType,
139             RectF @NonNull [] complicationBounds,
140             int boundsType,
141             @ComplicationData.ComplicationType int @NonNull [] supportedTypes,
142             @Nullable List<ComponentName> defaultDataSourcesToTry,
143             int fallbackSystemDataSource,
144             @ComplicationData.ComplicationType int defaultDataSourceType,
145             @ComplicationData.ComplicationType int primaryDataSourceDefaultType,
146             @ComplicationData.ComplicationType int secondaryDataSourceDefaultType,
147             boolean isInitiallyEnabled,
148             boolean fixedComplicationDataSource,
149             @NonNull Bundle complicationConfigExtras) {
150         mId = id;
151         mComplicationBoundsType = complicationBoundsType;
152         mComplicationBounds = complicationBounds;
153         mBoundsType = boundsType;
154         mSupportedTypes = supportedTypes;
155         mDefaultDataSourcesToTry = defaultDataSourcesToTry;
156         mPrimaryDataSourceDefaultType = primaryDataSourceDefaultType;
157         mSecondaryDataSourceDefaultType = secondaryDataSourceDefaultType;
158         mFallbackSystemDataSource = fallbackSystemDataSource;
159         mDefaultType = defaultDataSourceType;
160         mIsInitiallyEnabled = isInitiallyEnabled;
161         mFixedComplicationDataSource = fixedComplicationDataSource;
162         mComplicationConfigExtras = complicationConfigExtras;
163     }
164 
165     /**
166      * @deprecated Use the other constructor with primaryDataSourceDefaultType &
167      *     secondaryDataSourceDefaultType instead.
168      */
169     @Deprecated
ComplicationSlotMetadataWireFormat( int id, int @NonNull [] complicationBoundsType, RectF @NonNull [] complicationBounds, int boundsType, @ComplicationData.ComplicationType int @NonNull [] supportedTypes, @Nullable List<ComponentName> defaultDataSourcesToTry, int fallbackSystemDataSource, @ComplicationData.ComplicationType int defaultDataSourceType, boolean isInitiallyEnabled, boolean fixedComplicationDataSource, @NonNull Bundle complicationConfigExtras)170     public ComplicationSlotMetadataWireFormat(
171             int id,
172             int @NonNull [] complicationBoundsType,
173             RectF @NonNull [] complicationBounds,
174             int boundsType,
175             @ComplicationData.ComplicationType int @NonNull [] supportedTypes,
176             @Nullable List<ComponentName> defaultDataSourcesToTry,
177             int fallbackSystemDataSource,
178             @ComplicationData.ComplicationType int defaultDataSourceType,
179             boolean isInitiallyEnabled,
180             boolean fixedComplicationDataSource,
181             @NonNull Bundle complicationConfigExtras) {
182         mId = id;
183         mComplicationBoundsType = complicationBoundsType;
184         mComplicationBounds = complicationBounds;
185         mBoundsType = boundsType;
186         mSupportedTypes = supportedTypes;
187         mDefaultDataSourcesToTry = defaultDataSourcesToTry;
188         mFallbackSystemDataSource = fallbackSystemDataSource;
189         mDefaultType = defaultDataSourceType;
190         mIsInitiallyEnabled = isInitiallyEnabled;
191         mFixedComplicationDataSource = fixedComplicationDataSource;
192         mComplicationConfigExtras = complicationConfigExtras;
193     }
194 
getId()195     public int getId() {
196         return mId;
197     }
198 
getComplicationBoundsType()199     public int @NonNull [] getComplicationBoundsType() {
200         return mComplicationBoundsType;
201     }
202 
getComplicationBounds()203     public RectF @NonNull [] getComplicationBounds() {
204         return mComplicationBounds;
205     }
206 
getComplicationMargins()207     public @Nullable List<RectF> getComplicationMargins() {
208         return mComplicationMargins;
209     }
210 
getBoundsType()211     public int getBoundsType() {
212         return mBoundsType;
213     }
214 
215     @ComplicationData.ComplicationType
getSupportedTypes()216     public int @NonNull [] getSupportedTypes() {
217         return mSupportedTypes;
218     }
219 
220     /**
221      * Along with {@link #getFallbackSystemDataSource} this is the wire format for
222      * DefaultComplicationDataSourcePolicy.
223      */
getDefaultDataSourcesToTry()224     public @Nullable List<ComponentName> getDefaultDataSourcesToTry() {
225         return mDefaultDataSourcesToTry;
226     }
227 
228     /**
229      * Along with {@link #getDefaultDataSourcesToTry} this is the wire format for
230      * DefaultComplicationDataSourcePolicy.
231      */
getFallbackSystemDataSource()232     public int getFallbackSystemDataSource() {
233         return mFallbackSystemDataSource;
234     }
235 
236     /**
237      * @return The {@link ComplicationData.ComplicationType} for {@link
238      *     #getFallbackSystemDataSource}.
239      */
240     @ComplicationData.ComplicationType
getDefaultDataSourceType()241     public int getDefaultDataSourceType() {
242         return mDefaultType;
243     }
244 
245     /**
246      * @return The {@link ComplicationData.ComplicationType} for the first entry from {@link
247      *     #getDefaultDataSourcesToTry}.
248      */
249     @ComplicationData.ComplicationType
getPrimaryDataSourceDefaultType()250     public int getPrimaryDataSourceDefaultType() {
251         // Not supported in library v1.0. TYPE_NOT_CONFIGURED is not a valid API choice indicating
252         // and old client.
253         return (mPrimaryDataSourceDefaultType == ComplicationData.TYPE_NOT_CONFIGURED)
254                 ? mDefaultType
255                 : mPrimaryDataSourceDefaultType;
256     }
257 
258     /**
259      * @return The {@link ComplicationData.ComplicationType} for the second entry from {@link
260      *     #getDefaultDataSourcesToTry}.
261      */
262     @ComplicationData.ComplicationType
getSecondaryDataSourceDefaultType()263     public int getSecondaryDataSourceDefaultType() {
264         // Not supported in library v1.0. TYPE_NOT_CONFIGURED is not a valid API choice indicating
265         // and old client.
266         return (mSecondaryDataSourceDefaultType == ComplicationData.TYPE_NOT_CONFIGURED)
267                 ? mDefaultType
268                 : mSecondaryDataSourceDefaultType;
269     }
270 
isInitiallyEnabled()271     public boolean isInitiallyEnabled() {
272         return mIsInitiallyEnabled;
273     }
274 
isFixedComplicationDataSource()275     public boolean isFixedComplicationDataSource() {
276         return mFixedComplicationDataSource;
277     }
278 
getComplicationConfigExtras()279     public @NonNull Bundle getComplicationConfigExtras() {
280         return mComplicationConfigExtras;
281     }
282 
283     @ComplicationExperimental
getBoundingArc()284     public @Nullable BoundingArcWireFormat getBoundingArc() {
285         return mBoundingArc;
286     }
287 
288     /** Serializes this ComplicationDetails to the specified {@link Parcel}. */
289     @Override
writeToParcel(@onNull Parcel parcel, int flags)290     public void writeToParcel(@NonNull Parcel parcel, int flags) {
291         parcel.writeParcelable(ParcelUtils.toParcelable(this), flags);
292     }
293 
294     @Override
describeContents()295     public int describeContents() {
296         return 0;
297     }
298 
299     public static final Parcelable.Creator<ComplicationSlotMetadataWireFormat> CREATOR =
300             new Parcelable.Creator<ComplicationSlotMetadataWireFormat>() {
301                 @SuppressWarnings("deprecation")
302                 @Override
303                 public ComplicationSlotMetadataWireFormat createFromParcel(Parcel source) {
304                     return ParcelUtils.fromParcelable(
305                             source.readParcelable(getClass().getClassLoader()));
306                 }
307 
308                 @Override
309                 public ComplicationSlotMetadataWireFormat[] newArray(int size) {
310                     return new ComplicationSlotMetadataWireFormat[size];
311                 }
312             };
313 }
314