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