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