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.ui.sidepanel.parentalcontrols;
18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.graphics.drawable.Drawable;
206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.media.tv.TvContentRating;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.Bundle;
222e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.util.ArrayMap;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.SparseIntArray;
24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View;
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.CompoundButton;
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.widget.ImageView;
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.MainActivity;
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R;
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.dialog.WebDialogFragment;
306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.experiments.Experiments;
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.license.LicenseUtils;
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.parental.ContentRatingSystem;
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.parental.ContentRatingSystem.Rating;
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.parental.ParentalControlSettings;
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.ui.sidepanel.CheckBoxItem;
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.ui.sidepanel.DividerItem;
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.ui.sidepanel.Item;
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.ui.sidepanel.RadioButtonItem;
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.ui.sidepanel.SideFragment;
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.TvSettings;
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.TvSettings.ContentRatingLevel;
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.ArrayList;
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.Collections;
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List;
452e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport java.util.Map;
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class RatingsFragment extends SideFragment {
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final SparseIntArray sLevelResourceIdMap;
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final SparseIntArray sDescriptionResourceIdMap;
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private static final String TRACKER_LABEL = "Ratings";
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private int mItemsSize;
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    static {
54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sLevelResourceIdMap = new SparseIntArray(5);
55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sLevelResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_NONE,
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_none);
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sLevelResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_HIGH,
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_high);
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sLevelResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_MEDIUM,
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_medium);
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sLevelResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_LOW,
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_low);
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sLevelResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_CUSTOM,
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_custom);
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sDescriptionResourceIdMap = new SparseIntArray(sLevelResourceIdMap.size());
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sDescriptionResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_HIGH,
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_high_description);
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sDescriptionResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_MEDIUM,
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_medium_description);
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sDescriptionResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_LOW,
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_low_description);
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        sDescriptionResourceIdMap.put(TvSettings.CONTENT_RATING_LEVEL_CUSTOM,
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                R.string.option_rating_custom_description);
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final List<RatingLevelItem> mRatingLevelItems = new ArrayList<>();
782e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    // A map from the rating system ID string to RatingItem objects.
792e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private final Map<String, List<RatingItem>> mContentRatingSystemItemMap = new ArrayMap<>();
806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    private CheckBoxItem mBlockUnratedItem;
812e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private ParentalControlSettings mParentalControlSettings;
82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public static String getDescription(MainActivity tvActivity) {
84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @ContentRatingLevel int currentLevel =
85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                tvActivity.getParentalControlSettings().getContentRatingLevel();
86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (sLevelResourceIdMap.indexOfKey(currentLevel) >= 0) {
87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return tvActivity.getString(sLevelResourceIdMap.get(currentLevel));
88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return null;
90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected String getTitle() {
94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return getString(R.string.option_ratings);
95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public String getTrackerLabel() {
99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return TRACKER_LABEL;
100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected List<Item> getItemList() {
104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<Item> items = new ArrayList<>();
105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1066ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        if (mBlockUnratedItem != null
1076ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                && Boolean.TRUE.equals(Experiments.ENABLE_UNRATED_CONTENT_SETTINGS.get())) {
1086ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            items.add(mBlockUnratedItem);
1096ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            items.add(new DividerItem());
1106ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
1116ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mRatingLevelItems.clear();
113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        for (int i = 0; i < sLevelResourceIdMap.size(); ++i) {
114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mRatingLevelItems.add(new RatingLevelItem(sLevelResourceIdMap.keyAt(i)));
115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        updateRatingLevels();
117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        items.addAll(mRatingLevelItems);
118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
1192e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mContentRatingSystemItemMap.clear();
1202e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<ContentRatingSystem> contentRatingSystems =
122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                getMainActivity().getContentRatingsManager().getContentRatingSystems();
123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        Collections.sort(contentRatingSystems, ContentRatingSystem.DISPLAY_NAME_COMPARATOR);
124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        for (ContentRatingSystem s : contentRatingSystems) {
1262e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            if (mParentalControlSettings.isContentRatingSystemEnabled(s)) {
1272e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                List<RatingItem> ratingItems = new ArrayList<>();
1282e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                boolean hasSubRating = false;
129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                items.add(new DividerItem(s.getDisplayName()));
130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                for (Rating rating : s.getRatings()) {
1312e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    RatingItem item = rating.getSubRatings().isEmpty() ?
132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                            new RatingItem(s, rating) :
133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                            new RatingWithSubItem(s, rating);
134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    items.add(item);
1352e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    if (rating.getSubRatings().isEmpty()) {
1362e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                        ratingItems.add(item);
1372e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    } else {
1382e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                        hasSubRating = true;
1392e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    }
1402e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                }
1412e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                // Only include rating systems that don't contain any sub ratings in the map for
1422e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                // simplicity.
1432e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                if (!hasSubRating) {
1442e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    mContentRatingSystemItemMap.put(s.getId(), ratingItems);
145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                }
146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (LicenseUtils.hasRatingAttribution(getMainActivity().getAssets())) {
149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            // Display the attribution if our content rating system is selected.
150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            items.add(new DividerItem());
151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            items.add(new AttributionItem(getMainActivity()));
152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
153816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mItemsSize = items.size();
154816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return items;
155816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
156816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
157816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
158816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onCreate(Bundle savedInstanceState) {
159816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super.onCreate(savedInstanceState);
1602e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mParentalControlSettings = getMainActivity().getParentalControlSettings();
1612e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        mParentalControlSettings.loadRatings();
1626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        if (Boolean.TRUE.equals(Experiments.ENABLE_UNRATED_CONTENT_SETTINGS.get())) {
1636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            mBlockUnratedItem =
1646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    new CheckBoxItem(
1656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            getResources().getString(R.string.option_block_unrated_programs)) {
1666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        @Override
1686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        protected void onUpdate() {
1696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            super.onUpdate();
1706ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            setChecked(
1716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                    mParentalControlSettings.isRatingBlocked(
1726ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                            new TvContentRating[] {TvContentRating.UNRATED}));
1736ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        }
1746ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1756ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        @Override
1766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        protected void onSelected() {
1776ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            super.onSelected();
1786ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            if (mParentalControlSettings.setUnratedBlocked(isChecked())) {
1796ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                updateRatingLevels();
1806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            }
1816ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        }
1826ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    };
1836ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
184816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
185816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
186816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
187816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public void onResume() {
188816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super.onResume();
189816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // Although we set the attribution item at the end of the item list non-focusable, we do get
190816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // its position when the fragment is resumed. This ensures that we do not select the
191816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        // non-focusable item at the end of the list. See b/17387103.
192816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (getSelectedPosition() >= mItemsSize) {
193816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            setSelectedPosition(mItemsSize - 1);
194816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
195816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
196816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
197816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private void updateRatingLevels() {
1982e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        @ContentRatingLevel int ratingLevel = mParentalControlSettings.getContentRatingLevel();
199816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        for (RatingLevelItem ratingLevelItem : mRatingLevelItems) {
200816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            ratingLevelItem.setChecked(ratingLevel == ratingLevelItem.mRatingLevel);
201816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
202816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
203816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
2042e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    private void updateDependentRatingItems(ContentRatingSystem.Order order,
2052e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            int selectedRatingOrderIndex, String contentRatingSystemId, boolean isChecked) {
2062e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        List<RatingItem> ratingItems = mContentRatingSystemItemMap.get(contentRatingSystemId);
2072e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        if (ratingItems != null) {
2082e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            for (RatingItem item : ratingItems) {
2092e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                int ratingOrderIndex = item.getRatingOrderIndex(order);
2102e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                if (ratingOrderIndex != -1
2112e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                        && ((ratingOrderIndex > selectedRatingOrderIndex && isChecked)
2122e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                        || (ratingOrderIndex < selectedRatingOrderIndex && !isChecked))) {
2132e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    item.setRatingBlocked(isChecked);
2142e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                }
2152e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            }
2162e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
2172e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
2182e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
219816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private class RatingLevelItem extends RadioButtonItem {
220816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private final int mRatingLevel;
221816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
222816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private RatingLevelItem(int ratingLevel) {
223816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super(getString(sLevelResourceIdMap.get(ratingLevel)),
224816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    (sDescriptionResourceIdMap.indexOfKey(ratingLevel) >= 0) ?
225816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                            getString(sDescriptionResourceIdMap.get(ratingLevel)) : null);
226816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mRatingLevel = ratingLevel;
227816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
228816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
229816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
230816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onSelected() {
231816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onSelected();
2322e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            mParentalControlSettings.setContentRatingLevel(
233816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    getMainActivity().getContentRatingsManager(), mRatingLevel);
2346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            if (mBlockUnratedItem != null
2356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    && Boolean.TRUE.equals(Experiments.ENABLE_UNRATED_CONTENT_SETTINGS.get())) {
2366ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                // set checked if UNRATED is blocked, and set unchecked otherwise.
2376ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mBlockUnratedItem.setChecked(
2386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        mParentalControlSettings.isRatingBlocked(
2396ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                new TvContentRating[] {TvContentRating.UNRATED}));
2406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            }
241816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            notifyItemsChanged(mRatingLevelItems.size());
242816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
243816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
244816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
245816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private class RatingItem extends CheckBoxItem {
246816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected final ContentRatingSystem mContentRatingSystem;
247816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected final Rating mRating;
248816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private final Drawable mIcon;
249816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private CompoundButton mCompoundButton;
2502e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        private final List<ContentRatingSystem.Order> mOrders = new ArrayList<>();
2512e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        private final List<Integer> mOrderIndexes = new ArrayList<>();
252816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
253816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private RatingItem(ContentRatingSystem contentRatingSystem, Rating rating) {
254816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super(rating.getTitle(), rating.getDescription());
255816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mContentRatingSystem = contentRatingSystem;
256816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mRating = rating;
257816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mIcon = rating.getIcon();
2582e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            for (ContentRatingSystem.Order order : mContentRatingSystem.getOrders()) {
2592e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                int orderIndex = order.getRatingIndex(mRating);
2602e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                if (orderIndex != -1) {
2612e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    mOrders.add(order);
2622e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    mOrderIndexes.add(orderIndex);
2632e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                }
2642e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            }
265816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
266816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
267816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
268816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onBind(View view) {
269816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onBind(view);
270816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
271816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mCompoundButton = (CompoundButton) view.findViewById(getCompoundButtonId());
272816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mCompoundButton.setVisibility(View.VISIBLE);
273816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
274816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            ImageView imageView = (ImageView) view.findViewById(R.id.icon);
275816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (mIcon != null) {
276816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                imageView.setVisibility(View.VISIBLE);
277816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                imageView.setImageDrawable(mIcon);
278816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            } else {
279816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                imageView.setVisibility(View.GONE);
280816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
281816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
282816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
283816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
284816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onUnbind() {
285816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onUnbind();
286816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mCompoundButton = null;
287816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
288816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
289816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
290816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onUpdate() {
291816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onUpdate();
292816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mCompoundButton.setButtonDrawable(getButtonDrawable());
2932e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            setChecked(mParentalControlSettings.isRatingBlocked(mContentRatingSystem, mRating));
294816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
295816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
296816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
297816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onSelected() {
298816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super.onSelected();
2992e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            if (mParentalControlSettings.setRatingBlocked(
3002e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                    mContentRatingSystem, mRating, isChecked())) {
301816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                updateRatingLevels();
302816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
3032e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            // Automatically check/uncheck dependent ratings.
3042e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            for (int i = 0; i < mOrders.size(); i++) {
3052e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                updateDependentRatingItems(mOrders.get(i), mOrderIndexes.get(i),
3062e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                        mContentRatingSystem.getId(), isChecked());
3072e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            }
308816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
309816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
310816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
311816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected int getResourceId() {
312816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return R.layout.option_item_rating;
313816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
314816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
315816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected int getButtonDrawable() {
316816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return R.drawable.btn_lock_material_anim;
317816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
3182e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
3192e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        private int getRatingOrderIndex(ContentRatingSystem.Order order) {
3202e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            int orderIndex = mOrders.indexOf(order);
3212e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            return orderIndex == -1 ? -1 : mOrderIndexes.get(orderIndex);
3222e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
3232e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
3242e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        private void setRatingBlocked(boolean isChecked) {
3252e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            if (isChecked() == isChecked) {
3262e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko                return;
3272e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            }
3282e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            mParentalControlSettings.setRatingBlocked(mContentRatingSystem, mRating, isChecked);
3292e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            notifyUpdated();
3302e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        }
331816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
332816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
333816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private class RatingWithSubItem extends RatingItem {
334816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private RatingWithSubItem(ContentRatingSystem contentRatingSystem, Rating rating) {
335816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            super(contentRatingSystem, rating);
336816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
337816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
338816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
339816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onSelected() {
340816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            getMainActivity().getOverlayManager().getSideFragmentManager()
3416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    .show(SubRatingsFragment.create(mContentRatingSystem, mRating.getName()));
342816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
343816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
344816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
345816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected int getButtonDrawable() {
3462e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            int blockedStatus = mParentalControlSettings.getBlockedStatus(
347816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    mContentRatingSystem, mRating);
348816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            if (blockedStatus == ParentalControlSettings.RATING_BLOCKED) {
349816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                return R.drawable.btn_lock_material;
350816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            } else if (blockedStatus == ParentalControlSettings.RATING_BLOCKED_PARTIAL) {
351816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                return R.drawable.btn_partial_lock_material;
352816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
353816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return R.drawable.btn_unlock_material;
354816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
355816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
356816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
357816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    /**
358816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     * Opens a dialog showing the sources of the rating descriptions.
359816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko     */
360816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public static class AttributionItem extends Item {
361816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        public final static String DIALOG_TAG = AttributionItem.class.getSimpleName();
362816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        public static final String TRACKER_LABEL = "Sources for content rating systems";
363816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        private final MainActivity mMainActivity;
364816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
365816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        public AttributionItem(MainActivity mainActivity) {
366816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mMainActivity = mainActivity;
367816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
368816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
369816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
370816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected int getResourceId() {
371816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            return R.layout.option_item_attribution;
372816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
373816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
374816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        @Override
375816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        protected void onSelected() {
376816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            WebDialogFragment dialog = WebDialogFragment.newInstance(
377816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    LicenseUtils.RATING_SOURCE_FILE,
378816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    mMainActivity.getString(R.string.option_attribution), TRACKER_LABEL);
379816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            mMainActivity.getOverlayManager().showDialogFragment(DIALOG_TAG, dialog, false);
380816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
381816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
382816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
383