16fa0c9b0875cd65066082d047f617d689fd92018Jason Monk/* 26fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Copyright 2017 The Android Open Source Project 36fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * 46fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 56fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * you may not use this file except in compliance with the License. 66fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * You may obtain a copy of the License at 76fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * 86fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 96fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * 106fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Unless required by applicable law or agreed to in writing, software 116fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 126fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * See the License for the specific language governing permissions and 146fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * limitations under the License. 156fa0c9b0875cd65066082d047f617d689fd92018Jason Monk */ 166fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 1785ef1446b82c8783a50af92c4cb1389fe0d0e907Aurimas Liutikaspackage androidx.slice; 186fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 196fa0c9b0875cd65066082d047f617d689fd92018Jason Monkimport android.net.Uri; 20c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk 21ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.NonNull; 22ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.RestrictTo; 236fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 246fa0c9b0875cd65066082d047f617d689fd92018Jason Monk/** 256fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Class describing the structure of the data contained within a slice. 266fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * <p> 276fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * A data version contains a string which describes the type of structure 286fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * and a revision which denotes this specific implementation. Revisions are expected 296fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * to be backwards compatible and monotonically increasing. Meaning if a 306fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * SliceSpec has the same type and an equal or lesser revision, 316fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * it is expected to be compatible. 326fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * <p> 336fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Apps rendering slices will provide a list of supported versions to the OS which 346fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * will also be given to the app. Apps should only return a {@link Slice} with a 356fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * {@link SliceSpec} that one of the supported {@link SliceSpec}s provided 366fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * {@link #canRender}. 376fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * 386fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * @hide 396fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * @see Slice 406fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * @see SliceProvider#onBindSlice(Uri) 416fa0c9b0875cd65066082d047f617d689fd92018Jason Monk */ 426fa0c9b0875cd65066082d047f617d689fd92018Jason Monk@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 436fa0c9b0875cd65066082d047f617d689fd92018Jason Monkpublic class SliceSpec { 446fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 456fa0c9b0875cd65066082d047f617d689fd92018Jason Monk private final String mType; 466fa0c9b0875cd65066082d047f617d689fd92018Jason Monk private final int mRevision; 476fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 486fa0c9b0875cd65066082d047f617d689fd92018Jason Monk public SliceSpec(@NonNull String type, int revision) { 496fa0c9b0875cd65066082d047f617d689fd92018Jason Monk mType = type; 506fa0c9b0875cd65066082d047f617d689fd92018Jason Monk mRevision = revision; 516fa0c9b0875cd65066082d047f617d689fd92018Jason Monk } 526fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 536fa0c9b0875cd65066082d047f617d689fd92018Jason Monk /** 546fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Gets the type of the version. 556fa0c9b0875cd65066082d047f617d689fd92018Jason Monk */ 566fa0c9b0875cd65066082d047f617d689fd92018Jason Monk public String getType() { 576fa0c9b0875cd65066082d047f617d689fd92018Jason Monk return mType; 586fa0c9b0875cd65066082d047f617d689fd92018Jason Monk } 596fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 606fa0c9b0875cd65066082d047f617d689fd92018Jason Monk /** 616fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Gets the revision of the version. 626fa0c9b0875cd65066082d047f617d689fd92018Jason Monk */ 636fa0c9b0875cd65066082d047f617d689fd92018Jason Monk public int getRevision() { 646fa0c9b0875cd65066082d047f617d689fd92018Jason Monk return mRevision; 656fa0c9b0875cd65066082d047f617d689fd92018Jason Monk } 666fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 676fa0c9b0875cd65066082d047f617d689fd92018Jason Monk /** 686fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Indicates that this spec can be used to render the specified spec. 696fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * <p> 706fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Rendering support is not bi-directional (e.g. Spec v3 can render 716fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * Spec v2, but Spec v2 cannot render Spec v3). 726fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * 736fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * @param candidate candidate format of data. 746fa0c9b0875cd65066082d047f617d689fd92018Jason Monk * @return true if versions are compatible. 7585ef1446b82c8783a50af92c4cb1389fe0d0e907Aurimas Liutikas * @see androidx.slice.widget.SliceView 766fa0c9b0875cd65066082d047f617d689fd92018Jason Monk */ 776fa0c9b0875cd65066082d047f617d689fd92018Jason Monk public boolean canRender(@NonNull SliceSpec candidate) { 786fa0c9b0875cd65066082d047f617d689fd92018Jason Monk if (!mType.equals(candidate.mType)) return false; 796fa0c9b0875cd65066082d047f617d689fd92018Jason Monk return mRevision >= candidate.mRevision; 806fa0c9b0875cd65066082d047f617d689fd92018Jason Monk } 816fa0c9b0875cd65066082d047f617d689fd92018Jason Monk 826fa0c9b0875cd65066082d047f617d689fd92018Jason Monk @Override 836fa0c9b0875cd65066082d047f617d689fd92018Jason Monk public boolean equals(Object obj) { 846fa0c9b0875cd65066082d047f617d689fd92018Jason Monk if (!(obj instanceof SliceSpec)) return false; 856fa0c9b0875cd65066082d047f617d689fd92018Jason Monk SliceSpec other = (SliceSpec) obj; 866fa0c9b0875cd65066082d047f617d689fd92018Jason Monk return mType.equals(other.mType) && mRevision == other.mRevision; 876fa0c9b0875cd65066082d047f617d689fd92018Jason Monk } 88c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk 89c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk @Override 90c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk public int hashCode() { 91f68dde011de8fb4d616a09292524869f56d94110Jason Monk return mType.hashCode() + mRevision; 92c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk } 93c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk 94c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk @Override 95c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk public String toString() { 96c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk return String.format("SliceSpec{%s,%d}", mType, mRevision); 97c33656326970bc4b7a4bd817892f4c10fa339402Jason Monk } 986fa0c9b0875cd65066082d047f617d689fd92018Jason Monk} 99