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