124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown/*
224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Copyright (C) 2013 The Android Open Source Project
324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * you may not use this file except in compliance with the License.
624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * You may obtain a copy of the License at
724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown *
1024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Unless required by applicable law or agreed to in writing, software
1124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * See the License for the specific language governing permissions and
1424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * limitations under the License.
1524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown */
1624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
1724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownpackage android.support.v4.media;
1824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas
2124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Build;
2224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Parcel;
2324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Parcelable;
24f0e4dea75691d2fd1256508136ecce88bef6067bIan Lakeimport android.support.annotation.IntDef;
25c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
2624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.util.Log;
2724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
28f0e4dea75691d2fd1256508136ecce88bef6067bIan Lakeimport java.lang.annotation.Retention;
29f0e4dea75691d2fd1256508136ecce88bef6067bIan Lakeimport java.lang.annotation.RetentionPolicy;
30f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake
3124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown/**
3224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * A class to encapsulate rating information used as content metadata.
3324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * A rating is defined by its rating style (see {@link #RATING_HEART},
3424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * {@link #RATING_THUMB_UP_DOWN}, {@link #RATING_3_STARS}, {@link #RATING_4_STARS},
3524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * {@link #RATING_5_STARS} or {@link #RATING_PERCENTAGE}) and the actual rating value (which may
3624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * be defined as "unrated"), both of which are defined when the rating instance is constructed
3724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * through one of the factory methods.
3824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown */
3924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownpublic final class RatingCompat implements Parcelable {
4024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final static String TAG = "Rating";
4124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
4224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
43f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake     * @hide
44f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake     */
458e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas    @RestrictTo(LIBRARY_GROUP)
46f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    @IntDef({RATING_NONE, RATING_HEART, RATING_THUMB_UP_DOWN, RATING_3_STARS, RATING_4_STARS,
47f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake            RATING_5_STARS, RATING_PERCENTAGE})
48f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    @Retention(RetentionPolicy.SOURCE)
49f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    public @interface Style {}
50f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake
51f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    /**
52f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake     * @hide
53f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake     */
548e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas    @RestrictTo(LIBRARY_GROUP)
55f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    @IntDef({RATING_3_STARS, RATING_4_STARS, RATING_5_STARS})
56f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    @Retention(RetentionPolicy.SOURCE)
57f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    public @interface StarStyle {}
58f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake
59f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    /**
6024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Indicates a rating style is not supported. A Rating will never have this
6124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * type, but can be used by other classes to indicate they do not support
6224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Rating.
6324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
6424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int RATING_NONE = 0;
6524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
6624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
6724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * A rating style with a single degree of rating, "heart" vs "no heart". Can be used to
6824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * indicate the content referred to is a favorite (or not).
6924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
7024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int RATING_HEART = 1;
7124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
7224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
7324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * A rating style for "thumb up" vs "thumb down".
7424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
7524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int RATING_THUMB_UP_DOWN = 2;
7624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
7724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
7824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * A rating style with 0 to 3 stars.
7924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
8024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int RATING_3_STARS = 3;
8124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
8324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * A rating style with 0 to 4 stars.
8424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
8524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int RATING_4_STARS = 4;
8624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
8724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
8824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * A rating style with 0 to 5 stars.
8924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
9024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int RATING_5_STARS = 5;
9124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
9324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * A rating style expressed as a percentage.
9424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
9524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public final static int RATING_PERCENTAGE = 6;
9624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final static float RATING_NOT_RATED = -1.0f;
9824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
9924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final int mRatingStyle;
10024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private final float mRatingValue;
10124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    private Object mRatingObj; // framework Rating object
10324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
104b768ed3824de2c109411654b3830feabe564ff0aAurimas Liutikas    RatingCompat(@Style int ratingStyle, float rating) {
10524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mRatingStyle = ratingStyle;
10624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        mRatingValue = rating;
10724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
10824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
10924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
11024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public String toString() {
11124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return "Rating:style=" + mRatingStyle + " rating="
11224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                + (mRatingValue < 0.0f ? "unrated" : String.valueOf(mRatingValue));
11324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
11424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
11524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
11624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public int describeContents() {
11724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mRatingStyle;
11824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
11924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
12024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    @Override
12124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public void writeToParcel(Parcel dest, int flags) {
12224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeInt(mRatingStyle);
12324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        dest.writeFloat(mRatingValue);
12424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
12524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
12624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static final Parcelable.Creator<RatingCompat> CREATOR
12724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            = new Parcelable.Creator<RatingCompat>() {
12824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        /**
12924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * Rebuilds a Rating previously stored with writeToParcel().
13024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @param p    Parcel object to read the Rating from
13124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         * @return a new Rating created from the data in the parcel
13224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown         */
13324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
13424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public RatingCompat createFromParcel(Parcel p) {
13524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return new RatingCompat(p.readInt(), p.readFloat());
13624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
13724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
13824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        @Override
13924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        public RatingCompat[] newArray(int size) {
14024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return new RatingCompat[size];
14124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
14224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    };
14324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
14424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
14524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return a Rating instance with no rating.
14624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Create and return a new Rating instance with no rating known for the given
14724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * rating style.
14824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param ratingStyle one of {@link #RATING_HEART}, {@link #RATING_THUMB_UP_DOWN},
14924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    {@link #RATING_3_STARS}, {@link #RATING_4_STARS}, {@link #RATING_5_STARS},
15024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    or {@link #RATING_PERCENTAGE}.
15124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return null if an invalid rating style is passed, a new Rating instance otherwise.
15224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
153f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    public static RatingCompat newUnratedRating(@Style int ratingStyle) {
15424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        switch(ratingStyle) {
15524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_HEART:
15624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_THUMB_UP_DOWN:
15724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_3_STARS:
15824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_4_STARS:
15924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_5_STARS:
16024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_PERCENTAGE:
16124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                return new RatingCompat(ratingStyle, RATING_NOT_RATED);
16224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            default:
16324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                return null;
16424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
16524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
16624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
16724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
16824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return a Rating instance with a heart-based rating.
16924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Create and return a new Rating instance with a rating style of {@link #RATING_HEART},
17024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * and a heart-based rating.
17124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param hasHeart true for a "heart selected" rating, false for "heart unselected".
17224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return a new Rating instance.
17324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
17424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static RatingCompat newHeartRating(boolean hasHeart) {
17524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return new RatingCompat(RATING_HEART, hasHeart ? 1.0f : 0.0f);
17624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
17724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
17824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
17924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return a Rating instance with a thumb-based rating.
18024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Create and return a new Rating instance with a {@link #RATING_THUMB_UP_DOWN}
18124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * rating style, and a "thumb up" or "thumb down" rating.
18224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param thumbIsUp true for a "thumb up" rating, false for "thumb down".
18324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return a new Rating instance.
18424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
18524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static RatingCompat newThumbRating(boolean thumbIsUp) {
18624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return new RatingCompat(RATING_THUMB_UP_DOWN, thumbIsUp ? 1.0f : 0.0f);
18724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
18824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
18924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
19024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return a Rating instance with a star-based rating.
19124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Create and return a new Rating instance with one of the star-base rating styles
19224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * and the given integer or fractional number of stars. Non integer values can for instance
19324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * be used to represent an average rating value, which might not be an integer number of stars.
19424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param starRatingStyle one of {@link #RATING_3_STARS}, {@link #RATING_4_STARS},
19524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *     {@link #RATING_5_STARS}.
19624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param starRating a number ranging from 0.0f to 3.0f, 4.0f or 5.0f according to
19724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *     the rating style.
19824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return null if the rating style is invalid, or the rating is out of range,
19924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *     a new Rating instance otherwise.
20024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
201f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    public static RatingCompat newStarRating(@StarStyle int starRatingStyle,
202f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake            float starRating) {
20324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        float maxRating = -1.0f;
20424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        switch(starRatingStyle) {
20524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_3_STARS:
20624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                maxRating = 3.0f;
20724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                break;
20824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_4_STARS:
20924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                maxRating = 4.0f;
21024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                break;
21124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_5_STARS:
21224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                maxRating = 5.0f;
21324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                break;
21424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            default:
21524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                Log.e(TAG, "Invalid rating style (" + starRatingStyle + ") for a star rating");
21624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                        return null;
21724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
21824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if ((starRating < 0.0f) || (starRating > maxRating)) {
21924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            Log.e(TAG, "Trying to set out of range star-based rating");
22024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return null;
22124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
22224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return new RatingCompat(starRatingStyle, starRating);
22324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
22424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
22524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
22624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return a Rating instance with a percentage-based rating.
22724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Create and return a new Rating instance with a {@link #RATING_PERCENTAGE}
22824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * rating style, and a rating of the given percentage.
22924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param percent the value of the rating
23024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return null if the rating is out of range, a new Rating instance otherwise.
23124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
23224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static RatingCompat newPercentageRating(float percent) {
23324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if ((percent < 0.0f) || (percent > 100.0f)) {
23424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            Log.e(TAG, "Invalid percentage-based rating value");
23524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return null;
23624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        } else {
23724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return new RatingCompat(RATING_PERCENTAGE, percent);
23824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
23924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
24024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
24124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
24224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return whether there is a rating value available.
24324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return true if the instance was not created with {@link #newUnratedRating(int)}.
24424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
24524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public boolean isRated() {
24624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mRatingValue >= 0.0f;
24724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
24824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
24924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
25024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return the rating style.
25124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return one of {@link #RATING_HEART}, {@link #RATING_THUMB_UP_DOWN},
25224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    {@link #RATING_3_STARS}, {@link #RATING_4_STARS}, {@link #RATING_5_STARS},
25324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    or {@link #RATING_PERCENTAGE}.
25424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
255f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake    @Style
25624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public int getRatingStyle() {
25724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mRatingStyle;
25824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
25924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
26024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
26124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return whether the rating is "heart selected".
26224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return true if the rating is "heart selected", false if the rating is "heart unselected",
26324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    if the rating style is not {@link #RATING_HEART} or if it is unrated.
26424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
26524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public boolean hasHeart() {
26624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if (mRatingStyle != RATING_HEART) {
26724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return false;
26824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        } else {
26924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return (mRatingValue == 1.0f);
27024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
27124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
27224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
27324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
27424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return whether the rating is "thumb up".
27524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return true if the rating is "thumb up", false if the rating is "thumb down",
27624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    if the rating style is not {@link #RATING_THUMB_UP_DOWN} or if it is unrated.
27724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
27824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public boolean isThumbUp() {
27924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if (mRatingStyle != RATING_THUMB_UP_DOWN) {
28024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return false;
28124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        } else {
28224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return (mRatingValue == 1.0f);
28324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
28424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
28524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
28624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
28724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return the star-based rating value.
28824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return a rating value greater or equal to 0.0f, or a negative value if the rating style is
28924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    not star-based, or if it is unrated.
29024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
29124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public float getStarRating() {
29224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        switch (mRatingStyle) {
29324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_3_STARS:
29424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_4_STARS:
29524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            case RATING_5_STARS:
29624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                if (isRated()) {
29724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                    return mRatingValue;
29824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                }
29998ec0d5b378c8417156037af6389e90f0074a26eAurimas Liutikas                // fall through
30024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            default:
30124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown                return -1.0f;
30224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
30324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
30424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
30524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
30624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Return the percentage-based rating value.
30724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return a rating value greater or equal to 0.0f, or a negative value if the rating style is
30824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *    not percentage-based, or if it is unrated.
30924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
31024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public float getPercentRating() {
31124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        if ((mRatingStyle != RATING_PERCENTAGE) || !isRated()) {
31224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return -1.0f;
31324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        } else {
31424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            return mRatingValue;
31524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
31624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
31724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
31824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
31924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Creates an instance from a framework {@link android.media.Rating} object.
32024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <p>
3213b07c9380b4690ae313a53c128f1112828259e4cSungsoo Lim     * This method is only supported on API 19+.
32224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </p>
32324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
32424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @param ratingObj A {@link android.media.Rating} object, or null if none.
32524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return An equivalent {@link RatingCompat} object, or null if none.
32624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
32724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public static RatingCompat fromRating(Object ratingObj) {
328c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        if (ratingObj != null && Build.VERSION.SDK_INT >= 19) {
329c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            final int ratingStyle = RatingCompatKitkat.getRatingStyle(ratingObj);
330c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            final RatingCompat rating;
331c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            if (RatingCompatKitkat.isRated(ratingObj)) {
332c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                switch (ratingStyle) {
333c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_HEART:
334c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        rating = newHeartRating(RatingCompatKitkat.hasHeart(ratingObj));
335c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        break;
336c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_THUMB_UP_DOWN:
337c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        rating = newThumbRating(RatingCompatKitkat.isThumbUp(ratingObj));
338c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        break;
339c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_3_STARS:
340c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_4_STARS:
341c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_5_STARS:
342c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        rating = newStarRating(ratingStyle,
343c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                                RatingCompatKitkat.getStarRating(ratingObj));
344c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        break;
345c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_PERCENTAGE:
346c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        rating = newPercentageRating(
347c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                                RatingCompatKitkat.getPercentRating(ratingObj));
348c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        break;
349c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    default:
350c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        return null;
351c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                }
352c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            } else {
353c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                rating = newUnratedRating(ratingStyle);
35424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            }
355c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            rating.mRatingObj = ratingObj;
356c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            return rating;
35724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        } else {
358c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            return null;
35924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
36024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
36124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown
36224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    /**
36324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * Gets the underlying framework {@link android.media.Rating} object.
36424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * <p>
3653b07c9380b4690ae313a53c128f1112828259e4cSungsoo Lim     * This method is only supported on API 19+.
36624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * </p>
36724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     *
36824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     * @return An equivalent {@link android.media.Rating} object, or null if none.
36924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown     */
37024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    public Object getRating() {
371c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        if (mRatingObj == null && Build.VERSION.SDK_INT >= 19) {
372c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            if (isRated()) {
373c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                switch (mRatingStyle) {
374c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_HEART:
375c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        mRatingObj = RatingCompatKitkat.newHeartRating(hasHeart());
376c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        break;
377c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_THUMB_UP_DOWN:
378c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        mRatingObj = RatingCompatKitkat.newThumbRating(isThumbUp());
379c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        break;
380c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_3_STARS:
381c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_4_STARS:
382c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_5_STARS:
383c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        mRatingObj = RatingCompatKitkat.newStarRating(mRatingStyle,
384c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                                getStarRating());
385c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        break;
386c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    case RATING_PERCENTAGE:
387c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        mRatingObj = RatingCompatKitkat.newPercentageRating(getPercentRating());
38898ec0d5b378c8417156037af6389e90f0074a26eAurimas Liutikas                        break;
389c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    default:
390c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                        return null;
391c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                }
392c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            } else {
393c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                mRatingObj = RatingCompatKitkat.newUnratedRating(mRatingStyle);
39424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown            }
39524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        }
39624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown        return mRatingObj;
39724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown    }
398f0e4dea75691d2fd1256508136ecce88bef6067bIan Lake}
399