1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.tv.parental;
18
19import android.content.Context;
20import android.media.tv.TvContentRating;
21import android.media.tv.TvContentRatingSystemInfo;
22import android.media.tv.TvInputManager;
23
24import com.android.tv.parental.ContentRatingSystem.Rating;
25import com.android.tv.parental.ContentRatingSystem.SubRating;
26
27import java.util.ArrayList;
28import java.util.List;
29
30public class ContentRatingsManager {
31    private final List<ContentRatingSystem> mContentRatingSystems = new ArrayList<>();
32
33    private final Context mContext;
34
35    public ContentRatingsManager(Context context) {
36        mContext = context;
37    }
38
39    public void update() {
40        mContentRatingSystems.clear();
41
42        TvInputManager manager =
43                (TvInputManager) mContext.getSystemService(Context.TV_INPUT_SERVICE);
44        ContentRatingsParser parser = new ContentRatingsParser(mContext);
45
46        List<TvContentRatingSystemInfo> infos = manager.getTvContentRatingSystemList();
47        for (TvContentRatingSystemInfo info : infos) {
48            List<ContentRatingSystem> list = parser.parse(info);
49            if (list != null) {
50                mContentRatingSystems.addAll(list);
51            }
52        }
53    }
54
55    /**
56     * Returns a new list of all content rating systems defined.
57     */
58    public List<ContentRatingSystem> getContentRatingSystems() {
59        return new ArrayList<>(mContentRatingSystems);
60    }
61
62    /**
63     * Returns the long name of a given content rating including descriptors (sub-ratings) that is
64     * displayed to the user. For example, "TV-PG (L, S)".
65     */
66    public String getDisplayNameForRating(TvContentRating canonicalRating) {
67        Rating rating = getRating(canonicalRating);
68        if (rating == null) {
69            return null;
70        }
71        List<SubRating> subRatings = getSubRatings(rating, canonicalRating);
72        if (!subRatings.isEmpty()) {
73            StringBuilder builder = new StringBuilder();
74            for (SubRating subRating : subRatings) {
75                builder.append(subRating.getTitle());
76                builder.append(", ");
77            }
78            return rating.getTitle() + " (" + builder.substring(0, builder.length() - 2) + ")";
79        }
80        return rating.getTitle();
81    }
82
83    private Rating getRating(TvContentRating canonicalRating) {
84        if (canonicalRating == null || mContentRatingSystems == null) {
85            return null;
86        }
87        for (ContentRatingSystem system : mContentRatingSystems) {
88            if (system.getDomain().equals(canonicalRating.getDomain())
89                    && system.getName().equals(canonicalRating.getRatingSystem())) {
90                for (Rating rating : system.getRatings()) {
91                    if (rating.getName().equals(canonicalRating.getMainRating())) {
92                        return rating;
93                    }
94                }
95            }
96        }
97        return null;
98    }
99
100    private List<SubRating> getSubRatings(Rating rating, TvContentRating canonicalRating) {
101        List<SubRating> subRatings = new ArrayList<>();
102        if (rating == null || rating.getSubRatings() == null
103                || canonicalRating == null || canonicalRating.getSubRatings() == null) {
104            return subRatings;
105        }
106        for (String subRatingString : canonicalRating.getSubRatings()) {
107            for (SubRating subRating : rating.getSubRatings()) {
108                if (subRating.getName().equals(subRatingString)) {
109                    subRatings.add(subRating);
110                    break;
111                }
112            }
113        }
114        return subRatings;
115    }
116}
117