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