1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/* 2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License. 6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at 7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software 11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and 14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License. 15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.parental; 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context; 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvContentRating; 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvInputManager; 22944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.common.experiments.Experiments; 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.parental.ContentRatingSystem.Rating; 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.parental.ContentRatingSystem.SubRating; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.TvSettings; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.TvSettings.ContentRatingLevel; 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.HashSet; 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Set; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class ParentalControlSettings { 3195961816a768da387f0b5523cf4363ace2044089Nick Chalko /** The rating and all of its sub-ratings are blocked. */ 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public static final int RATING_BLOCKED = 0; 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 3495961816a768da387f0b5523cf4363ace2044089Nick Chalko /** The rating is blocked but not all of its sub-ratings are blocked. */ 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public static final int RATING_BLOCKED_PARTIAL = 1; 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 3795961816a768da387f0b5523cf4363ace2044089Nick Chalko /** The rating is not blocked. */ 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public static final int RATING_NOT_BLOCKED = 2; 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final Context mContext; 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final TvInputManager mTvInputManager; 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // mRatings is expected to be synchronized with mTvInputManager.getBlockedRatings(). 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Set<TvContentRating> mRatings; 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private Set<TvContentRating> mCustomRatings; 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public ParentalControlSettings(Context context) { 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mContext = context; 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTvInputManager = (TvInputManager) mContext.getSystemService(Context.TV_INPUT_SERVICE); 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public boolean isParentalControlsEnabled() { 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return mTvInputManager.isParentalControlsEnabled(); 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void setParentalControlsEnabled(boolean enabled) { 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTvInputManager.setParentalControlsEnabled(enabled); 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 6095961816a768da387f0b5523cf4363ace2044089Nick Chalko public void setContentRatingSystemEnabled( 6195961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingsManager manager, 6295961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingSystem contentRatingSystem, 6395961816a768da387f0b5523cf4363ace2044089Nick Chalko boolean enabled) { 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (enabled) { 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko TvSettings.addContentRatingSystem(mContext, contentRatingSystem.getId()); 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Ensure newly added system has ratings for current level set 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko updateRatingsForCurrentLevel(manager); 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // Ensure no ratings are blocked for the selected rating system 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (TvContentRating tvContentRating : mTvInputManager.getBlockedRatings()) { 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (contentRatingSystem.ownsRating(tvContentRating)) { 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTvInputManager.removeBlockedRating(tvContentRating); 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko TvSettings.removeContentRatingSystem(mContext, contentRatingSystem.getId()); 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public boolean isContentRatingSystemEnabled(ContentRatingSystem contentRatingSystem) { 82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return TvSettings.hasContentRatingSystem(mContext, contentRatingSystem.getId()); 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void loadRatings() { 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mRatings = new HashSet<>(mTvInputManager.getBlockedRatings()); 87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void storeRatings() { 90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Set<TvContentRating> removed = new HashSet<>(mTvInputManager.getBlockedRatings()); 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko removed.removeAll(mRatings); 92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (TvContentRating tvContentRating : removed) { 93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTvInputManager.removeBlockedRating(tvContentRating); 94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Set<TvContentRating> added = new HashSet<>(mRatings); 97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko added.removeAll(mTvInputManager.getBlockedRatings()); 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (TvContentRating tvContentRating : added) { 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTvInputManager.addBlockedRating(tvContentRating); 100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void updateRatingsForCurrentLevel(ContentRatingsManager manager) { 104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @ContentRatingLevel int currentLevel = getContentRatingLevel(); 105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (currentLevel != TvSettings.CONTENT_RATING_LEVEL_CUSTOM) { 106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mRatings = ContentRatingLevelPolicy.getRatingsForLevel(this, manager, currentLevel); 107633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (currentLevel != TvSettings.CONTENT_RATING_LEVEL_NONE) { 108633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // UNRATED contents should be blocked unless the rating level is none or custom 109633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mRatings.add(TvContentRating.UNRATED); 110633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko storeRatings(); 112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 11595961816a768da387f0b5523cf4363ace2044089Nick Chalko public void setContentRatingLevel( 11695961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingsManager manager, @ContentRatingLevel int level) { 117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @ContentRatingLevel int currentLevel = getContentRatingLevel(); 118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (level == currentLevel) { 119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return; 120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (currentLevel == TvSettings.CONTENT_RATING_LEVEL_CUSTOM) { 122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mCustomRatings = mRatings; 123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko TvSettings.setContentRatingLevel(mContext, level); 125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (level == TvSettings.CONTENT_RATING_LEVEL_CUSTOM) { 126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mCustomRatings != null) { 127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mRatings = new HashSet<>(mCustomRatings); 128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mRatings = ContentRatingLevelPolicy.getRatingsForLevel(this, manager, level); 131633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (level != TvSettings.CONTENT_RATING_LEVEL_NONE 132633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko && Boolean.TRUE.equals(Experiments.ENABLE_UNRATED_CONTENT_SETTINGS.get())) { 133633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // UNRATED contents should be blocked unless the rating level is none or custom 134633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mRatings.add(TvContentRating.UNRATED); 135633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko storeRatings(); 138816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @ContentRatingLevel 141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public int getContentRatingLevel() { 142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return TvSettings.getContentRatingLevel(mContext); 143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 145633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko /** Sets the blocked status of a unrated contents. */ 146633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public boolean setUnratedBlocked(boolean blocked) { 147633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko boolean changed; 148633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (blocked) { 149633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko changed = mRatings.add(TvContentRating.UNRATED); 150633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mTvInputManager.addBlockedRating(TvContentRating.UNRATED); 151633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } else { 152633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko changed = mRatings.remove(TvContentRating.UNRATED); 153633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mTvInputManager.removeBlockedRating(TvContentRating.UNRATED); 154633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 155633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (changed) { 156633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko // change to custom level if the blocked status is changed 157633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko changeToCustomLevel(); 158633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 159633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return changed; 160633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 161633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 162816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 163816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Sets the blocked status of a given content rating. 16495961816a768da387f0b5523cf4363ace2044089Nick Chalko * 16595961816a768da387f0b5523cf4363ace2044089Nick Chalko * <p>Note that a call to this method automatically changes the current rating level to {@code 16695961816a768da387f0b5523cf4363ace2044089Nick Chalko * TvSettings.CONTENT_RATING_LEVEL_CUSTOM} if needed. 167816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 168816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param contentRatingSystem The content rating system where the given rating belongs. 169816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param rating The content rating to set. 170816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @return {@code true} if changed, {@code false} otherwise. 171816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @see #setSubRatingBlocked 172816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 17395961816a768da387f0b5523cf4363ace2044089Nick Chalko public boolean setRatingBlocked( 17495961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingSystem contentRatingSystem, Rating rating, boolean blocked) { 175816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return setRatingBlockedInternal(contentRatingSystem, rating, null, blocked); 176816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 177816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 178816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 179816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Checks whether any of given ratings is blocked. 180816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 181816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param ratings The array of ratings to check 182816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @return {@code true} if a rating is blocked, {@code false} otherwise. 183816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 184816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public boolean isRatingBlocked(TvContentRating[] ratings) { 185816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return getBlockedRating(ratings) != null; 186816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 187816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 188816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 189816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Checks whether any of given ratings is blocked and returns the first blocked rating. 190816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 191816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param ratings The array of ratings to check 192816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @return The {@link TvContentRating} that is blocked. 193816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 194816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public TvContentRating getBlockedRating(TvContentRating[] ratings) { 195633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (ratings == null || ratings.length <= 0) { 196633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return mTvInputManager.isRatingBlocked(TvContentRating.UNRATED) 197633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko ? TvContentRating.UNRATED 198633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko : null; 199816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 200816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (TvContentRating rating : ratings) { 201816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mTvInputManager.isRatingBlocked(rating)) { 202816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return rating; 203816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 204816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 205816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return null; 206816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 207816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 208816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 209816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Checks whether a given rating is blocked by the user or not. 210816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 211816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param contentRatingSystem The content rating system where the given rating belongs. 212816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param rating The content rating to check. 213816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @return {@code true} if blocked, {@code false} otherwise. 214816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 215816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public boolean isRatingBlocked(ContentRatingSystem contentRatingSystem, Rating rating) { 216816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return mRatings.contains(toTvContentRating(contentRatingSystem, rating)); 217816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 218816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 219816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 220816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Sets the blocked status of a given content sub-rating. 22195961816a768da387f0b5523cf4363ace2044089Nick Chalko * 22295961816a768da387f0b5523cf4363ace2044089Nick Chalko * <p>Note that a call to this method automatically changes the current rating level to {@code 22395961816a768da387f0b5523cf4363ace2044089Nick Chalko * TvSettings.CONTENT_RATING_LEVEL_CUSTOM} if needed. 224816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 225816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param contentRatingSystem The content rating system where the given rating belongs. 226816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param rating The content rating associated with the given sub-rating. 227816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param subRating The content sub-rating to set. 228816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @return {@code true} if changed, {@code false} otherwise. 229816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @see #setRatingBlocked 230816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 23195961816a768da387f0b5523cf4363ace2044089Nick Chalko public boolean setSubRatingBlocked( 23295961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingSystem contentRatingSystem, 23395961816a768da387f0b5523cf4363ace2044089Nick Chalko Rating rating, 23495961816a768da387f0b5523cf4363ace2044089Nick Chalko SubRating subRating, 23595961816a768da387f0b5523cf4363ace2044089Nick Chalko boolean blocked) { 236816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return setRatingBlockedInternal(contentRatingSystem, rating, subRating, blocked); 237816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 238816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 239816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 240816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Checks whether a given content sub-rating is blocked by the user or not. 241816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 242816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param contentRatingSystem The content rating system where the given rating belongs. 243816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param rating The content rating associated with the given sub-rating. 244816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @param subRating The content sub-rating to check. 245816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * @return {@code true} if blocked, {@code false} otherwise. 246816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 24795961816a768da387f0b5523cf4363ace2044089Nick Chalko public boolean isSubRatingEnabled( 24895961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingSystem contentRatingSystem, Rating rating, SubRating subRating) { 249816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return mRatings.contains(toTvContentRating(contentRatingSystem, rating, subRating)); 250816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 251816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 25295961816a768da387f0b5523cf4363ace2044089Nick Chalko private boolean setRatingBlockedInternal( 25395961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingSystem contentRatingSystem, 25495961816a768da387f0b5523cf4363ace2044089Nick Chalko Rating rating, 25595961816a768da387f0b5523cf4363ace2044089Nick Chalko SubRating subRating, 25695961816a768da387f0b5523cf4363ace2044089Nick Chalko boolean blocked) { 25795961816a768da387f0b5523cf4363ace2044089Nick Chalko TvContentRating tvContentRating = 25895961816a768da387f0b5523cf4363ace2044089Nick Chalko (subRating == null) 25995961816a768da387f0b5523cf4363ace2044089Nick Chalko ? toTvContentRating(contentRatingSystem, rating) 26095961816a768da387f0b5523cf4363ace2044089Nick Chalko : toTvContentRating(contentRatingSystem, rating, subRating); 261816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko boolean changed; 262816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (blocked) { 263816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko changed = mRatings.add(tvContentRating); 264816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTvInputManager.addBlockedRating(tvContentRating); 265816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 266816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko changed = mRatings.remove(tvContentRating); 267816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTvInputManager.removeBlockedRating(tvContentRating); 268816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 269816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (changed) { 270816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko changeToCustomLevel(); 271816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 272816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return changed; 273816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 274816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 275816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void changeToCustomLevel() { 276816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (getContentRatingLevel() != TvSettings.CONTENT_RATING_LEVEL_CUSTOM) { 277816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko TvSettings.setContentRatingLevel(mContext, TvSettings.CONTENT_RATING_LEVEL_CUSTOM); 278816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 279816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 280816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 281816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 28295961816a768da387f0b5523cf4363ace2044089Nick Chalko * Returns the blocked status of a given rating. The status can be one of the followings: {@link 28395961816a768da387f0b5523cf4363ace2044089Nick Chalko * #RATING_BLOCKED}, {@link #RATING_BLOCKED_PARTIAL} and {@link #RATING_NOT_BLOCKED} 284816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 285816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public int getBlockedStatus(ContentRatingSystem contentRatingSystem, Rating rating) { 286816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (isRatingBlocked(contentRatingSystem, rating)) { 287816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return RATING_BLOCKED; 288816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 289816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (SubRating subRating : rating.getSubRatings()) { 290816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (isSubRatingEnabled(contentRatingSystem, rating, subRating)) { 291816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return RATING_BLOCKED_PARTIAL; 292816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 293816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 294816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return RATING_NOT_BLOCKED; 295816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 296816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 29795961816a768da387f0b5523cf4363ace2044089Nick Chalko private TvContentRating toTvContentRating( 29895961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingSystem contentRatingSystem, Rating rating) { 29995961816a768da387f0b5523cf4363ace2044089Nick Chalko return TvContentRating.createRating( 30095961816a768da387f0b5523cf4363ace2044089Nick Chalko contentRatingSystem.getDomain(), contentRatingSystem.getName(), rating.getName()); 301816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 302816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 30395961816a768da387f0b5523cf4363ace2044089Nick Chalko private TvContentRating toTvContentRating( 30495961816a768da387f0b5523cf4363ace2044089Nick Chalko ContentRatingSystem contentRatingSystem, Rating rating, SubRating subRating) { 30595961816a768da387f0b5523cf4363ace2044089Nick Chalko return TvContentRating.createRating( 30695961816a768da387f0b5523cf4363ace2044089Nick Chalko contentRatingSystem.getDomain(), 30795961816a768da387f0b5523cf4363ace2044089Nick Chalko contentRatingSystem.getName(), 30895961816a768da387f0b5523cf4363ace2044089Nick Chalko rating.getName(), 30995961816a768da387f0b5523cf4363ace2044089Nick Chalko subRating.getName()); 310816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 311816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 312