/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.media.tv; import android.annotation.NonNull; import android.annotation.SystemApi; import android.text.TextUtils; import com.android.internal.util.Preconditions; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; /** * A class representing a TV content rating. When a TV input service inserts the content rating * information on a program into the database, this class can be used to generate the formatted * string for * {@link TvContract.Programs#COLUMN_CONTENT_RATING TvContract.Programs.COLUMN_CONTENT_RATING}. * To create a {@code TvContentRating} object, use the * {@link #createRating TvContentRating.createRating} method with valid rating system string * constants. * *
It is possible for an application to define its own content rating system by supplying a * content rating system definition XML resource (see example below) and declaring a broadcast * receiver that filters {@link TvInputManager#ACTION_QUERY_CONTENT_RATING_SYSTEMS} in its manifest. * *
* {@literal ** ** }* ** * * * * * * * ** * * ** * * * * ** * * * * ** * * * ** * * ** * * *
For example, to create an object that represents TV-PG rating with suggestive dialogue and * coarse language from the TV Parental Guidelines in the United States, one can use the following * code snippet: * *
* TvContentRating rating = TvContentRating.createRating( * "com.android.tv", * "US_TV", * "US_TV_PG", * "US_TV_D", "US_TV_L"); **
Constant Value | *Description | *
---|---|
com.android.tv | *Used for creating system defined content ratings | *
Constant Value | *Description | *
---|---|
AR_TV | *TV content rating system for Argentina | *
AU_TV | *TV content rating system for Australia | *
BR_TV | *TV content rating system for Brazil | *
CA_TV_EN | *TV content rating system for Canada (English) | *
CA_TV_FR | *TV content rating system for Canada (French) | *
DVB | *DVB content rating system | *
ES_DVB | *DVB content rating system for Spain | *
FR_DVB | *DVB content rating system for France | *
ISDB | *ISDB content rating system | *
KR_TV | *TV content rating system for South Korea | *
SG_TV | *TV content rating system for Singapore | *
US_MV | *Movie content rating system for the United States | *
US_TV | *TV content rating system for the United States | *
Rating System | *Constant Value | *Description | *
---|---|---|
AR_TV | *AR_TV_ATP | *Suitable for all audiences. Programs may contain mild violence, language and mature * situations | *
AR_TV_SAM_13 | *Suitable for ages 13 and up. Programs may contain mild to moderate language and mild * violence and sexual references | *|
AR_TV_SAM_16 | *Suitable for ages 16 and up. Programs may contain more intensive violence and coarse * language, partial nudity and moderate sexual references | *|
AR_TV_SAM_18 | *Suitable for mature audiences only. Programs contain strong violence, coarse language * and explicit sexual references | *|
AU_TV | *AU_TV_P | *Recommended for younger children aged between 2 and 11 years | *
AU_TV_C | *Recommended for older children aged between 5 and 14 years | *|
AU_TV_G | *Recommended for all ages | *|
AU_TV_PG | *Parental guidance is recommended for young viewers under 15 | *|
AU_TV_M | *Recommended for mature audiences aged 15 years and over | *|
AU_TV_MA | *Not suitable for children and teens under 15, due to sexual descriptions, course * language, adult themes or drug use | *|
AU_TV_AV | *Not suitable for children and teens under 15. This category is used specifically for * violent programs | *|
AU_TV_R | *Not for children under 18. Content may include graphic violence, sexual situations, * coarse language and explicit drug use | *|
BR_TV | *BR_TV_L | *Content is suitable for all audiences | *
BR_TV_10 | *Content suitable for viewers over the age of 10 | *|
BR_TV_12 | *Content suitable for viewers over the age of 12 | *|
BR_TV_14 | *Content suitable for viewers over the age of 14 | *|
BR_TV_16 | *Content suitable for viewers over the age of 16 | *|
BR_TV_18 | *Content suitable for viewers over the age of 18 | *|
CA_TV_EN | *CA_TV_EN_EXEMPT | *Exempt from ratings | *
CA_TV_EN_C | *Suitable for children ages 2–7 | *|
CA_TV_EN_C8 | *Suitable for children ages 8 and older | *|
CA_TV_EN_G | *Suitable for the entire family | *|
CA_TV_EN_PG | *May contain moderate violence, profanity, nudity, and sexual references | *|
CA_TV_EN_14 | *Intended for viewers ages 14 and older | *|
CA_TV_EN_18 | *Intended for viewers ages 18 and older | *|
CA_TV_FR | *CA_TV_FR_E | *Exempt from ratings | *
CA_TV_FR_G | *Appropriate for all ages | *|
CA_TV_FR_8 | *Appropriate for children 8 | *|
CA_TV_FR_13 | *Suitable for children 13 | *|
CA_TV_FR_16 | *Recommended for children over the age of 16 | *|
CA_TV_FR_18 | *Only to be viewed by adults | *|
DVB | *DVB_4 | *Recommended for ages 4 and over | *
DVB_5 | *Recommended for ages 5 and over | *|
DVB_6 | *Recommended for ages 6 and over | *|
DVB_7 | *Recommended for ages 7 and over | *|
DVB_8 | *Recommended for ages 8 and over | *|
DVB_9 | *Recommended for ages 9 and over | *|
DVB_10 | *Recommended for ages 10 and over | *|
DVB_11 | *Recommended for ages 11 and over | *|
DVB_12 | *Recommended for ages 12 and over | *|
DVB_13 | *Recommended for ages 13 and over | *|
DVB_14 | *Recommended for ages 14 and over | *|
DVB_15 | *Recommended for ages 15 and over | *|
DVB_16 | *Recommended for ages 16 and over | *|
DVB_17 | *Recommended for ages 17 and over | *|
DVB_18 | *Recommended for ages 18 and over | *|
ES_DVB | *ES_DVB_ALL | *Recommended for all ages | *
ES_DVB_C | *Recommended for children | *|
ES_DVB_X | *Recommended for adults | *|
ES_DVB_4 | *Recommended for ages 4 and over | *|
ES_DVB_5 | *Recommended for ages 5 and over | *|
ES_DVB_6 | *Recommended for ages 6 and over | *|
ES_DVB_7 | *Recommended for ages 7 and over | *|
ES_DVB_8 | *Recommended for ages 8 and over | *|
ES_DVB_9 | *Recommended for ages 9 and over | *|
ES_DVB_10 | *Recommended for ages 10 and over | *|
ES_DVB_11 | *Recommended for ages 11 and over | *|
ES_DVB_12 | *Recommended for ages 12 and over | *|
ES_DVB_13 | *Recommended for ages 13 and over | *|
ES_DVB_14 | *Recommended for ages 14 and over | *|
ES_DVB_15 | *Recommended for ages 15 and over | *|
ES_DVB_16 | *Recommended for ages 16 and over | *|
ES_DVB_17 | *Recommended for ages 17 and over | *|
ES_DVB_18 | *Recommended for ages 18 and over | *|
FR_DVB | *FR_DVB_U | *Recommended for all ages | *
FR_DVB_4 | *Recommended for ages 4 and over | *|
FR_DVB_5 | *Recommended for ages 5 and over | *|
FR_DVB_6 | *Recommended for ages 6 and over | *|
FR_DVB_7 | *Recommended for ages 7 and over | *|
FR_DVB_8 | *Recommended for ages 8 and over | *|
FR_DVB_9 | *Recommended for ages 9 and over | *|
FR_DVB_10 | *Recommended for ages 10 and over | *|
FR_DVB_11 | *Recommended for ages 11 and over | *|
FR_DVB_12 | *Recommended for ages 12 and over | *|
FR_DVB_13 | *Recommended for ages 13 and over | *|
FR_DVB_14 | *Recommended for ages 14 and over | *|
FR_DVB_15 | *Recommended for ages 15 and over | *|
FR_DVB_16 | *Recommended for ages 16 and over | *|
FR_DVB_17 | *Recommended for ages 17 and over | *|
FR_DVB_18 | *Recommended for ages 18 and over | *|
ISDB | *ISDB_4 | *Recommended for ages 4 and over | *
ISDB_5 | *Recommended for ages 5 and over | *|
ISDB_6 | *Recommended for ages 6 and over | *|
ISDB_7 | *Recommended for ages 7 and over | *|
ISDB_8 | *Recommended for ages 8 and over | *|
ISDB_9 | *Recommended for ages 9 and over | *|
ISDB_10 | *Recommended for ages 10 and over | *|
ISDB_11 | *Recommended for ages 11 and over | *|
ISDB_12 | *Recommended for ages 12 and over | *|
ISDB_13 | *Recommended for ages 13 and over | *|
ISDB_14 | *Recommended for ages 14 and over | *|
ISDB_15 | *Recommended for ages 15 and over | *|
ISDB_16 | *Recommended for ages 16 and over | *|
ISDB_17 | *Recommended for ages 17 and over | *|
ISDB_18 | *Recommended for ages 18 and over | *|
ISDB_19 | *Recommended for ages 19 and over | *|
ISDB_20 | *Recommended for ages 20 and over | *|
KR_TV | *KR_TV_ALL | *Appropriate for all ages | *
KR_TV_7 | *May contain material inappropriate for children younger than 7, and parental * discretion should be used | *|
KR_TV_12 | *May deemed inappropriate for those younger than 12, and parental discretion should be * used | *|
KR_TV_15 | *May be inappropriate for children under 15, and that parental discretion should be * used | *|
KR_TV_19 | *For adults only | *|
SG_TV | *SG_TV_G | *Suitable for all ages | *
SG_TV_PG | *Suitable for all but parents should guide their young | *|
SG_TV_PG13 | *Suitable for persons aged 13 and above but parental guidance is advised for children * below 13 | *|
SG_TV_NC16 | *Suitable for persons aged 16 and above | *|
SG_TV_M18 | *Suitable for persons aged 18 and above | *|
SG_TV_R21 | *Suitable for adults aged 21 and above | *|
US_MV | *US_MV_G | *General audiences | *
US_MV_PG | *Parental guidance suggested | *|
US_MV_PG13 | *Parents strongly cautioned | *|
US_MV_R | *Restricted, under 17 requires accompanying parent or adult guardian | *|
US_MV_NC17 | *No one 17 and under admitted | *|
US_TV | *US_TV_Y | *This program is designed to be appropriate for all children | *
US_TV_Y7 | *This program is designed for children age 7 and above | *|
US_TV_G | *Most parents would find this program suitable for all ages | *|
US_TV_PG | *This program contains material that parents may find unsuitable for younger children * | *|
US_TV_14 | *This program contains some material that many parents would find unsuitable for * children under 14 years of age | *|
US_TV_MA | *This program is specifically designed to be viewed by adults and therefore may be * unsuitable for children under 17 | *
Rating System | *Constant Value | *Description | *
---|---|---|
BR_TV | *BR_TV_D | *Drugs Applicable to BR_TV_L, BR_TV_10, BR_TV_12, BR_TV_14, BR_TV_16, and BR_TV_18 * |
*
BR_TV_S | *Sex Applicable to BR_TV_L, BR_TV_10, BR_TV_12, BR_TV_14, BR_TV_16, and BR_TV_18 * |
* |
BR_TV_V | *Violence Applicable to BR_TV_L, BR_TV_10, BR_TV_12, BR_TV_14, BR_TV_16, and * BR_TV_18 |
* |
US_TV | *US_TV_D | *Suggestive dialogue (Usually means talks about sex) Applicable to US_TV_PG, and * US_TV_14 |
*
US_TV_L | *Coarse language Applicable to US_TV_PG, US_TV_14, and US_TV_MA |
* |
US_TV_S | *Sexual content Applicable to US_TV_PG, US_TV_14, and US_TV_MA |
* |
US_TV_V | *Violence Applicable to US_TV_PG, US_TV_14, and US_TV_MA |
* |
US_TV_FV | *Fantasy violence (Children's programming only) Applicable to US_TV_Y7 |
*
TV input services can call {@link TvInputManager#isRatingBlocked} with this constant to
* determine whether they should block unrated content. The subsequent call to
* {@link TvInputService.Session#notifyContentBlocked} with the same constant notifies
* applications that the current program content is blocked by parental controls.
*/
public static final TvContentRating UNRATED = new TvContentRating("null", "null", "null", null);
/**
* Creates a {@code TvContentRating} object with predefined content rating strings.
*
* @param domain The domain string. For example, "com.android.tv".
* @param ratingSystem The rating system string. For example, "US_TV".
* @param rating The content rating string. For example, "US_TV_PG".
* @param subRatings The sub-rating strings. For example, "US_TV_D" and "US_TV_L".
* @return A {@code TvContentRating} object.
* @throws IllegalArgumentException If {@code domain}, {@code ratingSystem} or {@code rating} is
* {@code null}.
*/
public static TvContentRating createRating(String domain, String ratingSystem,
String rating, String... subRatings) {
if (TextUtils.isEmpty(domain)) {
throw new IllegalArgumentException("domain cannot be empty");
}
if (TextUtils.isEmpty(ratingSystem)) {
throw new IllegalArgumentException("ratingSystem cannot be empty");
}
if (TextUtils.isEmpty(rating)) {
throw new IllegalArgumentException("rating cannot be empty");
}
return new TvContentRating(domain, ratingSystem, rating, subRatings);
}
/**
* Recovers a {@code TvContentRating} object from the string that was previously created from
* {@link #flattenToString}.
*
* @param ratingString The string returned by {@link #flattenToString}.
* @return the {@code TvContentRating} object containing the domain, rating system, rating and
* sub-ratings information encoded in {@code ratingString}.
* @see #flattenToString
*/
public static TvContentRating unflattenFromString(String ratingString) {
if (TextUtils.isEmpty(ratingString)) {
throw new IllegalArgumentException("ratingString cannot be empty");
}
String[] strs = ratingString.split(DELIMITER);
if (strs.length < 3) {
throw new IllegalArgumentException("Invalid rating string: " + ratingString);
}
if (strs.length > 3) {
String[] subRatings = new String[strs.length - 3];
System.arraycopy(strs, 3, subRatings, 0, subRatings.length);
return new TvContentRating(strs[0], strs[1], strs[2], subRatings);
}
return new TvContentRating(strs[0], strs[1], strs[2], null);
}
/**
* Constructs a TvContentRating object from a given rating and sub-rating constants.
*
* @param domain The string for domain of the content rating system such as "com.android.tv".
* @param ratingSystem The rating system string such as "US_TV".
* @param rating The content rating string such as "US_TV_PG".
* @param subRatings The sub-rating strings such as "US_TV_D" and "US_TV_L".
*/
private TvContentRating(
String domain, String ratingSystem, String rating, String[] subRatings) {
mDomain = domain;
mRatingSystem = ratingSystem;
mRating = rating;
if (subRatings == null || subRatings.length == 0) {
mSubRatings = null;
} else {
Arrays.sort(subRatings);
mSubRatings = subRatings;
}
mHashCode = 31 * Objects.hash(mDomain, mRating) + Arrays.hashCode(mSubRatings);
}
/**
* Returns the domain of this {@code TvContentRating} object.
*/
public String getDomain() {
return mDomain;
}
/**
* Returns the rating system of this {@code TvContentRating} object.
*/
public String getRatingSystem() {
return mRatingSystem;
}
/**
* Returns the main rating of this {@code TvContentRating} object.
*/
public String getMainRating() {
return mRating;
}
/**
* Returns the unmodifiable sub-rating string {@link List} of this {@code TvContentRating}
* object.
*/
public List For example, a {@code TvContentRating} object that represents TV-PG with
* S(Sexual content) and V(Violence) contains TV-PG, TV-PG/S, TV-PG/V and itself.
*
* @param rating The {@link TvContentRating} to check.
* @return {@code true} if this object contains {@code rating}, {@code false} otherwise.
*/
public final boolean contains(@NonNull TvContentRating rating) {
Preconditions.checkNotNull(rating);
if (!rating.getMainRating().equals(mRating)) {
return false;
}
if (!rating.getDomain().equals(mDomain) ||
!rating.getRatingSystem().equals(mRatingSystem) ||
!rating.getMainRating().equals(mRating)) {
return false;
}
List