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